nbceshi 发表于 2011-4-29 21:03:29

关于动态链表的一题有点疑惑

结构题第4节的内容,按照自己的理解先写了下,不清楚为什么会这样,感觉和结构体变量声明有关,但不知道为什么。代码如下:#include <stdio.h>

void main()
{
        struct student                                //定义结构体结构
        {
                int num;                                //学号
                int score;                                //分数
                struct student *next;        //存放下一个节点地址的指针
        };
        struct student *head;                //声明可以存放student结构体地址的指针
        int i, k;
       
        for(i=0; 1; i++)
        {
                printf("请输入学号: ");
                scanf("%d",&k);                        //将学号赋值给k
                if(k==0?0:1)                        //测试k是否是0
                {                                                //k为真即k不是0
                        struct student stu;        //声明结构体student变量stu,i为第i次循环
                        stu.num = k;                        //将k的值(学号)赋值给学号存放单元
                        if(i == 0)                        //判断是否第1次
                        {
                                head = &stu;        //第一次则将stu的地址赋予head
                                stu.next = NULL;//将stu的next的值赋NULL
                        }
                        else                                //不是第一次则说明已经存在结构体变量
                        {
                                stu.next = &stu;//将上一个变量的next存放stu的地址
                                stu.next = NULL;                //使next的值为NULL
                        }       
                }
                else                                        //如果输入的学号是0
                {
                        printf("\n");
                        for( ; i; i--)                //如果i是0即第一次就输入0,则直接退出输出,i不是0则按照i的次数输出链表
                        {
                                printf("学号为%d的学生成绩为%d\n",head->num,head->score);
                                head = head->next;
                        }
                        break;                        //i是0并第一次就输入0则退出循环,结束程序。
                }
                printf("请输入分数: ");//接受完学号,开始接受分数
                scanf("%d",&stu.score);
        }
}报以下错误D:\Backup\我的文档\c\0.c(20) : error C2057: expected constant expression
D:\Backup\我的文档\c\0.c(20) : error C2466: cannot allocate an array of constant size 0
D:\Backup\我的文档\c\0.c(20) : error C2133: 'stu' : unknown size
D:\Backup\我的文档\c\0.c(44) : error C2065: 'stu' : undeclared identifier
D:\Backup\我的文档\c\0.c(44) : error C2109: subscript requires array or pointer type
D:\Backup\我的文档\c\0.c(44) : error C2224: left of '.score' must have struct/union type

wy54072851 发表于 2011-4-29 23:47:39

我只看到了这一句错误。。。
struct student stu;      
声明必须是静态的,否则应该用MALLOC来动态申请空间!既
struct student *stu;
stu = malloc(size....);
我是着么理解的。。。有错勿怪

soldier 发表于 2011-4-30 08:24:39

20行, 声明数组时, 数组的大小必须是常量,不能是变量, 可以用malloc, 就像楼上说的那样。

nbceshi 发表于 2011-4-30 10:55:10

本帖最后由 nbceshi 于 2011-4-30 10:56 编辑

问题应该不是变量的问题,因为变量在声明的时候已经赋予一个值了,结构体大小也在声明结构体的时候定义了。应该是我想声明的是一个数组结构体单元名,编译器当成了声明一个结构体数组,我添加了一个字符变量来代替数组单元名,没这个问题了,但还有2个错误,不知道什么原因。#include <stdio.h>

void main()
{
        struct student                                //定义结构体结构
        {
                int num;                                //学号
                int score;                                //分数
                struct student *next;        //存放下一个节点地址的指针
        };
        struct student *head;                //声明可以存放student结构体地址的指针
        int i, k;
        char stu = 'a';
       
        for(i=0; 1; i++,stu++)
        {
                printf("请输入学号: ");
                scanf("%d",&k);                        //将学号赋值给k
                if(k==0?0:1)                        //测试k是否是0
                {                                                //k为真即k不是0
                        struct student stu;        //声明结构体student变量stu,i为第i次循环
                        stu.num = k;                        //将k的值(学号)赋值给学号存放单元
                        if(i == 0)                        //判断是否第1次
                        {
                                head = &stu;        //第一次则将stu的地址赋予head
                                stu.next = NULL;//将stu的next的值赋NULL
                        }
                        else                                //不是第一次则说明已经存在结构体变量
                        {
                                (stu-1).next = &stu;//将上一个变量的next存放stu的地址
                                stu.next = NULL;                //使next的值为NULL
                        }       
                }
                else                                        //如果输入的学号是0
                {
                        printf("\n");
                        for( ; i; i--)                //如果i是0即第一次就输入0,则直接退出输出,i不是0则按照i的次数输出链表
                        {
                                printf("学号为%d的学生成绩为%d\n",head->num,head->score);
                                head = head->next;
                        }
                        break;                        //i是0并第一次就输入0则退出循环,结束程序。
                }
                printf("请输入分数: ");//接受完学号,开始接受分数
                scanf("%d",&stu.score);
        }
}报以下错误
D:\Backup\我的文档\c\0.c(30) : error C2088: '-' : illegal for struct
D:\Backup\我的文档\c\0.c(45) : error C2224: left of '.score' must have struct/union type
分别在30行和45行

soldier 发表于 2011-4-30 13:54:49

错误语法(stu-1).next = &stu; stu只是结构体的变量名,你想把每组数据存在结构体中, 要不你在声明一个静态的定长的结构体数组, 你要不想定长, 就动态在。 struct student *stu;
stu = malloc(size....);

鱼C工作室.YCGZS 发表于 2015-12-14 16:28:39

:ton::ton::ton:
页: [1]
查看完整版本: 关于动态链表的一题有点疑惑