鱼C论坛

 找回密码
 立即注册
查看: 1516|回复: 3

[已解决]C语言 动态链表

[复制链接]
发表于 2017-4-19 21:54:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位好心的鱼友们,麻烦帮我解决下这个问题。
编译通过,但测试出错。

  1. #include <stdio.h>
  2.           #include <stdlib.h>

  3. struct student
  4.     {
  5.         int num;
  6.         char name[20];
  7.         int score;
  8.         struct student *next;
  9.     };


  10. struct student *input(struct student *q)    /* 输入一个学生的信息,并返回节点指针 */
  11. {
  12.     printf("Please input one student's information.\n");
  13.     scanf("%d %s %d\n", &q->num, q->name, &q->score);

  14.     return q;
  15. }

  16. void print(struct student *q)    /* 打印所有学生的信息 */
  17. {
  18.     if(NULL != q)
  19.     {
  20.         printf("%d %s %d\n", q->num, q->name, q->score);
  21.         q = q->next;
  22.     }
  23. }

  24. int main()
  25. {
  26.     static int n = 0;
  27.     struct student *p1, *p2, *head = NULL;

  28.     p2 = p1 = (struct student *)malloc(sizeof(struct student));

  29.     while(0 != p1->num)    /* 如果输入的num为0,则建立链表完成 */
  30.     {
  31.         n += 1;
  32.         if(1 == n)
  33.         {
  34.             head = p1;
  35.         }
  36.         else
  37.         {
  38.             p2->next = p1;
  39.         }
  40.         p2 = p1;    /* 把p2移到表尾 */
  41.         p1 = (struct student *)malloc(sizeof(struct student));
  42.         p1 = input(p1);
  43.     }
  44.     print(head);
  45.     printf("Hello world!\n");
  46.     return 0;
  47. }
复制代码
最佳答案
2017-4-19 23:25:48
1.scanf("%d %s %d\n", &q->num, q->name, &q->score);最好把最后的\n去掉不然每次都要多输一个数据才会重新开始输入,而且每次必须输入满3个数据才能返回,这块可以自己改良下
2.你每次分配内存后都没有将next指针指向NULL
3.你n==1的时候你的p1指针指向的是一个没有赋值的结构体,等到变成2的时候 p1指针才指向一个赋值完的结构体,所以此时head指向的next必定是野指针,就是什么都没有指,当访问到的时候,建议每次赋值先把next指向NULL,n++放到赋值之后好一点,还有其他问题你自己思考下
有问题可以继续提问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-19 23:25:48 | 显示全部楼层    本楼为最佳答案   
1.scanf("%d %s %d\n", &q->num, q->name, &q->score);最好把最后的\n去掉不然每次都要多输一个数据才会重新开始输入,而且每次必须输入满3个数据才能返回,这块可以自己改良下
2.你每次分配内存后都没有将next指针指向NULL
3.你n==1的时候你的p1指针指向的是一个没有赋值的结构体,等到变成2的时候 p1指针才指向一个赋值完的结构体,所以此时head指向的next必定是野指针,就是什么都没有指,当访问到的时候,建议每次赋值先把next指向NULL,n++放到赋值之后好一点,还有其他问题你自己思考下
有问题可以继续提问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-20 18:15:30 | 显示全部楼层
lumber2388779 发表于 2017-4-19 23:25
1.scanf("%d %s %d\n", &q->num, q->name, &q->score);最好把最后的\n去掉不然每次都要多输一个数据才会重 ...

谢谢您的指点!问题已解决。
想问问,为什么这里不去掉\n就会每次都要多输入一个数据才会重新开始输入?
  1. scanf("%d %s %d\n", &q->num, q->name, &q->score);
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-20 19:37:40 | 显示全部楼层
GSMNC 发表于 2017-4-20 18:15
谢谢您的指点!问题已解决。
想问问,为什么这里不去掉\n就会每次都要多输入一个数据才会重新开始输入? ...

因为scanf函数调用时,需要跟""中格式是一样的,包括括号以及\n都要按这个格式输入,但是回车默认是不会作为输入的内容对变量进行格式化的,这样就会导致无法输入\n,scanf会将\n也当做一个输入的数据进行处理,具体实际怎么处理这个\n我也不是很清楚,这个只是我个人理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 00:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表