向各位大神求助一个问题,希望大神赶紧出现。

coderzhan 2012-04-15 10:35:47
下面是我写的一个程序,可能有点长,希望能耐心看一看。
程序是有关学生信息管理,运行时有时会出现问题,有时不会,但是在增加学生信息时,连续增加相邻的学号学号时,必然出现图片所示内容,我百度了很多回答,但是都还是无法有效解决这个问题。明天就要检查了,

代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>


int total=0;
struct student
{
char number[10],name[20];
double score;
struct student *next;
};


void MainMenu();
void Astudent_message(struct student *head);
void Edit(struct student *head);
void Query(struct student *head);
void Delete(struct student *head);
void Print(struct student *head);
void Sort(struct student *head,struct student *current);
void Print_T();


void main(void)
{
struct student *head=NULL;
int in;
head=(struct student *)malloc(sizeof(struct student ));
head->next=NULL;
while (1)
{
MainMenu(); // 显示主菜单
in = getch();system("cls");
switch(in)
{
case '1':Astudent_message(head); // 添加
break;
case '2':Query(head); // 查询
break;
case '3':Edit(head); // 编辑
break;
case '4':Delete(head); // 删除
break;
case '5':Print(head); // 打印
break;
case '6':Print_T();// 打印总人数
break;
case '7':return;// 退出

default:printf("输入有误,请按任意键后重新输入...");getch();system("cls");
}
}
}

void Print_T()
{
printf("======================\n");
printf("所有学生人数为:%d\n",total);
printf("======================\n\n");
printf("请按任意键继续....");
getch();
system("cls");
}

void MainMenu()
{
printf("======================================\n");
printf("| 1.添加学生 |\n");
printf("| 2.查询学生 |\n");
printf("| 3.编辑学生 |\n");
printf("| 4.删除学生 |\n");
printf("| 5.打印全部 |\n");
printf("| 6.计算人数 |\n");
printf("| 7.退出系统 |\n");
printf("======================================\n");

}

void Astudent_message(student *head)
{

int sz,len;
struct student *current=NULL;
while(1)
{
current=(struct student*)malloc(sizeof(struct student));
while(1)
{
printf("=============================\n");
printf("输入学生信息:\n");
printf("学号:");scanf("%s",current->number);
len=strlen(current->number);
if(len==4)
break;
else
printf("\n输入非法,学号必须是4位,按任意键后重新输入:\n");getch();system("cls");
}
printf("姓名:");scanf("%s",current->name);
printf("成绩:");scanf("%lf",¤t->score);
printf("=============================\n\n");
printf("=============================\n");
printf("请选择:\n1.继续增加学生\n2.退出到主页面\n");
printf("=============================\n");
sz=getch(); total++;
system("cls");
current->next=NULL;
Sort(head,current);
current=NULL;
if(sz=='2') break;
}
}

void Edit(student *head)
{
struct student *pre;
char Temp[5];
int sz=0,is_E=0;
if(head->next==NULL) { printf("信息表为空,请按任意键返回主页面...");getch();system("cls");return ;}
while(1)
{
while(1)
{
printf("===================================================\n");
printf("请输入要编辑的学生学号:(如果不执行操作请输入0000)\n学号:");
scanf("%s",Temp);
if(strcmp("0000",Temp)==0) {system("cls");return;}
pre=head->next;
while(pre&&strcmp(pre->number,Temp)!=0)
pre=pre->next;
if(pre) break;
else
printf("\n学号为%s的学生不存在,请按任意键后重新输入...\n",Temp);
printf("===================================================\n");
getch();
system("cls");
}

while(1)
{
printf("===================================================\n");
printf("===================================================\n");
printf("学号为%s的学生信息如下:\n",pre->number);
printf("学号:%s\n姓名:%s\n分数:%.2f\n",pre->number,pre->name,pre->score);
printf("===================================================\n\n");
printf("===================================================\n");
printf("请选择修改项目:\n1.姓名\n2.分数\n");
printf("===================================================\n");
sz=getch();
switch(sz)
{
case '1':printf("输入新的姓名:\n");scanf("%s",pre->name);break;
case '2':printf("输入新的分数:\n");scanf("%lf",&pre->score);break;
}
system("cls");
printf("===================================================\n");
printf("新的学生信息:\n学号:%s\n姓名:%s\n分数:%.2f\n",pre->number,pre->name,pre->score);
printf("===================================================\n\n");

while(1)
{
printf("===================================================\n");
printf("请选择:\n1.重新修改本条学生信息\n2.继续修改其他学生信息\n3.退出修改,回到主页面\n");
printf("===================================================\n");
is_E=getch();
if(is_E=='1'||is_E=='2'||is_E=='3') break;
else {printf("输入有误,按任意键重新选择!\n");getch();system("cls");}
}
if(is_E=='2'||is_E=='3') break;
system("cls");
}
system("cls");
if(is_E=='3') break;
}
}

void Query(student *head)
{
struct student *pre;
char Temp[5];
int sz;
if(head->next==NULL) {printf("信息表为空,请按任意键返回主页面...");getch();system("cls");return ;}
while(1)
{
while(1)
{
pre=head->next;
printf("===================================================\n");
printf("请输入要查询的学生学号(如果不执行操作请输入0000)\n学号:");
scanf("%s",Temp);
if(strcmp("0000",Temp)==0) {system("cls"); return;}
printf("===================================================\n\n");
while(pre&&strcmp(pre->number,Temp)!=0)
pre=pre->next;
if(pre) break;
else
printf("学号为%s的学生不存在,请按任意键后重新输入...",Temp);
getch();
system("cls");
}



printf("您要查询的学生信息如下:\n");
printf("===================================================\n");
printf("学号:%s\n姓名:%s\n分数:%.2f\n",pre->number,pre->name,pre->score);
printf("===================================================\n\n");
printf("请按任意键继续...\n");getch();system("cls");
while(1)
{
printf("===================================================\n");
printf("请选择:\n1.继续查询\n2.退出查询,回到主页面\n");
printf("===================================================\n\n");
sz=getch();
if(sz=='2'||sz=='1') break;
printf("输入有误,请按任意键后重新选择...");
getch();
system("cls");
}
system("cls");
if(sz=='2') break;
}

}

...全文
105 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
complety 2012-04-15
  • 打赏
  • 举报
回复
可以参看下这个---------------------http://blog.csdn.net/complety/article/details/7437778
Coder_Y_Jao 2012-04-15
  • 打赏
  • 举报
回复
学了楼上一招
northcan 2012-04-15
  • 打赏
  • 举报
回复
图片看不到,楼主在csdn里面发帖贴的图片,要上传到csdn的相册里。
然后点“插入图片”,粘贴图片地址。
HBack 2012-04-15
  • 打赏
  • 举报
回复
贴代码加个这个啊   
这么多看着晕
「已注销」 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
谢谢大家的关注,经过不懈的努力,我终于找到错误的地方了。
不用再麻烦。
[/Quote]那我来接分^_^
coderzhan 2012-04-15
  • 打赏
  • 举报
回复
谢谢大家的关注,经过不懈的努力,我终于找到错误的地方了。
不用再麻烦。
coderzhan 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

话说我也是学生,但是解决作业贴太累了,太费时间。。。 。。。不好意思啊!
[/Quote]

没事,但是我还是希望你能帮我一下。
冰与火 2012-04-15
  • 打赏
  • 举报
回复
话说我也是学生,但是解决作业贴太累了,太费时间。。。 。。。不好意思啊!
coderzhan 2012-04-15
  • 打赏
  • 举报
回复
void Delete(student *head)
{
struct student *current=NULL,*del=NULL;
int sz;
char Temp[5];
while(1)
{
if(head->next==NULL) {printf("信息表为空,请按任意键返回主页面...");getch();system("cls");return ;}
while(1)
{
current=head->next;
printf("===================================================\n");
printf("所有学生信息:\n");
while(current)
{
printf("学号:%s 姓名:%s 分数:%.2f\n",current->number,current->name,current->score);
current=current->next;
}
printf("===================================================\n\n");
printf("===================================================\n");
printf("输入要删除的学生学号(如果删除所有学生请输入0000)\n学号:");
scanf("%s",Temp);
current=head; //从头结点开始,是为了在进行一个一个删除时,全部都删完了能够给head->next赋值NULL;
if(strcmp("0000",Temp)==0)
{
current=current->next;
while(current){del=current;current=current->next;free(del);del=NULL;total--;}
system("cls");head->next=NULL;
printf("===================================================\n");
printf("所有学生信息已经删除,请按任意键返回主页面。\n");
printf("===================================================\n");
getch();
system("cls");
return ;
}
del=current->next;
while(del&&strcmp(Temp,del->number)!=0){current=del;del=del->next;}
if(del) break;
printf("没有找到学号为%s的学生,请按任意键后重新输入学号...\n",Temp);
getch();system("cls");
}
if(del->next==NULL) current->next=NULL;
else current->next=del->next;
free(del);del=NULL;
total--;
current=head->next;
system("cls");
printf("===================================================\n");
current==NULL?printf("所有学生信息已经删除,请退出删除。\n"):printf("删除学号%s后的学生信息:\n",Temp);
while(current)
{
printf("学号:%s 姓名:%s 分数:%.2f\n",current->number,current->name,current->score);
current=current->next;
}
printf("===================================================\n\n");
while(1)
{
printf("===================================================\n");
printf("请选择:\n1.继续删除\n2.退出删除,回到主程序\n");
printf("===================================================\n\n");
sz=getch();
if(sz=='2'||sz=='1') break;
printf("输入有误,请按任意键后重新选择!\n");
getch();
system("cls");
}
system("cls");
if(sz=='2') break;
}
}

void Print(student *head)
{
struct student *current;
if(head->next==NULL) {printf("信息表为空,请按任意键返回主页面...");getch();system("cls");return ;}
current=head->next;
printf("============================================\n");
printf("所有学生信息:\n");
while(current)
{
printf("学号:%-8s 姓名:%-8s 分数:%.2f\n",current->number,current->name,current->score);
current=current->next;
}
printf("============================================\n\n");
printf("请按任意键继续...");
getch();system("cls");
}

void Sort(struct student *head,struct student *current)
{
struct student *back=NULL,*pre=NULL;
if(head->next==NULL){ head->next=current;current->next=NULL;return ;}
pre=head;back=head->next;
while(atoi(current->number)>atoi(back->number)&&back)
{ pre=back;back=back->next; }
if(!back) { pre->next=current;current->next=NULL;}
else
{
pre->next=current;
current->next=back;
}
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧