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

資料結構:單向鏈表尾插法建立循環鏈表(RearCreate)

     編輯:關於C語言

單向鏈表的「尾插法」能按輸入順序建立節點,配合頭節點與尾指標,實作簡潔高效。本文提供完整 C 代碼,示範建立帶頭節點的循環單向鏈表,並包含遍歷列印功能,於 MSVC 6.0 驗證通過。

演算法思路

  1. 宣告節點指標 `p` 與計數器 `i`
  2. 初始化空鏈表 `L`
  3. 令頭節點 `next` 指向 `NULL`,建立帶頭節點單向鏈表
  4. 迴圈:
     ① 產生新節點賦值給 `p`
     ② 讀取資料存入 `p->data`
     ③ 將 `p` 插入尾節點之後,更新尾指標

完整程式碼

#include <stdio.h>
#include <stdlib.h>

#define DATATYPE char
typedef struct Node {
    DATATYPE data;
    struct Node *next;
} LINKLIST;

// 尾插法建立循環單向鏈表,輸入 "abcd1234" 回車即建立 8 個節點
LINKLIST *RearCreateLinkList() {
    LINKLIST *head, *p, *rear;
    char ch;

    head = (LINKLIST *)malloc(sizeof(LINKLIST));
    rear = head;

    puts("Please input the linklist's data: ");
    ch = getchar();
    while (ch != '\n') {
        p = (LINKLIST *)malloc(sizeof(LINKLIST));
        p->data = ch;
        rear->next = p;
        rear = p;
        ch = getchar();
    }
    rear->next = head;  // 閉合成循環
    return rear;        // 返回尾指標,便於後續操作
}

// 遍歷列印
void LinkListPrint(LINKLIST *rear) {
    LINKLIST *head = rear->next;
    LINKLIST *cur;

    if (head == rear) {
        printf("\n鏈表為空!\n");
        return;
    }

    cur = head->next;
    puts("遍歷節點:");
    while (cur != head) {
        printf("%c  ", cur->data);
        cur = cur->next;
    }
    puts("");
    getchar();  // 暫停
}

int main() {
    LINKLIST *rear = RearCreateLinkList();
    LinkListPrint(rear);
    return 0;
}

關鍵點解析

  • 頭節點:不存放有效資料,簡化插入/刪除邏輯
  • 尾指標 `rear`:始終指向最後一個資料節點,插入新節點為 O(1)
  • 循環閉合:`rear->next = head` 使尾節點指回頭節點,構成循環
  • 遍歷終止條件:`cur != head`,遇回頭節點即結束

執行畫面

執行結果

輸入 abcd1234 後,程式依序列印 a b c d 1 2 3 4,驗證尾插法順序正確。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved