一般有两种常用的方法来建立单链表:头插法与尾插法。
(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;
}
时间: 2024-10-13 00:51:18