不含头结点
对于不含头结点
的链表,在进行初始化时,
首先为首元结点申请内存并赋值:1
2
3link *temp=(link*)malloc(sizeof(link));
temp-elem=1;
tem->next=NULL;
接着弄一个头指针指向首元结点temp:1
link *p=temp;
然后就可以遍历进行赋值了:1
2
3
4
5for(int i=2;i<5;i++){
link *a=(link*)malloc(sizeof(link));
a->elem=i;
temp->next=a;//将其连接到首元结点后面
temp=a;//准备迎接下一个结点的到来
最后返回头指针p1
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 | //不含头结点,用f遍历,返回p |
1 | //含头结点,用头指针temp遍历,返回头结点p |
1 | //不含头结点,用头结点p遍历,返回头指针temp(temp指向刚开始的头结点) |
注:一般都是用指针进行遍历,返回头结点