順序表(順序存儲(chǔ)結(jié)構(gòu))是什么
順序表又稱(chēng)順序存儲(chǔ)結(jié)構(gòu),是線性表的一種,專(zhuān)門(mén)存儲(chǔ)邏輯關(guān)系為“一對(duì)一”的數(shù)據(jù)。
順序表存儲(chǔ)數(shù)據(jù)的具體實(shí)現(xiàn)方案是:將數(shù)據(jù)全部存儲(chǔ)到一整塊內(nèi)存空間中,數(shù)據(jù)元素之間按照次序挨個(gè)存放。
舉個(gè)簡(jiǎn)單的例子,將 {1,2,3,4,5} 這些數(shù)據(jù)使用順序表存儲(chǔ),數(shù)據(jù)最終的存儲(chǔ)狀態(tài)如下圖所示:

順序表的建立
使用順序表存儲(chǔ)數(shù)據(jù),除了存儲(chǔ)數(shù)據(jù)本身的值以外,通常還會(huì)記錄以下兩樣數(shù)據(jù):
順序表的最大存儲(chǔ)容量:順序表最多可以存儲(chǔ)的數(shù)據(jù)個(gè)數(shù);
順序表的長(zhǎng)度:當(dāng)前順序表中存儲(chǔ)的數(shù)據(jù)個(gè)數(shù)。
C 語(yǔ)言中,可以定義一個(gè)結(jié)構(gòu)體來(lái)表示順序表:
typedef struct{
? ? int * head; //定義一個(gè)名為head的長(zhǎng)度不確定的數(shù)組,也叫“動(dòng)態(tài)數(shù)組”
? ? int length; //記錄當(dāng)前順序表的長(zhǎng)度
? ? int size; //記錄順序表的存儲(chǔ)容量
}Table;
嘗試建立一個(gè)順序表,例如:
如上所示,整個(gè)建立順序表的過(guò)程都封裝在一個(gè)函數(shù)中,建好的順序表可以存儲(chǔ) 5 個(gè)邏輯關(guān)系為“一對(duì)一”的整數(shù)。#define Size 5 //對(duì)Size進(jìn)行宏定義,表示順序表的最大容量
void initTable(Table * t) {
? ? //構(gòu)造一個(gè)空的順序表,動(dòng)態(tài)申請(qǐng)存儲(chǔ)空間
? ? t->head = (int*)malloc(Size * sizeof(int));
? ? //如果申請(qǐng)失敗,作出提示并直接退出程序
? ? if (!t->head)
? ? {
? ? ? ? printf("初始化失敗");
? ? ? ? exit(0);
? ? }
? ? //空表的長(zhǎng)度初始化為0
? ? t->length = 0;
? ? //空表的初始存儲(chǔ)空間為Size
? ? t->size = Size;
}
通常情況下,malloc() 函數(shù)都可以成功申請(qǐng)內(nèi)存空間,當(dāng)申請(qǐng)失敗時(shí),示例程序中進(jìn)行了“輸出失敗信息和強(qiáng)制程序退出”的操作,您可以根據(jù)實(shí)際需要修改代碼。
順序表的使用
通過(guò)調(diào)用 initTable() 函數(shù),就可以成功地創(chuàng)建一個(gè)順序表,還可以往順序表中存儲(chǔ)一些元素。
例如,將 {1,2,3,4,5} 存儲(chǔ)到順序表中,實(shí)現(xiàn)代碼如下:
程序運(yùn)行結(jié)果如下:#include <stdio.h>
#include <stdlib.h>
#define Size 5 //對(duì)Size進(jìn)行宏定義,表示順序表的最大容量
typedef struct{
? ? int* head;
? ? int length;
? ? int size;
}Table;
void initTable(Table * t) {
? ? //構(gòu)造一個(gè)空的順序表,動(dòng)態(tài)申請(qǐng)存儲(chǔ)空間
? ? t->head = (int*)malloc(Size * sizeof(int));
? ? //如果申請(qǐng)失敗,作出提示并直接退出程序
? ? if (!t->head)
? ? {
? ? ? ? printf("初始化失敗");
? ? ? ? exit(0);
? ? }
? ? //空表的長(zhǎng)度初始化為0
? ? t->length = 0;
? ? //空表的初始存儲(chǔ)空間為Size
? ? t->size = Size;
}
//輸出順序表中元素的函數(shù)
void displayTable(Table t) {
? ? int i;
? ? for (i = 0; i < t.length; i++) {
? ? ? ? printf("%d ", t.head[i]);
? ? }
? ? printf("\n");
}
int main() {
? ? int i;
? ? Table t = { NULL,0,0 };
? ? initTable(&t);
? ? //向順序表中添加{1,2,3,4,5}
? ? for (i = 1; i <= Size; i++) {
? ? ? ? t.head[i - 1] = i;
? ? ? ? t.length++;
? ? }
? ? printf("順序表中存儲(chǔ)的元素分別是:\n");
? ? displayTable(t);
? ? free(t.head);//釋放申請(qǐng)的堆內(nèi)存
? ? return 0;
}
順序表中存儲(chǔ)的元素分別是:
1 2 3 4 5