鱼C论坛

 找回密码
 立即注册
查看: 2700|回复: 10

小甲鱼学生管理系统添加用户出现死循环

[复制链接]
发表于 2013-8-4 10:48:10 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 大西洋1912 于 2013-8-4 10:56 编辑

//添加学生部分(相关代码:24~30,94~104,129~172三处代码行),单步调试没有问题,但是一运行就出现死循环,为什么呢?是哪儿导致的死循环?
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <windows.h>
  4. struct student{
  5.     int num;
  6.     char name[20];
  7.     float score;
  8.     struct student * next;//这是整个链表的核心,用于存放下一段空间的首地址
  9. }stu;
  10. int n=0;  //结点个数
  11. int main(void){
  12.     int number; //要删除的学号
  13.     int bianhao=0;    //操作选项编号
  14.     struct student * head;  //定义头指针
  15.     struct student * creat();  //动态创建链表函数
  16.     void print(struct student * head);  //输出链表函数
  17.     struct student * del(struct student * head, int number);//删除函数
  18.     struct student * add(struct student * head);
  19.     head = creat(); //创建链表
  20.     if(head==NULL){
  21.         printf("空表!!!\n");
  22.     }else{
  23.         print(head);    //输出链表内容
  24. select:
  25.         printf("请选择操作:\n\n1、添加\t2、删除\t3、返回\t4、退出系统\n\n请选择:");
  26.         scanf("%d", &bianhao);
  27.         if( 1==bianhao ){//添加学生
  28.             head = add(head);
  29.             print(head);
  30.             goto select;
  31.         }else if( 2==bianhao ){
  32.             printf("请输入要删除的学号:");
  33.             scanf("%d", &number);
  34.             head = del(head, number);   //删除用户
  35.             if(head!=NULL){
  36.                 print(head);
  37.                 printf("\n删除成功!!!\n\n");
  38.             }else{
  39.                 system("cls");
  40.                 printf("\n表已删除!!!\n\n");//当表中内容被全部删除以后
  41.             }
  42.             goto select;
  43.         }else if( 3==bianhao ){//返回,直接显示当前结果
  44.             print(head);
  45.             goto select;
  46.         }else if( 4==bianhao ){
  47.             printf("系统已关闭!!!\n");
  48.         }else{
  49.             printf("输入错误!!!\n");
  50.             goto select;
  51.         }
  52.     }
  53.     return 0;
  54. }
  55. //动态创建空间
  56. struct student * creat(){
  57.     struct student * p1, * p2;
  58.     struct student * head;//定义头指针
  59.     head = NULL;
  60.     p1 = (struct student *)malloc(sizeof(struct student));
  61.     p2 = p1;
  62.     printf("\n-----成绩管理系统-----\n");
  63.     printf("学号:");
  64.     scanf("%d", &p1->num);
  65.     if(p1->num!=0){
  66.         printf("姓名:");
  67.         scanf("%s", &p1->name);
  68.         
  69.         printf("分数:");
  70.         scanf("%f", &p1->score);
  71.     }
  72.     while(p1->num!=0){
  73.         n+=1;
  74.         if(n==1){
  75.             head = p1;//头指针head指向第一个结点(首节点)
  76.         }else{
  77.             p2->next = p1;//将下一段空间的地址保存到上一个结点中
  78.             p2 = p1;
  79.         }
  80.         //p1指向开辟的下一段空间
  81.         p1 = (struct student *)malloc(sizeof(struct student));
  82.         printf("\n学号:");
  83.         scanf("%d", &p1->num);
  84.         if(p1->num!=0){
  85.             printf("姓名:");
  86.             scanf("%s", &p1->name);
  87.             printf("分数:");
  88.             scanf("%f", &p1->score);
  89.         }
  90.     }
  91.     p2->next = NULL;
  92.     return head;
  93. }
  94. //输出链表内容
  95. void print(struct student * head){
  96.     system("cls");
  97.     printf("学生成绩表\n\n", n);
  98.     printf("学号\t姓名\t分数\n\n");
  99.     do{
  100.         printf("%d\t%s\t%5.1f\n\n", head->num, head->name, head->score);
  101.         head = head->next;
  102.     }while(head!=NULL);
  103.     printf("目前共有%d条记录!!!\n\n", n);
  104. }
  105. //删除指定的项目
  106. struct student * del(struct student * head, int number){
  107.     struct student * p1, * p2;
  108.     if(head==NULL){
  109.         printf("对不起,不能删除空表!!!\n");
  110.         return head;
  111.     }
  112.     p1 = head;
  113.     while( number!=p1->num && p1->next!=NULL){
  114.         p2 = p1;
  115.         p1 = p1->next;
  116.     }
  117.     if(p1->num==number){
  118.         if(head==p1){
  119.             head = p1->next;
  120.         }else{
  121.             p2->next = p1->next;
  122.         }
  123.         n--;
  124.     }else{
  125.         printf("对不起没有这个学号!!!\n");
  126.     }
  127.     return head;
  128. }
  129. //添加内容的函数
  130. struct student * add(struct student * head){
  131.     struct student * p0, * p1, *p2;
  132.     p2 = p1 = head;
  133.     p0 = &stu;
  134.    
  135.     //下面为用户输入添加的数据
  136.     printf("请输入需要插入的数据:\n");
  137.     printf("学号:");
  138.     scanf("%d", &p0->num);
  139.    
  140.     if(p0->num<=0){
  141.         printf("学号输入错误!!!\n数据添加失败!!!\n");
  142.     }else{
  143.         printf("姓名:");
  144.         scanf("%s", &p0->name);
  145.         printf("成绩:");
  146.         scanf("%f", &p0->score);
  147.         printf("\n您添加的数据为:\n\n学号:%d\n姓名:%s\n成绩:%-5.2f\n\n", p0->num, p0->name, p0->score);
  148.         
  149.         if( head==NULL ){
  150.             head = p0;
  151.             p0->next = NULL;
  152.         }else{
  153.             while( p0->num>p1->num && p1->next!=NULL ){
  154.                 p2 = p1;
  155.                 p1 = p1->next;
  156.             }
  157.             if(p0->num<=p1->num){
  158.                 if(p1==head){   //头结点
  159.                     head = p0;
  160.                 }else{
  161.                     p2->next = p0;
  162.                 }
  163.                 p0->next = p1;
  164.             }else{
  165.                 p1->next = p0;
  166.                 p0->next = NULL;
  167.             }
  168.         }
  169.         n++;
  170.     }
  171.     return head;
  172. }
复制代码


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

使用道具 举报

发表于 2013-8-4 13:35:05 | 显示全部楼层
本帖最后由 565123 于 2013-8-4 13:41 编辑

没有啊??不过有一个问题,添加后再删除成空表,并且按返回,程序会出错
99行必须改成while循环,而不是do-while循环
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-4 15:43:40 | 显示全部楼层

改了以后,运行程序,先正常输入1,3号,在选择添加2和4,添加4后又陷入死循环了(只能添加一次数据,只要添加第二次就陷入死循环了),我这边添加后删除为空表后再返回没有逻辑上没有报错。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-4 21:40:34 | 显示全部楼层
{:7_158:}我当初也疑惑了。不过后来又解决了。忘记怎么弄的了。
你单步调试研究下。应该是链表最后形成死循环了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-4 23:59:00 | 显示全部楼层
Potato丶 发表于 2013-8-4 21:40
我当初也疑惑了。不过后来又解决了。忘记怎么弄的了。
你单步调试研究下。应该是链表最后形成死循 ...

F11单步调试问题就没有出现了,F10调试就出现了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-5 00:18:27 | 显示全部楼层
add函数出问题,stu是一个全局结构,不可以把地址附过去
一次添加,stu被用一次,再添加,stu的next就指向自己了,最好改成malloc,因为删除stu也会出问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-5 09:10:41 | 显示全部楼层
565123 发表于 2013-8-5 00:18
add函数出问题,stu是一个全局结构,不可以把地址附过去
一次添加,stu被用一次,再添加,stu的next就指向 ...

我半天也没看出问题,6楼这个可以作为最佳答案了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-5 09:48:56 | 显示全部楼层
head = add(head); 这里把链表给搞乱了,自己调试下吧!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-5 10:01:59 | 显示全部楼层
p0 = &stu; 问题出在这句话上,每次增加 都要 分配一个,不要用全局变量stu的地址。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-8-31 10:04:11 | 显示全部楼层
{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-21 02:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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