单链表插入输出问题

0
void insert(node *head)//新建插入数据
{
	node *p;
    node *r;
	p = r = head->next;
	while(p)
		p = p->next;
	p = (node *)malloc(sizeof(node));
	printf("请按以下格式输入信息:姓名 成绩\n");
	scanf("%s %f",p->lan.name,&p->lan.score);
	printf("姓名:%s\t成绩:%.1f\n",p->lan.name,p->lan.score);//1、输出当前输入的数据
	p->next = NULL;
	printf("\n\n\n");
	while(r)//2、输出全部数据
	{
		printf("姓名:%s\t成绩:%.1f\n",r->lan.name,r->lan.score);
		r = r->next;
	}
}

运行结果如下:

请按以下格式输入信息:姓名 成绩
linlin 45
姓名:linlin 成绩:45.0

姓名:临高思 成绩:89.0
姓名:黄江流 成绩:76.0
姓名:冯棱 成绩:92.0
Press any key to continue

问题:插入数据后马上输出是没有问题的,但是后面输出的全部数据不包括当前输入数据,为什么?有什么解决的办法?

ava
谢衡南

2020-6-14

0

错误原因:你虽然动态分配了一个新元素,但是却没有将最后一个指针指向新元素。

关于循环:

while(p)
	p = p->next;

最后一次执行时,p 的值为 NULL。但是,这时候的 p,与链表末尾元素的 ->next,没有任何关系。

所以,即便你写了 p = (node *)malloc(sizeof(node)),但是链表末尾元素的 ->next,值仍然是 NULL。

你需要做的,是修改链表末尾元素的 ->next 值,使其指向新分配的元素。

ps:从代码结构上讲,你写的 insert 很不合理。insert 应该只包含插入代码的逻辑,不应该包括输入与输出。就是说,scanf 和 printf,都不应该属于 insert。应该把 scanf 的结果传入 insert 函数,在 insert 函数执行完毕后,再执行另一个 output 函数将结果显示出来。

ava
慢羊羊

2020-6-15

0

代码不完全,鬼知道你在前面的代码里对链表做了什么

ava
无名氏

2020-6-14

尾插法加入链表数据,没了。 -  谢衡南  2020-6-14
单从这一段代码来说,有问题吗? -  谢衡南  2020-6-14
技术讨论社区