靜態鏈表用數組模擬鏈表,結構體包含 data 和 cur(游標/下標)。本文實現帶剩余空間判斷的完整操作集:初始化、插入、刪除、求長、遍歷顯示,並附帶交互式測試主程序。
#define MAXSIZE 7
typedef int ElemType;
typedef struct {
ElemType data;
int cur; // 下一個節點下標,0 表示空
} StaticList;
StaticList L[MAXSIZE];
L[0].cur:備用鏈表頭,指向第一個空閒下標。L[MAXSIZE-1].cur:數據鏈表頭,指向第一個有效數據下標。1 ~ MAXSIZE-2。void InitList(StaticList *space) {
for (int i = 0; i < MAXSIZE-1; i++) {
space[i].data = 0;
space[i].cur = i+1; // 串聯備用鏈表
}
space[MAXSIZE-1].cur = 0; // 數據鏈表為空
space[MAXSIZE-1].data = 0;
}
Malloc_SLint Malloc_SL(StaticList *space) {
int i = space[0].cur; // 取第一個空閒
if (space[0].cur) space[0].cur = space[i].cur; // 從備用鏈摘除
return i; // 返回下標,0 表示滿
}
Free_SLvoid Free_SL(StaticList *space, int k) {
space[k].cur = space[0].cur; // 插入備用鏈表頭
space[0].cur = k;
}
ListInsert(L, i, e)1 <= i <= ListLength(L)+1。ListLength(L) >= MAXSIZE-2 則滿。cur 指向新節點,新節點 cur 指向原後繼。ListDelete(L, i)1 <= i <= ListLength(L)。cur 跳過被刪節點,釋放節點歸還備用鏈。show(L)打印數組下標、data、cur 三行,再按鏈表順序輸出 data->data->^ 形式。
int main() {
StaticList L[MAXSIZE];
InitList(L);
int choice, x, pos;
while (1) {
printf("1:插入 2:刪除 3:輸出 0:退出\n");
scanf("%d", &choice);
if (choice == 0) break;
switch (choice) {
case 1:
printf("輸入要插入的數字和位置\n");
scanf("%d %d", &x, &pos);
ListInsert(L, pos, x);
break;
case 2:
printf("輸入要刪除的位置\n");
scanf("%d", &pos);
ListDelete(L, pos);
break;
case 3:
show(L);
break;
}
}
return 0;
}
| 特性 | 動態鏈表 | 靜態鏈表 |
|---|---|---|
| 內存分配 | malloc/free 頻繁調用 | 數組預分配,O(1) 分配釋放 |
| 空間檢測 | malloc 失敗才知 | Malloc_SL 返回 0 即滿 |
| 適用場景 | 長度不確定、頻繁增刪 | 嵌入式、長度有上限、實時系統 |
靜態鏈表通過「游標代替指針」「備用鏈管理空閒節點」巧妙規避動態內存分配,是嵌入式開發和數據結構教學中的經典結構。本文代碼完整可運行,涵蓋所有基礎操作,適合作為模板參考。