做了一个图书管理系统,出现了点问题
做了一个图书管理系统,仅有管理员的时候,所有的都能正常运行。但是加上学生这个用户之后,程序就出了些问题。比如说选管理员,出来管理员的界面,进行操作,选择完一个操作按回车再选第二个,就不能正常运行,就是结束了,而且不能回到主菜单。求大神帮忙解答,明天就要答辩了~~紧急求助啊代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct book
{
int num,count;
double price;
char name[10];
char house[20];
struct book *next;
};
#define LEN sizeof(struct book)
int mulu(void)//系统目录的函数
{
printf("\t\t\t====欢迎进入图书管理系统====\n");
printf("\t\t\t | 管理员-----1 |\n");
printf("\t\t\t | 学生-------2 |\n");
printf("\t\t\t | 退出系统-----0 |\n");
printf("\t\t\t============================\n");
}
void ManagerLogin()
{
printf("\n");
printf(" 管理员,您好!\n");
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 StudentLogin()
{
printf("\n");
printf(" 同学,你好!\n");
printf("-----------------------\n");
printf(" 1.图书信息查询\n");
printf(" 0.返回主菜单\n");
}
struct book *creat(void)
{
struct book *p1,*p2,*head=NULL;
p1=p2=(struct book *)malloc(LEN);
printf("输入图书编号:");
scanf("%d",&p1->num);
getchar();
printf("输入图书书名:");
gets(p1->name);
printf("输入图书出版社:");
gets(p1->house);
printf("输入图书库存量:");
scanf("%d",&p1->count);
printf("输入图书单价:");
scanf("%lf",&p1->price);
getchar();
while(p1->num!=0)
{
if(head==NULL)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(struct book *)malloc(LEN);
printf("输入图书编号:");
scanf("%d",&p1->num);
getchar();
printf("输入图书书名:");
gets(p1->name);
printf("输入图书出版社:");
gets(p1->house);
printf("输入图书库存量:");
scanf("%d",&p1->count);
printf("输入图书单价:");
scanf("%lf",&p1->price);
getchar();
}
p2->next=NULL;
free(p1);
return head;
}
void baocun(struct book *head)//保存链表为磁盘文件
{
FILE *fp;
struct book *p;
char filename[20];
printf("请输入要保存的文件名:");
scanf("%s",&filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("Can't open this file!\n");
return;//exit(0);正常退出,执行后显示press anykey to continue;
}// getchar();
p=head;
while(p!=NULL)
{
fprintf(fp,"%d\n",p->num);
fprintf(fp,"%s\n",p->name);
fprintf(fp,"%s\n",p->house);
fprintf(fp,"%d\n",p->count);
fprintf(fp,"%lf\n",p->price);
p=p->next;
}
fputs("0",fp);
printf("文件保存成功!\n");//
getchar();
fclose(fp);
}
void list(struct book *head)
{ struct book *p;
if (head==NULL)
printf("图书信息为空!\n");
else
{
printf("\n全部图书的简要信息: \n");
printf("\n编号 书名 出版社 库存数量 价格\n");
p=head;
while (p!=NULL)
{
printf("%d, %s, %s, %d, %f",p->num,p->name,p->house,p->count,p->price);
printf("\n");
p=p->next;
}
}
getchar();
}
struct book *openfile(void)//打开文件,即新创建链表读取磁盘文件
{
struct book *head,*p1,*p2;
FILE *fp;
char filename[20];
printf("请输入要打开的文件名:");//若文件保存在默认路径,读取时无需输入路径
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("Can't open this file!\n");
exit(0);
}
head=p1=p2=(struct book *)malloc(LEN);
fscanf(fp,"%d%s%s%d%lf",&p1->num,p1->name,p1->house,&p1->count,&p1->price);
while(!feof(fp))
{
p1=(struct book *)malloc(LEN);
p2->next=p1;//节点连接
fscanf(fp,"%d%s%s%d%lf",&p1->num,p1->name,p1->house,&p1->count,&p1->price);
if(p1->num==0)
{
p2->next=NULL;
printf("文件打开成功,可显示信息!\n");
getchar();
return head;
}
p2=p1;
}
fclose(fp);
p2->next=NULL;
return head;
}
struct book *insert(struct book *head,int num)
{
struct book *p1,*p0,*p2;
p0=(struct book *)malloc(LEN);
p0->next=NULL;
printf("\n输入编号 书名 出版社 库存数量 价格\n");
scanf("%d%s%s%d%lf",&p0->num,&p0->name,&p0->house,&p0->count,&p0->price);
getchar();
if(head==NULL)
head=p0;
else
{
p1=head;
while((p0->num>p1->num)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if(p0->num<=p1->num)
{
if(head==p1)
head=p0;
else
p2->next=p0;
p0->next=p1;
}
else
p1->next=p0;
}
return (head);
}
struct book *del(struct book *head,int num)
{
struct book *p1,*p2=NULL;
printf("请输入要删除的图书的编号: ");
scanf("%d",&num);
if(head == NULL)
printf("图书信息为空,无法执行操作!\n");
else
{
p1 = head;
while((num!=p1->num) && (p1->next!=NULL))
{
p2 = p1;
p1 = p1->next;
}
if(num==p1->num)
{
if(p1==head)
head = p1->next;
else
p2->next = p1->next;
free(p1);
printf("该图书信息已删除!\n");
}
else
printf("无该图书信息,无法删除!\n");
}
return head;
}
struct book *serch(struct book *head)//查询
{
struct book *p1;
int select,num;
char name[100];
if(head==NULL)
{
printf("图书信息为空!\n");
}
else
{
p1=head;
printf("****************************\n");
printf("1.按图书的编号进行查询 \n");
printf("2.按图书的书名进行查询 \n");
printf("\n请选择你需要的服务(1-2): \n");
printf("请选择查询类别: \n");
scanf("%d",&select);
switch(select)
{
case 1:printf("输入想查询的图书编号:\n");
scanf("%d",&num);
while((num!=p1->num)&&(p1->next!=NULL))
{
p1=p1->next;
}
if(num==p1->num)
{
printf("图书编号:%3d图书书名:%3s图书出版社:%3f图书库存量:%3d图书价格%3f\n",p1->num,p1->name,p1->house,p1->count,p1->price);
}
else
{
printf("不存在该图书!\n");
}
break;
case 2:printf("输入想查询的图书书名:\n");
scanf("%s",name);
while((strcmp(p1->name,name)!=0)&&(p1->next!=NULL))
{
p1=p1->next;
}
if(strcmp(name,p1->name)==0)
{
printf("图书编号:%3d图书书名:%3s图书出版社:%3f图书库存量:%3d图书价格%3f\n",p1->num,p1->name,p1->house,p1->count,p1->price);
}
else
printf("没有该图书!\n");
break;
default:printf("\n按键错误,请重新选择!\n");
}
}
getchar();
return (head);
}
struct book *gai(struct book *head)//修改记录
{
struct book *p;
int num;
if(head==NULL)
{
printf("未能打开任何文件!\n");
getchar();
return NULL;
}
p=head;
printf("请输入要修改的图书的编号:");
scanf("%d",&num);
while(p!=NULL)
{
if(p->num==num)
{
printf("编号: %d 书名: %s 出版社: %s 库存量: %d 价格: %lf\n",p->num,p->name,p->house,p->count,p->price);
printf("请按提示输入修改后的数据\n");
printf("编号 书名 出版社 库存量 价格: \n");
scanf("%d%s%s%d%lf",&p->num,p->name,p->house,&p->count,&p->price);
printf("修改成功!\n");
getchar();
return head;
}
p=p->next;
}
printf("未能找到记录!\n");
return head;
}
int main(void)
{
int i,j=0,num=0;
struct book *head=NULL;
char ch;
mulu();
printf("\t\t\t*请按照提示选择用户*\n\t\t\t");
scanf("%d",&i);
if(i<0 || i>2)
{
printf("\t\t\tput error!\n");
exit(0);
}
else if(i==1)
{
system("cls");
do
{
ManagerLogin();
printf("请选择相应的操作:");
getchar();
scanf("%c",&ch);
switch(ch)
{
case '1':head=creat();break;
case '2':baocun(head);break;
case '3':list(head);break;
case '4':head=openfile();break;
case '5':head=insert(head,num);break;
case '6':head=del(head,num);break;
case '7':head=gai(head);break;
default: exit(0);
}
printf("按回车键返回\n");
getchar();
system("cls");
j=1;
}while(j);
}
else if(i==2)
{
system("cls");
do
{
StudentLogin();
printf("请选择相应的操作:");
getchar();
scanf("%c",&ch);
switch(ch)
{
case '1':head=serch(head);break;
case '0':break;
default: exit(0);
}
printf("按回车键返回\n");
getchar();
system("cls");
j=1;
}while(j);
}
else
exit(0);
return 0;
}