下面是我写的一个程序,可能有点长,希望能耐心看一看。
程序是有关学生信息管理,运行时有时会出现问题,有时不会,但是在增加学生信息时,连续增加相邻的学号学号时,必然出现图片所示内容,我百度了很多回答,但是都还是无法有效解决这个问题。明天就要检查了,
代码如下:
#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;
}
}