鱼C论坛

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

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

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

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

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

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

  2. void main()
  3. {
  4.         struct student                                //定义结构体结构
  5.         {
  6.                 int num;                                //学号
  7.                 int score;                                //分数
  8.                 struct student *next;        //存放下一个节点地址的指针
  9.         };
  10.         struct student *head;                //声明可以存放student结构体地址的指针
  11.         int i, k;
  12.        
  13.         for(i=0; 1; i++)
  14.         {
  15.                 printf("请输入学号: ");
  16.                 scanf("%d",&k);                        //将学号赋值给k
  17.                 if(k==0?0:1)                        //测试k是否是0
  18.                 {                                                //k为真即k不是0
  19.                         struct student stu[i];        //声明结构体student变量stu[i],i为第i次循环
  20.                         stu[i].num = k;                        //将k的值(学号)赋值给学号存放单元
  21.                         if(i == 0)                        //判断是否第1次
  22.                         {
  23.                                 head = &stu[i];        //第一次则将stu[0]的地址赋予head
  24.                                 stu[i].next = NULL;//将stu[0]的next的值赋NULL
  25.                         }
  26.                         else                                //不是第一次则说明已经存在结构体变量
  27.                         {
  28.                                 stu[i-1].next = &stu[i];//将上一个变量的next存放stu[i]的地址
  29.                                 stu[i].next = NULL;                //使next的值为NULL
  30.                         }       
  31.                 }
  32.                 else                                        //如果输入的学号是0
  33.                 {
  34.                         printf("\n");
  35.                         for( ; i; i--)                //如果i是0即第一次就输入0,则直接退出输出,i不是0则按照i的次数输出链表
  36.                         {
  37.                                 printf("学号为%d的学生成绩为%d\n",head->num,head->score);
  38.                                 head = head->next;
  39.                         }
  40.                         break;                        //i是0并第一次就输入0则退出循环,结束程序。
  41.                 }
  42.                 printf("请输入分数: ");//接受完学号,开始接受分数
  43.                 scanf("%d",&stu[i].score);
  44.         }
  45. }
复制代码
报以下错误
  1. D:\Backup\我的文档\c\0.c(20) : error C2057: expected constant expression
  2. D:\Backup\我的文档\c\0.c(20) : error C2466: cannot allocate an array of constant size 0
  3. D:\Backup\我的文档\c\0.c(20) : error C2133: 'stu' : unknown size
  4. D:\Backup\我的文档\c\0.c(44) : error C2065: 'stu' : undeclared identifier
  5. D:\Backup\我的文档\c\0.c(44) : error C2109: subscript requires array or pointer type
  6. D:\Backup\我的文档\c\0.c(44) : error C2224: left of '.score' must have struct/union type
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-4-29 23:47:39 | 显示全部楼层
我只看到了这一句错误。。。
struct student stu[i];        
声明必须是静态的,否则应该用MALLOC来动态申请空间!既
struct student *stu;
stu[i] = malloc(size....);
我是着么理解的。。。有错勿怪
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-4-30 08:24:39 | 显示全部楼层
20行, 声明数组时, 数组的大小必须是常量,不能是变量, 可以用malloc, 就像楼上说的那样。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-4-30 10:55:10 | 显示全部楼层
本帖最后由 nbceshi 于 2011-4-30 10:56 编辑

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

  2. void main()
  3. {
  4.         struct student                                //定义结构体结构
  5.         {
  6.                 int num;                                //学号
  7.                 int score;                                //分数
  8.                 struct student *next;        //存放下一个节点地址的指针
  9.         };
  10.         struct student *head;                //声明可以存放student结构体地址的指针
  11.         int i, k;
  12.         char stu = 'a';
  13.        
  14.         for(i=0; 1; i++,stu++)
  15.         {
  16.                 printf("请输入学号: ");
  17.                 scanf("%d",&k);                        //将学号赋值给k
  18.                 if(k==0?0:1)                        //测试k是否是0
  19.                 {                                                //k为真即k不是0
  20.                         struct student stu;        //声明结构体student变量stu[i],i为第i次循环
  21.                         stu.num = k;                        //将k的值(学号)赋值给学号存放单元
  22.                         if(i == 0)                        //判断是否第1次
  23.                         {
  24.                                 head = &stu;        //第一次则将stu[0]的地址赋予head
  25.                                 stu.next = NULL;//将stu[0]的next的值赋NULL
  26.                         }
  27.                         else                                //不是第一次则说明已经存在结构体变量
  28.                         {
  29.                                 (stu-1).next = &stu;//将上一个变量的next存放stu[i]的地址
  30.                                 stu.next = NULL;                //使next的值为NULL
  31.                         }       
  32.                 }
  33.                 else                                        //如果输入的学号是0
  34.                 {
  35.                         printf("\n");
  36.                         for( ; i; i--)                //如果i是0即第一次就输入0,则直接退出输出,i不是0则按照i的次数输出链表
  37.                         {
  38.                                 printf("学号为%d的学生成绩为%d\n",head->num,head->score);
  39.                                 head = head->next;
  40.                         }
  41.                         break;                        //i是0并第一次就输入0则退出循环,结束程序。
  42.                 }
  43.                 printf("请输入分数: ");//接受完学号,开始接受分数
  44.                 scanf("%d",&stu.score);
  45.         }
  46. }
复制代码
报以下错误
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行
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-4-30 13:54:49 | 显示全部楼层
错误语法(stu-1).next = &stu; stu只是结构体的变量名,你想把每组数据存在结构体中, 要不你在声明一个静态的定长的结构体数组, 你要不想定长, 就动态在。 struct student *stu;
stu[i] = malloc(size....);
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2015-12-14 16:28:39 | 显示全部楼层
:ton::ton::ton:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-21 16:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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