1. 程式人生 > >連結串列的建立頭插法和尾插法(有無頭節點)

連結串列的建立頭插法和尾插法(有無頭節點)

結構宣告

typedef int ElementType;

typedef struct Node {
    ElementType data;
    struct Node *Next;
} *List;

頭插法(有頭節點)

/* 
    建立連結串列 - 頭插法 - 有頭節點 

    +------+         +------+    +------+    +------+
    | head |   =>    |node_1| -> |node_2| -> |node_3| -> NULL
    +------+         +------+    +------+    +------+
          \           /
             +------+
             |   p  |
             +------+

*/
List HeadCreate(void) { ElementType x; // 儲存 Node 中的 data 資料 List p; // 臨時指標,用於儲存宣告的節點 List head; // 整個連結串列的頭結點; head = (List)malloc(sizeof(struct Node)); head->Next = NULL; head->data = 0; // 頭節點的 data 域用於儲存連結串列的長度 scanf("%d", &x); while (x != -1) { // 當 x 等於 -1 的時候,停止建立連結串列
p = (List)malloc(sizeof(struct Node)); p->data = x; p->Next = head->Next; head->Next = p; head->data++; // 連結串列的長度加 1 scanf("%d", &x); // 讀取下一個節點的資料 } return head; }

頭插法(無頭節點)

/*
    建立連結串列 - 頭插法 - 沒有頭節點

              +------+    +------+     +------+    +------+
              | head | -> |node_1| ->  |node_2| -> |node_3| -> NULL
       ^      +------+    +------+     +------+    +------+
       |
    +------+
    |  p   |
    +------+

*/
List HeadCreate(void) { ElementType x; // 儲存 Node 中的 data 資料 List p; List head; head = NULL; scanf("%d", &x); while (x != -1) { p = (List)malloc(sizeof(struct Node)); p->data = x; if (head == NULL) { // 若第一次建立節點,則將該點設定為頭節點 head = p; p->Next = NULL; } else { // 若不是第一次建立節點,則直接將新節點接到連結串列頭 p->Next = head; head = p; } scanf("%d", &x); } return head; }

尾插法(有頭節點)

/* 
    建立連結串列 - 尾插法 - 有頭節點

    +------+    +------+    +------+
    | head | -> |node_1| -> |node_2|   ____
    +------+    +------+    +------+      |
                                          v
                        +------+      +------+
                        | rear |  ->  |   p  |
                        +------+      +------+

*/
List TailCreate(void)
{
    ElementType x; // 儲存 Node 中的 data 資料
    List p;
    List head; // 頭結點
    List rear; // 因為尾插法需要在尾部插入,所以要有個指標來儲存尾的位置
    head = (List)malloc(sizeof(struct Node));
    head->Next = NULL;
    rear = head; // 連結串列為空,頭和尾指向同一個位置
    scanf("%d", &x);

    while (x != -1) {
        p = (List)malloc(sizeof(struct Node));
        p->data = x;
        rear->Next = p;
        rear = p;
    }
    rear->Next = NULL; // 連結串列建立結束後將最後一個節點指向 NULL
    return head;
}

尾插法(無頭節點)

/* 
    建立連結串列 - 尾插法 - 沒有頭節點 

    +------+    +------+    +------+
    |node_1| -> |node_2| -> |node_3|    ____
    +------+    +------+    +------+       |
                                           v
                            +------+    +------+
                            | rear | -> |   p  |
                            +------+    +------+

*/
List TailCreate(void)
{
    ElementType  x;
    List p;
    List head;
    List rear;
    head = NULL;
    rear = NULL;
    scanf(%d, &x);

    while (x != -1) {
        p = (List)malloc(sizeof(struct Node));
        p->data = x;
        if (head == NULL) { // 建立連結串列的第一個節點
            head = p;
            rear = p;
            p->Next = NULL;
        } else {
            rear->Next = p;
            rear = p;
        }
        scanf("%d", &x);
    }
    rear->Next = NULL; // 連結串列建立結束後將最後一個節點指向 NULL(尾插法中不要遺漏)
    return head;
}