GSMNC 发表于 2017-4-19 21:54:24

C语言 动态链表

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

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

struct student
    {
      int num;
      char name;
      int score;
      struct student *next;
    };


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

    return q;
}

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

int main()
{
    static int n = 0;
    struct student *p1, *p2, *head = NULL;

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

    while(0 != p1->num)    /* 如果输入的num为0,则建立链表完成 */
    {
      n += 1;
      if(1 == n)
      {
            head = p1;
      }
      else
      {
            p2->next = p1;
      }
      p2 = p1;    /* 把p2移到表尾 */
      p1 = (struct student *)malloc(sizeof(struct student));
      p1 = input(p1);
    }
    print(head);
    printf("Hello world!\n");
    return 0;
}

lumber2388779 发表于 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++放到赋值之后好一点,还有其他问题你自己思考下
有问题可以继续提问

GSMNC 发表于 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就会每次都要多输入一个数据才会重新开始输入?
scanf("%d %s %d\n", &q->num, q->name, &q->score);

lumber2388779 发表于 2017-4-20 19:37:40

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

因为scanf函数调用时,需要跟""中格式是一样的,包括括号以及\n都要按这个格式输入,但是回车默认是不会作为输入的内容对变量进行格式化的,这样就会导致无法输入\n,scanf会将\n也当做一个输入的数据进行处理,具体实际怎么处理这个\n我也不是很清楚,这个只是我个人理解
页: [1]
查看完整版本: C语言 动态链表