CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

我的c程序关于链表方面的,编译时没问题,可是运行时没有错误,请大虾指教一下!多谢!

楼主iceman09()2004-09-02 09:59:21 在 C/C++ / C语言 提问

我觉得好象是链表排序的错误!!  
   
  运行时候出现windows   运行错误!!  
   
  请看一下!!!  
  多谢!!  
   
   
  #include   <stdlib.h>  
  #include   <stdio.h>  
  #define   LEN   sizeof(struct   student)  
   
  struct   student  
  {  
          int   num;  
          char   name[20];  
          int   grade1;  
          int   grade2;  
          float   avggrade;  
          struct   student   *next;  
  };  
   
  int   n;  
   
   
  struct   student   *create(void)  
  {  
          struct   student   *head;  
          struct   student   *p1,*p2;  
          n   =   0;  
          p1   =   p2   =   (struct   student   *)malloc(LEN);  
          scanf("%d%s%d%d",&p1->num,p1->name,&p1->grade1,&p1->grade2);  
          p1->avggrade   =   (p1->grade1+p1->grade2)/2;  
          head   =   NULL;  
          while(p1->num!=0)  
          {  
                  if(n==0)  
                        head   =   p1;  
                  p2   =   p1;  
                  p1   =   (struct   student   *)malloc(LEN);  
                  scanf("%d%s%d%d",&p1->num,p1->name,&p1->grade1,&p1->grade2);  
                  p2->next   =   p1;  
                  p1->avggrade   =   (p1->grade1+p1->grade2)/2;  
                  n   =   n+1;  
          }  
          p2->next   =   NULL;  
          return   head;  
  }  
   
  void   print(struct   student   *head)  
  {  
        struct   student   *temp;  
        temp   =   head;  
        if(temp!=NULL)  
        {  
              while(temp!=NULL)  
              {  
                  printf("%d\n",temp->num);  
                  temp   =   temp->next;  
              }  
        }  
  }  
   
  //链表排序    
  struct   student   *makeSequence(struct   student   *head)  
  {  
          struct   student   stus[n];  
          struct   student   temp;  
          int   i,j;  
          for(i=0;i<n-1;i++)  
          {  
                  stus[i]   =   *head;  
                  head   =   head->next;  
          }  
          stus[n-1]   =   *head;  
          for(i=0;i<n;i++)  
          {  
                  for(j=i+1;j<n;j++)  
                  {  
                        if(stus[i].avggrade<stus[j].avggrade)  
                        {  
                              temp   =   stus[i];  
                              stus[i]   =   stus[j];  
                              stus[j]   =   temp;  
                        }  
                  }  
          }  
          head   =   &stus[0];  
          for(i=0;i<n-1;i++)  
          {  
                  stus[i].next   =   &stus[i+1];  
          }  
          stus[n-1].next   =   NULL;  
          return   head;  
  }  
   
  //插入新节点    
  struct   student   *insertNode(struct   student   *head,struct   student   *stu)  
  {  
          struct   student   *p1,*p2;  
          p1   =   head;  
              if(head==NULL)  
                  head   =   stu;  
          else  
          {  
                  while(stu->num>p1->num&&p1->next!=NULL)  
                  {  
                        p2   =   p1;  
                        p1   =   p1->next;  
                  }  
                  if(stu->num>p1->num)  
                  {  
                        if(p1==head)  
                              head   =   stu;  
                        else  
                              p2->next   =   stu;  
                              stu->next   =   p1;  
                  }  
                  else  
                  {  
                        p1->next   =   stu;  
                        stu->next   =   NULL;  
                  }  
          }  
          n++;  
          return   head;  
  }  
   
   
  int   main(void)  
  {  
          struct   student   *head;  
          struct   student   *stu;  
          head   =   create();  
          print(head);  
          printf("%d\n",n);  
           
          head   =   makeSequence(head);    
          printf("print   the   sequence   data\n");  
          print(head);  
           
          /*scanf("%d%s%d%d",&stu->num,stu->name,&stu->grade1,&stu->grade2);  
          stu->avggrade   =   (stu->grade1+stu->grade2)/2;  
          head   =   insertNode(head,stu);  
          print(head);*/  
           
          system("pause");  
  }  
  问题点数:50、回复次数:5Top

1 楼caicheng(菜菜)回复于 2004-09-02 10:47:01 得分 10

仔细检查,肯定是逻辑错误  
  编译的时候是不会查出逻辑错误的  
  大多数是因为你指针指到不该指的地方了  
  你应该拿一支笔,好好的在纸上画出来Top

2 楼blh(当你不割肉时,你的损失只是个数字,当你割肉时,你的损失就是你的肉)回复于 2004-09-02 11:37:43 得分 20

struct   student   *makeSequence(struct   student   *head)  
  {  
          struct   student   stus[n];  
          struct   student   temp;  
          int   i,j;  
          for(i=0;i<n-1;i++)  
          {  
                  stus[i]   =   *head;  
                  head   =   head->next;  
          }  
          stus[n-1]   =   *head;  
          for(i=0;i<n;i++)  
          {  
                  for(j=i+1;j<n;j++)  
                  {  
                        if(stus[i].avggrade<stus[j].avggrade)  
                        {  
                              temp   =   stus[i];  
                              stus[i]   =   stus[j];  
                              stus[j]   =   temp;  
                        }  
                  }  
          }  
          head   =   &stus[0];//   ???   local   varilble   shall   change   to   invalid   when   function   returned.  
          for(i=0;i<n-1;i++)  
          {  
                  stus[i].next   =   &stus[i+1];  
          }  
          stus[n-1].next   =   NULL;  
          return   head;  
  }  
   
  try   the   following:  
   
  struct   student   *makeSequence(struct   student   *head)  
  {  
          struct   student   *stus[n];  
          struct   student   *temp;  
          int   i,j;  
          for(i=0;i<n-1;i++)  
          {  
                  stus[i]   =   head;  
                  head   =   head->next;  
          }  
          stus[n-1]   =   head;  
          for(i=0;i<n;i++)  
          {  
                  for(j=i+1;j<n;j++)  
                  {  
                        if(stus[i]->avggrade<stus[j]->avggrade)  
                        {  
                              *temp   =   *stus[i];  
                              *stus[i]   =   *stus[j];  
                              *stus[j]   =   *temp;  
                        }  
                  }  
          }  
          head   =   stus[0];  
          for(i=0;i<n-1;i++)  
          {  
                  stus[i]->next   =   stus[i+1];  
          }  
          stus[n-1]->next   =   NULL;  
          return   head;  
  }  
   
  Top

3 楼FreeFice(庄鱼)回复于 2004-09-02 11:43:19 得分 10

链表排序的这一部分,你打算做什么呢?  
          for(i=0;i<n-1;i++)  
          {  
                  stus[i]   =   *head;  
                  head   =   head->next;  
          }  
  链表的排序没有必要由结构数组代替,可以直接运用的  
  strudent   *p,*q,*t;  
  if(p->next.avggrade   <   q->next.avggrade){  
        t=p->next;  
        p->next   =   q->next;  
        q->next   =   t;}  
   
  scanf("%d%s%d%d",&p1->num,p1->name,&p1->grade1,&p1->grade2);  
  scanf("%d%s%d%d",&(p1->num),&(p1->name),&(p1->grade1),&(p1->grade2));  
  我更习惯这种加了括号的方式  
   
          p2->next   =   NULL;  
          return   head;  
  我觉得改成:p1->next   =   NULL;         return   head;更合适  
   
  你看  
        if(temp!=NULL)这个条件判断能不能去掉Top

4 楼whyglinux(山青水秀)回复于 2004-09-02 11:48:35 得分 10

在你的链表排序程序中,   struct   student   stus[n];   中的stus   数组是一个局部数组,这个函数执行完毕后就不存在了。你应该为它动态分配内存:  
   
  struct   student*   stus   =   (struct   student*)malloc(n*sizeof(struct   student));  
   
  另外,你的排序应该在原链表的基础进行,不应该象上面那样再拷贝一份,这样做效率太差。  
   
  还有,你程序中动态分配的内存都没有释放。Top

5 楼caicheng(菜菜)回复于 2004-09-02 17:20:40 得分 0

惭愧,就我最懒惰,只给出建议Top

相关问题

  • C++编译错误问题
  • C++ Builder编译错误问题:SelectDirectory
  • C++Builder编译错误。新手求教。
  • 编译错误
  • 编译错误!!
  • 编译错误??
  • 编译错误!!
  • 编译错误???
  • 编译错误
  • 编译错误

关键词

  • 排序
  • null
  • p1
  • stus
  • avggrade
  • grade
  • struct student
  • 链表
  • head
  • makesequence

得分解答快速导航

  • 帖主:iceman09
  • caicheng
  • blh
  • FreeFice
  • whyglinux

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo