鱼C论坛

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

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

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

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

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

x
各位好心的鱼友们,麻烦帮我解决下这个问题。
编译通过,但测试出错。
#include <stdio.h>
          #include <stdlib.h>

struct student
    {
        int num;
        char name[20];
        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;
}
最佳答案
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就会每次都要多输入一个数据才会重新开始输入?
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-6-18 03:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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