對比單向鏈表與陣列,雙向循環鏈表在 **頻繁插入/刪除** 且需 **雙向遍歷** 的場景具備決定性優勢:
需求:維護一個按時間/編號排序的記錄集,支援:
typedef struct Node {
int id; // 記錄編號(有序鍵)
char info[100]; // 其他資訊
struct Node *prev, *next;
} Node;
Node *head = NULL; // 循環鏈表頭指標(也可設哨兵節點)
void insert_sorted(int id, const char *info) {
Node *newnode = (Node *)malloc(sizeof(Node));
newnode->id = id;
strcpy(newnode->info, info);
if (!head) { // 空表
head = newnode->prev = newnode->next = newnode;
return;
}
Node *p = head;
do {
if (p->id >= id) break; // 找到插入位置(p 之前)
p = p->next;
} while (p != head);
// 插入到 p 之前(等價於 p->prev 之後)
newnode->prev = p->prev;
newnode->next = p;
p->prev->next = newnode;
p->prev = newnode;
if (id < head->id) head = newnode; // 更新頭節點
}
void print_forward(Node *start, int n) { // 向後 n 條
Node *p = start;
for (int i = 0; i < n && p; i++) {
printf("%d: %s\n", p->id, p->info);
p = p->next;
if (p == head) break; // 循環保護
}
}
void print_backward(Node *start, int n) { // 向前 n 條
Node *p = start;
for (int i = 0; i < n && p; i++) {
printf("%d: %s\n", p->id, p->info);
p = p->prev;
if (p == head->prev) break; // 循環保護
}
}
雙向循環鏈表是「有序、動態、雙向訪問」數據集的教科書級數據結構。掌握其指標操作邏輯,不僅能完成課程設計,更能深度理解 Linux 核心 list_head、C++ STL list 等工業級實現的精髓。