本文提供一個功能完備、代碼規範的單向循環鏈表 C 實現,含頭結點,尾結點 next 指向頭結點。涵蓋初始化、銷毀、清空、判空、長度、按位查找、按值定位、前驅/後繼查找、插入、刪除、尾插建表、遍歷顯示等 14 個核心操作,並附帶完整測試主程序。
typedef struct Node { int data; struct Node* next; } Node, *LinkList;
int Length_SCL(LinkList L) { // 以頭結點為參考,遍歷計數
int len = 0; LinkList p = L;
while (p->next != L) { len++; p = p->next; }
return len;
}
position-1 個結點 p,新結點 s->next = p->next; p->next = s;。position-1 個結點 p,temp = p->next; p->next = temp->next; free(temp);。p、q 同步前進,q 為 p 的前驅。tail 指針,新結點 next 指向頭結點,tail->next = s; tail = s;。int main() {
LinkList L; InitialList(&L);
TailCreate_SCL(&L, 3); Display_SCL(L); // 建表、顯示
ClearList(&L); // 清空
TailCreate_SCL(&L, 5); // 重建
GetElement_SCL(L, 4); GetElement_SCL(L, 6); // 合法/非法位置查找
ElementLocate_SCL(L, 1); ElementLocate_SCL(L, 9); // 存在/不存在值定位
PriorElement_SCL(L, 1); PriorElement_SCL(L, 5); // 首元/中間元前驅
NextElement_SCL(L, 5); NextElement_SCL(L, 17); // 尾元/不存在值後繼
InsertList_SCL(&L, 2, 888); Display_SCL(L); // 中間插入
InsertList_SCL(&L, 1, 666); Display_SCL(L); // 首元插入
InsertList_SCL(&L, 8, 999); Display_SCL(L); // 尾後插入(合法位置 length+1)
DeleteList_SCL(&L, 5); Display_SCL(L); // 中間刪除
DeleteList_SCL(&L, 1); Display_SCL(L); // 首元刪除
}
測試輸出驗證了所有邊界條件:空表操作、首尾操作、越界保護、環狀結構完整性(Display_SCL_1 驗證無 NULL 斷裂)。
printf 錯誤信息並返回,不調用 exit() 破壞調用者流程。malloc 檢查失敗、free 及時、刪除後指針斷開。LinkList*(二級指針),查詢操作接受 LinkList。此實現可作為教學參考或項目基礎組件。理解「頭結點哨兵簡化邊界處理」、「尾結點指向頭結點形成環」兩大設計決策,是掌握循環鏈表的關鍵。