鱼C论坛

 找回密码
 立即注册
查看: 4704|回复: 13

while不能read结构体中的int变量

[复制链接]
发表于 2013-6-5 18:31:34 | 显示全部楼层 |阅读模式
30鱼币
直接上代码第一个是没有报错的  可以自行编译
第二个是我一开始犯的错误.......
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>

  4. #define LEN sizeof(struct student)  // student结构的大小

  5. struct student *creat();            //创建链表
  6. void print(struct student *head);   //打印链表
  7. int n;//定义这个是第几个学生


  8. struct student{
  9.     int num;
  10.     float score;
  11.     struct student *next;
  12. };//链表结构


  13. void main(){//首先定义一个可以让函数调用的变量,然后调用创建,之后打印出来
  14.     struct student *p;//指向我们自己创建的头
  15.    
  16.     p=creat();
  17.     print(p);
  18.     printf("\n\n");
  19.     system("pause");
  20. }

  21. struct student *creat(){
  22.     struct student *head;//最后返回的是head
  23.     struct student *p1,*p2;//这个是两个小精灵似的东西来回跑和定义
  24.    

  25.     p1 =(struct student *)malloc(LEN);//malloc是在内存创建len长度的空间

  26.     printf("one num:");
  27.     scanf("%d",&p1->num);
  28.     printf("one score");
  29.     scanf("%f",&p1->score);


  30.     p2=p1;
  31.     head=NULL;
  32.     n=0;

  33.     while (p1->num!=0){
  34.         n++;
  35.         if (n==1){
  36.             head=p1;
  37.         }
  38.         else{
  39.             p2->next=p1;
  40.         }
  41.         p2=p1;
  42.         p1=(struct student *) malloc(LEN);
  43.         
  44.         printf("\nshu ru num:");
  45.         scanf("%d",&p1->num);
  46.         printf("shu ru score:");
  47.         scanf("%f",&p1->score);
  48.     }
  49.     p2->next = NULL;
  50.     return head;
  51. }




  52. void print(struct student *head){
  53.     struct student *p;
  54.     p=head;
  55.     printf("%d个\n",n);
  56.     if (NULL!=head){
  57.         do{
  58.             printf("%d号学生是%f分\n",p->num,p->score);
  59.             p=p->next;
  60.         }while(p!=NULL);//NULL != p      别这样0!=p->num  OTZ!!!
  61.     }
  62. }
复制代码
主要就是最后的那个东西  最后的那个print  我注释起来了

第二个 我郁闷!!!
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>

  4. #define LEN sizeof(struct student)  // student结构的大小

  5. struct student *creat();            //创建链表
  6. void print(struct student *head);   //打印链表
  7. int n;//定义这个是第几个学生


  8. struct student{
  9.     int num;
  10.     float score;
  11.     struct student *next;
  12. };//链表结构


  13. void main(){//首先定义一个可以让函数调用的变量,然后调用创建,之后打印出来
  14.     struct student *p;//指向我们自己创建的头
  15.    
  16.     p=creat();
  17.     print(p);
  18.     printf("\n\n");
  19.     system("pause");
  20. }

  21. struct student *creat(){
  22.     struct student *head;//最后返回的是head
  23.     struct student *p1,*p2;//这个是两个小精灵似的东西来回跑和定义
  24.    

  25.     p1 =(struct student *)malloc(LEN);//malloc是在内存创建len长度的空间

  26.     printf("one num:");
  27.     scanf("%d",&p1->num);
  28.     printf("one score");
  29.     scanf("%f",&p1->score);


  30.     p2=p1;
  31.     head=NULL;
  32.     n=0;

  33.     while (p1->num!=0){
  34.         n++;
  35.         if (n==1){
  36.             head=p1;
  37.         }
  38.         else{
  39.             p2->next=p1;
  40.         }
  41.         p2=p1;
  42.         p1=(struct student *) malloc(LEN);
  43.         
  44.         printf("\nshu ru num:");
  45.         scanf("%d",&p1->num);
  46.         printf("shu ru score:");
  47.         scanf("%f",&p1->score);
  48.     }
  49.     p2->next = NULL;
  50.     return head;
  51. }




  52. void print(struct student *head){
  53.     struct student *p;
  54.     p=head;
  55.     printf("%d个\n",n);
  56.     if (NULL!=head){
  57.         do{
  58.             printf("%d号学生是%f分\n",p->num,p->score);
  59.             p=p->next;
  60.         }while(0!=p->num);//NULL != p      别这样0!=p->num  OTZ!!!
  61.     }
  62. }
复制代码




最佳答案

查看完整内容

大哥,当然不一样了,p->num是结构里面的值。地址是一样,但是地址是这样表示的:&(p->num) 所以你要改成这样也是可以的: 0!=&(p->num),不过不推荐这样
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-5 18:31:35 | 显示全部楼层

大哥,当然不一样了,p->num是结构里面的值。地址是一样,但是地址是这样表示的:&(p->num)
所以你要改成这样也是可以的: 0!=&(p->num),不过不推荐这样
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-5 19:37:51 | 显示全部楼层
就是 print 循环比较时应该比较p本身。
  1. void print(struct student *head){
  2.         struct student *p;
  3.         p=head;
  4.         printf("%d个\n",n);
  5.         while (NULL!=p)
  6.         {
  7.                 printf("%d号学生是%f分\n",p->num,p->score);
  8.                 p=p->next;
  9.         }
  10. }
复制代码
运行结果:
3.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-5 22:54:19 | 显示全部楼层
二楼说的对~~!while(0!=p->num)条件,最后一个学生的信息应该没被打印输出~~!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-6 00:33:58 | 显示全部楼层
学习学习。。。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-6 07:59:58 | 显示全部楼层
小新110 发表于 2013-6-5 19:37
就是 print 循环比较时应该比较p本身。
运行结果:

为什么不能比较里面的值?  他们的地址不都一样吗?  说是不能读取
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-6 09:19:57 | 显示全部楼层
西瓜异族 发表于 2013-6-6 07:59
为什么不能比较里面的值?  他们的地址不都一样吗?  说是不能读取

比较值是可以的,但是p不存在的时候你取值是会报错滴
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-6 12:20:26 | 显示全部楼层
强烈支持楼主。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-6 12:37:26 | 显示全部楼层
好吧,有道理
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-6 12:44:01 | 显示全部楼层
这是神马,,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-6 19:16:26 | 显示全部楼层
小新110 发表于 2013-6-6 09:19
比较值是可以的,但是p不存在的时候你取值是会报错滴

NULL != p      
0!=p->num   
这两个不一样?这个p的首地址和p->num 应该是一样的吧?  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-6 21:16:59 | 显示全部楼层
西瓜异族 发表于 2013-6-6 19:16
NULL != p      
0!=p->num   
这两个不一样?这个p的首地址和p->num 应该是一样的吧?

不能用0!=p->num这个的原因:
在你插入的时候,看回代码吧:
while (p1->num!=0){
        n++;
        if (n==1){
            head=p1;
        }
        else{
            p2->next=p1;
        }
        p2=p1;
        p1=(struct student *) malloc(LEN);
        
        printf("\nshu ru num:");
        scanf("%d",&p1->num);
        printf("shu ru score:");
        scanf("%f",&p1->score);
    }
    p2->next = NULL;
主要是这里,我给你做做实验你应该明白的
我随便插三个数

先p1申请空间A
一开始插 5号3分 (这个没有进while循环前) 把5和3输入到p1指向的空间A

while里面第一次   
p2,head都指向的是空间A  p1指向新的空间B
第二个插 2号2分 插入到空间B里面  

while里面第二次
p2->next 指向空间B(就是空间A里边的尾指针指向空间B),接着p1指向新的空间C
第三次插入 0号的话

循环跳出   是p2->next 指向空 (就是空间B里面的指针指向空)
结果是                 A  ---------->     B  ----------->           NULL
                           n:5    s:3         n:2    s:2              没有
接着是打印那里
如果用     NULL != p     做判断肯定没有问题,因为空间B后面的指针时指向空
可是如果  0!=p->num   当为空的时候,没有空间给它,而运行的话就会出错,原因是里面没有你要的东西
就跟指针指向null的时候,你如果给指针指向的东西赋值会报错一样,用到非法的空间去了。
我也是学习学习,不知道说的对不对,希望对你有帮助吧,希望一起进步{:7_155:}

评分

参与人数 1鱼币 +3 收起 理由
西瓜异族 + 3 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-7 10:57:58 | 显示全部楼层
你没把指针搞清楚啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-8 14:33:21 | 显示全部楼层
学习学习。。。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-26 14:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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