作者:解学武
链表的创建,尾插法创建单链表(带源码+解析)
尾插法创建单链表,即每次都将新的结点链接到链表的最后一个结点的后面,从而达到创建单链表的过程。
例如,使用尾插法将数据 {1,2,3,4} 用单链表的形式进行存储,其存储过程如下图所示:
声明:当前文章为本站“玩转C语言和数据结构”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
例如,使用尾插法将数据 {1,2,3,4} 用单链表的形式进行存储,其存储过程如下图所示:

提示:图中所示的单链表没有设置头结点,如链表中需要设置头结点,则只需在每个链表前添加一个空结点即可。
实现代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Link {
int elem;
struct Link *next;
}link;
//无头结点链表的尾插法实现函数
link * creatLink(int * arc, int length) {
int i;
//最初状态下,头指针 H 没有任何结点,所以,插入第一个元素,就相当于是创建结点 H
link * H =(link*)malloc(sizeof(link));
H->elem = arc[0];
H->next = NULL;
link * temp=H;
//如果采用尾插法插入超过 1 个元素,则需添加到链表表尾
for (i = 1; i<length; i++) {
//创建新结点并对其进行初始化
link * a = (link*)malloc(sizeof(link));
a->elem = arc[i];
a->next = NULL;
//将新结点添加到链表的尾部
temp->next = a;
//循环过程中,temp时刻指向链表中的最后一个结点
temp = temp->next;
}
return H;
}
//有头结点链表的尾插法实现函数
link * HcreatLink(int * arc, int length) {
int i;
//创建头结点 H,其链表的头指针也是 H
link * H = (link*)malloc(sizeof(link));
H->elem = 0;
H->next = NULL;
//设置一个指针,在遍历链表时用
link * temp = H;
//采用尾插法创建链表
for (i = 0; i<length; i++) {
//创建新结点并对其进行初始化
link * a = (link*)malloc(sizeof(link));
a->elem = arc[i];
a->next = NULL;
//将新结点链接到链表的表尾
temp->next = a;
//循环过程中,temp始终指向链表表尾的结点
temp = temp->next;
}
return H;
}
//链表的输出函数
void display(link *p) {
while (p) {
printf("%d ", p->elem);
p = p->next;
}
printf("\n");
}
int main() {
int a[4] = { 1,2,3,4};
//采用尾插法创建无头结点链表
link * H = creatLink(a, 4);
display(H);
//采用尾插法创建有头结点链表
link * head = HcreatLink(a, 4);
display(head);
//使用完毕后,释放即可
free(H);
free(head);
return 0;
}
运行结果:
1 2 3 4
0 1 2 3 4
0 1 2 3 4
提示:首元素为 0 ,即表示链表中带有头结点。
声明:当前文章为本站“玩转C语言和数据结构”官方原创,由国家机构和地方版权局所签发的权威证书所保护。

ICP备案: