单链表创建且遍历之带头结点与不带头结点

初学单链表碰到一个小坑:下面代码是一个很简单的创建并遍历链表的过程。

#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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信仿真爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值