鱼C论坛

 找回密码
 立即注册
查看: 2756|回复: 5

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

[复制链接]
发表于 2011-4-29 21:03:29 | 显示全部楼层 |阅读模式

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

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

x
结构题第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[i];        //声明结构体student变量stu[i],i为第i次循环
                        stu[i].num = k;                        //将k的值(学号)赋值给学号存放单元
                        if(i == 0)                        //判断是否第1次
                        {
                                head = &stu[i];        //第一次则将stu[0]的地址赋予head
                                stu[i].next = NULL;//将stu[0]的next的值赋NULL
                        }
                        else                                //不是第一次则说明已经存在结构体变量
                        {
                                stu[i-1].next = &stu[i];//将上一个变量的next存放stu[i]的地址
                                stu[i].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[i].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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-4-29 23:47:39 | 显示全部楼层
我只看到了这一句错误。。。
struct student stu[i];        
声明必须是静态的,否则应该用MALLOC来动态申请空间!既
struct student *stu;
stu[i] = malloc(size....);
我是着么理解的。。。有错勿怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-4-30 08:24:39 | 显示全部楼层
20行, 声明数组时, 数组的大小必须是常量,不能是变量, 可以用malloc, 就像楼上说的那样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 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为第i次循环
                        stu.num = k;                        //将k的值(学号)赋值给学号存放单元
                        if(i == 0)                        //判断是否第1次
                        {
                                head = &stu;        //第一次则将stu[0]的地址赋予head
                                stu.next = NULL;//将stu[0]的next的值赋NULL
                        }
                        else                                //不是第一次则说明已经存在结构体变量
                        {
                                (stu-1).next = &stu;//将上一个变量的next存放stu[i]的地址
                                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行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-4-30 13:54:49 | 显示全部楼层
错误语法(stu-1).next = &stu; stu只是结构体的变量名,你想把每组数据存在结构体中, 要不你在声明一个静态的定长的结构体数组, 你要不想定长, 就动态在。 struct student *stu;
stu[i] = malloc(size....);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2015-12-14 16:28:39 | 显示全部楼层
:ton::ton::ton:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 16:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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