ch2-线性表-链表及其初始化_有头结点和无头结点的初始化过程的区别

不含头结点

对于不含头结点的链表,在进行初始化时,

首先为首元结点申请内存并赋值:

1
2
3
link *temp=(link*)malloc(sizeof(link));
temp-elem=1;
tem->next=NULL;

接着弄一个头指针指向首元结点temp:

1
link *p=temp;

然后就可以遍历进行赋值了:

1
2
3
4
5
for(int i=2;i<5;i++){
link *a=(link*)malloc(sizeof(link));
a->elem=i;
temp->next=a;//将其连接到首元结点后面
temp=a;//准备迎接下一个结点的到来

最后返回头指针p

1
return p;

此时的p后面已经串好了许多结点,这样就完成了不含头结点的链表的初始化.

含头结点

与上面(不含头结点)的区别如下:
1.刚开始只需为头结点申请一片内存即可,无需赋值,因为头结点不存储元素的信息

2.创建的头指针指向头结点,不指向首元结点

3.在展示初始化之后的元素(即display函数)时,从第二个位置开始打印元素的elem值,而不是像不含头结点的时候从第一个位置开始打印元素的elem值

不管含有头结点还是不含头结点,定义的头指针总是指向链表中第一个位置处的结点

在进行遍历时可以用头指针进行,也可以用头结点开始进行,因为头指针指向头结点,所以,下面的方法都是可以的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//不含头结点,用p遍历,返回f
link * initLink(){

link * f = (link*)malloc(sizeof(link));//创建首元节点
//首元节点先初始化
f->elem = 1;
f->next = NULL;
link *p = f;//头指针指向首元节点
for (int i=2; i<5; i++) {
link *temp=(link*)malloc(sizeof(link));
temp->elem=i;
temp->next=NULL;
p->next=temp;
p=temp;
}
return f;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//不含头结点,用f遍历,返回p
link * initLink(){
link * f = (link*)malloc(sizeof(link));//创建首元节点
//首元节点先初始化
f->elem = 1;
f->next = NULL;
link *p = f;//头指针指向首元节点
for (int i=2; i<5; i++) {
link *temp=(link*)malloc(sizeof(link));
temp->elem=i;
temp->next=NULL;
f->next=temp;
f=temp;
}
return p;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//含头结点,用头指针temp遍历,返回头结点p
link *initLink(){
//先搞个头结点粗来
link *p=(link*)malloc(sizeof(link));
//再弄个工作指针,初始指向头结点p
link *temp=p;
for(int i=1;i<5;++i){
//想初始化,得有原料,那就是一个一个的节点,现在还没有节点,那先搞一个粗来
link *a=(link*)malloc(sizeof(link));
//光有空壳不够,该赋值了(对link结构体中的elem赋值)
a->elem=i;
//有了原料节点,就用一根绳子把它们串起来(对link结构体中的next指针赋地址值)
temp->next=a;//串起来啦
temp=a;//工作指针temp后移,准备迎接下一个节点的到来
}
printf("\n");//为了颜值和正义而生
//串完之后,原来的头结点p身后就有了一大堆节点
return p;//return试试看
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//不含头结点,用头结点p遍历,返回头指针temp(temp指向刚开始的头结点)
link *initLink(){
//先搞个头结点粗来
link *p=(link*)malloc(sizeof(link));
//再弄个工作指针,初始指向头结点p
link *temp=p;
for(int i=1;i<5;++i){
//想初始化,得有原料,那就是一个一个的节点,现在还没有节点,那先搞一个粗来
link *a=(link*)malloc(sizeof(link));
//光有空壳不够,该赋值了(对link结构体中的elem赋值)
a->elem=i;
//有了原料节点,就用一根绳子把它们串起来(对link结构体中的next指针赋地址值)
p->next=a;//串起来啦
p=a;//工作指针temp后移,准备迎接下一个节点的到来
}
printf("\n");//为了颜值和正义而生
//串完之后,原来的头结点p身后就有了一大堆节点
return temp;//return试试看
}

注:一般都是用指针进行遍历,返回头结点

凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条