初学单链表碰到一个小坑:下面代码是一个很简单的创建并遍历链表的过程。
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct student{
int score;//数据域;
struct student *next;//指针域;
}Linklist;
Linklist *creat(int n)//创建链表 ,为指针函数,返回的是一个指针
{
Linklist *head,*node,*end; //定义三个结构体指针
head=(Linklist*)malloc(sizeof(Linklist));//为头节点开辟内存空间
end=head; //刚开始时头节点同时也是尾节点
for(int i=0;i<n;i++)
{
node=(Linklist*)malloc(sizeof(Linklist));//为每次新插入的节点分配内存空间;
scanf("%d",&node->score); //新节点数据域进行赋值
end->next=node; //尾插法:尾节点中的指针指向新插入的node
end=node; //尾插法:把插入的node节点变为尾节点!
}
end->next=NULL; //循环结束后,尾节点中的指针指向空
return head;
}
void link_print(Linklist *list){
Linklist *p = list; //定义一个临时指针p,刚开始时与头指针一样,都指向的是头节点;
while(p!=NULL){
printf("%d\n",p->score);
p = p->next;
}
}
int main(){
Linklist *head;
int n = 4;
head = creat(n);
link_print(head);
}
程序输出:
纠结了一会这个遍历结果怎么会有“0”输出,后来发现原因在于创建的是带头结点的单链表,头结点里的数值默认为NULL,打印出来就是0,而我在遍历的过程中,是直接从头结点开始遍历的,故输出结果不符合预期。
修改后遍历的函数:
void link_print(Linklist *list){
Linklist *p = list; //定义一个临时指针p,刚开始时与头指针一样,都指向的是头节点;
while(p->next != NULL){
p = p->next;//换了一下顺序
printf("%d\n",p->score);
}
}
之后程序输出没问题,我真是stupid!