小甲鱼学生管理系统添加用户出现死循环
本帖最后由 大西洋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;
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;
}
本帖最后由 565123 于 2013-8-4 13:41 编辑
没有啊??不过有一个问题,添加后再删除成空表,并且按返回,程序会出错
99行必须改成while循环,而不是do-while循环
565123 发表于 2013-8-4 13:35 static/image/common/back.gif
没有啊??不过有一个问题,添加后再删除成空表,并且按返回,程序会出错
99行必须改成while循环,而不是d ...
改了以后,运行程序,先正常输入1,3号,在选择添加2和4,添加4后又陷入死循环了(只能添加一次数据,只要添加第二次就陷入死循环了),我这边添加后删除为空表后再返回没有逻辑上没有报错。 {:7_158:}我当初也疑惑了。不过后来又解决了。忘记怎么弄的了。
你单步调试研究下。应该是链表最后形成死循环了。 Potato丶 发表于 2013-8-4 21:40 static/image/common/back.gif
我当初也疑惑了。不过后来又解决了。忘记怎么弄的了。
你单步调试研究下。应该是链表最后形成死循 ...
F11单步调试问题就没有出现了,F10调试就出现了{:5_100:} add函数出问题,stu是一个全局结构,不可以把地址附过去
一次添加,stu被用一次,再添加,stu的next就指向自己了,最好改成malloc,因为删除stu也会出问题 565123 发表于 2013-8-5 00:18 static/image/common/back.gif
add函数出问题,stu是一个全局结构,不可以把地址附过去
一次添加,stu被用一次,再添加,stu的next就指向 ...
我半天也没看出问题,6楼这个可以作为最佳答案了 head = add(head); 这里把链表给搞乱了,自己调试下吧! p0 = &stu; 问题出在这句话上,每次增加 都要 分配一个,不要用全局变量stu的地址。 {:1_1:} 学习学习
页:
[1]