首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C 語言循環鏈表建立:尾插法完整實現

     編輯:C++ 入門

循環鏈表概念

循環鏈表與單鏈表類似,差別在於最後一個節點的 next 指向頭節點而非 NULL。尾插法維護 tail 指針,每次在尾部插入新節點並更新 tail,最後閉環。

節點定義與建立函數

typedef struct clist {
    int data;
    struct clist *next;
} cnode, *clink;

clink create_clist(int *array, int len) {
    if (len == 0) return NULL;
    clink head = (clink)malloc(sizeof(cnode));
    if (!head) return NULL;
    head->data = array[0];
    head->next = NULL;
    clink tail = head;

    for (int i = 1; i < len; ++i) {
        clink new_node = (clink)malloc(sizeof(cnode));
        if (!new_node) return NULL; // 實際應釋放已分配節點
        new_node->data = array[i];
        new_node->next = NULL;
        tail->next = new_node;
        tail = new_node;
    }
    tail->next = head; // 形成環
    return head;
}

遍歷與釋放

void print_clist(clink head) {
    if (!head) return;
    clink p = head;
    do {
        printf("%d ", p->data);
        p = p->next;
    } while (p != head);
    puts("");
}

void free_clist(clink head) {
    if (!head) return;
    clink p = head->next;
    while (p != head) {
        clink tmp = p;
        p = p->next;
        free(tmp);
    }
    free(head);
}

主程式測試

int main() {
    int arr[] = {9, 7, 3, 4, 5, 6};
    clink head = create_clist(arr, 6);
    if (!head) { puts("記憶體分配失敗"); return 1; }
    print_clist(head); // 輸出:9 7 3 4 5 6
    free_clist(head);
    return 0;
}

關鍵點總結

  • 尾插法需維護 tail 指針,避免每次遍歷到尾部(O(n²) → O(n))。
  • 建立環的關鍵:tail->next = head。
  • 遍歷條件:do-while(p != head) 確保至少執行一次並正確停止。
  • 記憶體釋放需打破環,避免無限迴圈。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved