鱼C论坛

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

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

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

//添加学生部分(相关代码:24~30,94~104,129~172三处代码行),单步调试没有问题,但是一运行就出现死循环,为什么呢?是哪儿导致的死循环?
#include <stdio.h>
#include <malloc.h>
#include <windows.h>
struct student{
    int num;
    char name[20];
    float score;
    struct student * next;//这是整个链表的核心,用于存放下一段空间的首地址
}stu;
int n=0;  //结点个数
int main(void){
    int number; //要删除的学号
    int bianhao=0;    //操作选项编号
    struct student * head;  //定义头指针
    struct student * creat();  //动态创建链表函数
    void print(struct student * head);  //输出链表函数
    struct student * del(struct student * head, int number);//删除函数
    struct student * add(struct student * head);
    head = creat(); //创建链表
    if(head==NULL){
        printf("空表!!!\n");
    }else{
        print(head);    //输出链表内容
select:
        printf("请选择操作:\n\n1、添加\t2、删除\t3、返回\t4、退出系统\n\n请选择:");
        scanf("%d", &bianhao);
        if( 1==bianhao ){//添加学生
            head = add(head);
            print(head);
            goto select;
        }else if( 2==bianhao ){
            printf("请输入要删除的学号:");
            scanf("%d", &number);
            head = del(head, number);   //删除用户
            if(head!=NULL){
                print(head);
                printf("\n删除成功!!!\n\n");
            }else{
                system("cls");
                printf("\n表已删除!!!\n\n");//当表中内容被全部删除以后
            }
            goto select;
        }else if( 3==bianhao ){//返回,直接显示当前结果
            print(head);
            goto select;
        }else if( 4==bianhao ){
            printf("系统已关闭!!!\n");
        }else{
            printf("输入错误!!!\n");
            goto select;
        }
    }
    return 0;
}
//动态创建空间
struct student * creat(){
    struct student * p1, * p2;
    struct student * head;//定义头指针
    head = NULL;
    p1 = (struct student *)malloc(sizeof(struct student));
    p2 = p1;
    printf("\n-----成绩管理系统-----\n");
    printf("学号:");
    scanf("%d", &p1->num);
    if(p1->num!=0){
        printf("姓名:");
        scanf("%s", &p1->name);
        
        printf("分数:");
        scanf("%f", &p1->score);
    }
    while(p1->num!=0){
        n+=1;
        if(n==1){
            head = p1;//头指针head指向第一个结点(首节点)
        }else{
            p2->next = p1;//将下一段空间的地址保存到上一个结点中
            p2 = p1;
        }
        //p1指向开辟的下一段空间
        p1 = (struct student *)malloc(sizeof(struct student));
        printf("\n学号:");
        scanf("%d", &p1->num);
        if(p1->num!=0){
            printf("姓名:");
            scanf("%s", &p1->name);
            printf("分数:");
            scanf("%f", &p1->score);
        }
    }
    p2->next = NULL;
    return head;
}
//输出链表内容
void print(struct student * head){
    system("cls");
    printf("学生成绩表\n\n", n);
    printf("学号\t姓名\t分数\n\n");
    do{
        printf("%d\t%s\t%5.1f\n\n", head->num, head->name, head->score);
        head = head->next;
    }while(head!=NULL);
    printf("目前共有%d条记录!!!\n\n", n);
}
//删除指定的项目
struct student * del(struct student * head, int number){
    struct student * p1, * p2;
    if(head==NULL){
        printf("对不起,不能删除空表!!!\n");
        return head;
    }
    p1 = head;
    while( number!=p1->num && p1->next!=NULL){
        p2 = p1;
        p1 = p1->next;
    }
    if(p1->num==number){
        if(head==p1){
            head = p1->next;
        }else{
            p2->next = p1->next;
        }
        n--;
    }else{
        printf("对不起没有这个学号!!!\n");
    }
    return head;
}
//添加内容的函数
struct student * add(struct student * head){
    struct student * p0, * p1, *p2;
    p2 = p1 = head;
    p0 = &stu;
    
    //下面为用户输入添加的数据
    printf("请输入需要插入的数据:\n");
    printf("学号:");
    scanf("%d", &p0->num);
    
    if(p0->num<=0){
        printf("学号输入错误!!!\n数据添加失败!!!\n");
    }else{
        printf("姓名:");
        scanf("%s", &p0->name);
        printf("成绩:");
        scanf("%f", &p0->score);
        printf("\n您添加的数据为:\n\n学号:%d\n姓名:%s\n成绩:%-5.2f\n\n", p0->num, p0->name, p0->score);
        
        if( head==NULL ){
            head = p0;
            p0->next = NULL;
        }else{
            while( p0->num>p1->num && p1->next!=NULL ){
                p2 = p1;
                p1 = p1->next;
            }
            if(p0->num<=p1->num){
                if(p1==head){   //头结点
                    head = p0;
                }else{
                    p2->next = p0;
                }
                p0->next = p1;
            }else{
                p1->next = p0;
                p0->next = NULL;
            }
        }
        n++;
    }
    return head;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

没有啊??不过有一个问题,添加后再删除成空表,并且按返回,程序会出错
99行必须改成while循环,而不是do-while循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

F11单步调试问题就没有出现了,F10调试就出现了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

我半天也没看出问题,6楼这个可以作为最佳答案了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-5 09:48:56 | 显示全部楼层
head = add(head); 这里把链表给搞乱了,自己调试下吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2015-8-31 10:04:11 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-31 21:52:14 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 02:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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