給定陣列,建立(帶頭節點)的單鏈表(頭插法、尾插法)
阿新 • • 發佈:2019-01-06
一般有兩種常用的方法來建立單鏈表:頭插法與尾插法。
(1)頭插法:每次將新申請的節點插在頭節點的後面;
簡單來說,就是把新加進的元素放在表頭後的第一個位置:
首先,讓新節點的next指向頭節點之後;然後,讓表頭的next指向新節點。
(2)尾插法:每次將新申請的節點插在終端節點的後面。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
} NODE;
// 尾插法建立單鏈表(帶頭節點)
NODE *createEnd (int arr[], int len)
{
NODE *head = (NODE *)malloc(sizeof(NODE)); // 生成頭節點
head->next = NULL;
NODE *end = head; // 尾指標初始化
for (int i = 0; i < len; i++) {
NODE *p = (NODE *)malloc(sizeof(NODE)); // 為每個陣列元素建立一個節點
p->data = arr[i];
end->next = p; // 將節點p插入到終端節點之後
end = p;
}
end->next = NULL; // 單鏈表建立完畢,將終端節點的指標域置空
return head;
}
// 頭插法建立單鏈表(帶頭節點)
NODE *createHead(int arr[],int len)
{
NODE *head = (NODE *)malloc(sizeof(NODE)); // 初始化一個空連結串列
head->next = NULL;
for (int i = len-1; i >= 0; i--) {
NODE *p = (NODE *)malloc(sizeof(NODE));
p->data = arr[i];
// 插入第一個節點時,p->next指向head->next,此時為NULL,恰好作為尾節點;
p->next = head->next; // 讓新節點的next指向頭節點之後
head->next = p; // 讓表頭的next指向新節點
}
return head;
}
// 單鏈表列印
void print(NODE *head)
{
if (head == NULL) return;
NODE *p = head->next;
while (p != NULL) {
printf("%d\n", p->data);
p = p->next;
}
}
int main(void)
{
int arr[] = {1,2,3,4,5,6,7};
int len = sizeof(arr)/sizeof(int);
NODE *head1 = createEnd(arr, len);
NODE *head2 = createHead(arr, len);
print(head1);
print(head2);
return 0;
}