連結串列的建立頭插法和尾插法(有無頭節點)
阿新 • • 發佈:2019-01-02
結構宣告
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;
}