num,p->name,p->here,p->author,p->pub,p->count,p->price,p->datestruct" />
搜档网
当前位置:搜档网 › 个人图书管理系统。数据结构课程设计

个人图书管理系统。数据结构课程设计

#define _CRT_SECURE_NO_DEPRECATE
#include
#include
#include
#include
#define N sizeof(struct book)
#define PT "%-5d %10s %6s %6s %6s %3d %5d %-15s\n",p->num,p->name,p->here,p->author,p->pub,p->count,p->price,p->date
struct book /*图书信息*/
{
int num; /*书号*/
char name[10]; /*书名*/
char here[10]; /*所在书库*/
char author[15]; /*作者*/
char pub[20]; /*出版社*/
int count; /*数量*/
int price; /*价格*/
char date[20]; /*购买日期*/
struct book *next;
};
/*输出模块*/
void print(struct book *p0)
{
struct book *p;
p=p0->next;
printf("\n\n\t\t^^^^^^^^^^^^^^图书信息表^^^^^^^^^^^^^^");
printf("\n\n图书编号---图书名称---所在书库----作者----出版社---数量---价格---购买日期\n");
while(p!=NULL)
{
printf(PT);
p=p->next;
}
getch();
}
/*输入模块*/
struct book *creat()
{
struct book *head,*p1,*p2;
int i=0;
head=p2=(struct book *)malloc(N);
head->next=NULL;
printf("\n\n\t\t录入图书信息");
printf("\n\t---------------------------------------");
while(1)
{ p1=(struct book *)malloc(N);
printf("\n 请输入图书编号(书号为0结束): ");
scanf("%d",&p1->num);
if(p1->num!=0)
{
printf("\n\n书名 所在书库 作者 出版社 图书数量 价格 购买日期\n");
scanf("%s%s%s%s%d%d%s",p1->name,p1->here,p1->author,p1->pub,&p1->count,&p1->price,p1->date);
p2->next=p1;
p2=p1;
i++;
}
else
break;
}
p2->next=NULL;
free(p1);
printf("\n\t\t----------------------------------------");
printf("\n\t\t %d 种书录入完毕",i);
getch();
return head;
}

/*查找模块*/
void find_name(struct book *p0)
{
char name[10];
int flag=1;
struct book *p;
printf("请输入要查找的书名:\n");
scanf("%s",name);
for(p=p0->next;p;p=p->next)
if(strcmp(p->name,name)==0)
{
printf("\n\n图书编号---图书名称---所在书库----作者----出版社---数量---价格---购买日期\n");
printf(PT);
flag=0;
}
if(flag) printf("\n 暂无此图书信息\n");
getch();
}
void find_author(struct book *p0)
{
char author[15];
int flag=1;
struct book *p;
printf("请输入要查找的作者名:\n");
scanf("%s",author);
for(p=p0->next;p;p=p->next)
if(strcmp(p->author,author)==0)
{
printf("\n\n图书编号---图书名称---所在书库----作者----出版社---数量---价格---购买日期\n");
printf(PT);
flag=0;
}
if(flag) printf("\n 暂无此图书信息\n");
getch();
}
void find(struct book *p0)
{
int a,flag=1;
struct book *p;
p=p0;
system("cls");
while(flag)
{
system("cls");
printf("\t\t\t------------查找------------");
printf("\n\n\t\t\t\t 1、按书名查找\t\n");
printf("\n\n\t\t\t\t 2、按作者查

找\t\n");
printf("\n\n\t\t\t\t 3、按3键返回\t\n\n\n");
printf("请输入查找方式:");scanf("%d",&a);
switch(a)
{
case 1:find_name(p); break;
case 2:find_author(p); break;
case 3:system("cls"); flag=0;break;
default:printf("\n\t输入有误,请重新输入!");getch();find(p);
}
}
system("cls");
}
/*删除模块*/
void del(struct book *p0)
{
char name[10];
int flag=1;
struct book *p;
p=p0;
printf("请输入要删除的书名:\n");
scanf("%s",name);
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
p0->next=p->next; /*后续节点连接到前驱节点之后*/
free(p);
printf("\t该书资料已删除.");
flag=0;
break;
}
p0=p;
p=p->next;
}
if(flag) printf("\n\t无此图书信息。");
getch();
}

/*增加模块*/
void insert(struct book *p0)
{
int flag;
struct book *p,*q;
while(1)
{
flag=0;
p=(struct book *)malloc(N);
printf("\n 请输入要增加的图书编号(书号为0 退出): ");
scanf("%d",&p->num);
if(p->num!=0)
{
for(q=p0->next;q;q=q->next)
{
if(q->num==p->num) /*找到重号*/
{
flag=1;
free(p);
printf("\t该书已存在");
getch();
break;
}
}
if(flag==0)
{
printf("\n\n书名 所在书库 作者 出版社 图书数量 价格 购买日期\n");
scanf("%s%s%s%s%d%d%s",p->name,p->here,p->author,p->pub,&p->count,&p->price,p->date);
p->next=p0->next;
p0->next=p;
printf("\t已成功插入.");
}

}
else
break;

}
getch();
}
/*修改模块*/
void modify(struct book *p0)
{
char name[10];
int flag=1;
int choice;
struct book *p;
p=p0->next;
printf("请输入要修改的书名:\n");
scanf("%s",name);
while(p!=NULL&&flag==1)
{
if(strcmp(p->name,name)==0)
{
printf("\n\t请选择要修改的项:");
printf("\n\t 1.修改图书编号\n");
printf("\n\t 2.修改图书所在书库\n");
printf("\n\t 3.修改图书作者\n");
printf("\n\t 4.修改图书出版社\n");
printf("\n\t 5.修改图书库存量\n");
printf("\n\t 6.修改图书价格\n");
printf("\n\t 7.修改图书购买日期\n");
scanf("%d",&choice);
switch(choice)
{
case 1: { printf("\n 请输入新的图书编号:");

scanf("%d",&p->num); break;
}
case 2: { printf("\n 请输入新的图书书库:");

scanf("%s",p->here); break;
}
case 3: { printf("\n 请输入新的图书作者:");

scanf("%s",p->author); break;
}
case 4: {printf("\n 请输入新的图书出版社:");

scanf("%s",p->pub); break;
}
case 5: {printf("\n 请输入新的图书库存量:");

scanf

("%d",&p->count); break;
}
case 6: {printf("\n 请输入新的图书价格:");

scanf("%d",&p->price); break;
}
case 7: {printf("\n 请输入新的图书购买日期:");

scanf("%s",p->date); break;
}
}
printf("\n\t该项已成功修改。\n\t 新的图书信息:");
printf("\n\n图书编号---图书名称---所在书库----作者----出版社---数量---价格---购买日期\n");
printf(PT);
flag=0;
}
p0=p;
p=p0->next;
}
if(flag) printf("\n\t暂无此图书信息。");
getch();
}
/*读文件*/
struct book *read_file()
{
int i=0;
struct book *p,*p1,*head=NULL;
FILE *fp;
if((fp=fopen("library.txt","rb"))==NULL)
{
printf("\n\n\n\n\n \t********库文件不存在,请创建!**********");
getch();
return NULL;
}
head=(struct book *)malloc(N);
p1=head;
head->next=NULL;
printf("\n 已有图书信息:");
printf("\n\n图书编号---图书名称---所在书库----作者----出版社---数量---价格---购买日期\n");
while(1)
{
p=(struct book *)malloc(N); /*开辟空间以存放的取得信息*/
if(fscanf(fp,"%d%s%s%s%s%d%d%s",&p->num,p->name,p->here,p->author,p->pub,&p->count,&p->price,p->date)!=EOF)
{
printf(PT);
i++;
p1->next=p;
p1=p;
}
if(feof(fp)) break;
}

p1->next=NULL;
fclose(fp);/*将文件类型指针fp所指向的文件关闭,fp不再指向该文件*/
printf("\n 共种%d 图书信息",i);
printf("\n\n\n 文件中的信息以正确读出。按任意键进入主菜单。");
getch();
return (head);
}
/*保存文件*/
void save(struct book *head)
{
FILE *fp;
struct book *p;
fp=fopen("library.txt","wb"); /*以只写方式打开二进制文件*/
if(fp==NULL) /*打开文件失败*/
{
printf("\n=====>打开文件失败!\n");
getch();
return ;
}
else
for(p=head->next;p!=NULL;p=p->next)
fprintf(fp,"%d %s %s %s %s %d %d %s\n",p->num,p->name,p->here,p->author,p->pub,p->count,p->price,p->date);
/*按照格式要求将数据写入fp所指向的文件*/
fclose(fp);
printf("\n\t保存文件成功!\n");
getch();
}


void sort(struct book *p0)
{
int flag,i;
struct book *p,*r1,*r2;
while(1)
{
flag=0;
for(p=p0->next;p->next->next!=NULL;p=p->next)
{
r1=p->next;
r2=p->next->next;
i=strcmp(r1->author,r2->author);
if(i>=0)
{
flag=1;
p->next=r2;
r1->next=r2->next;
r2->next=r1;
}
}
if(flag==0)
{
break;
}
}
printf("----排序完成-----");
print(p0);
}
void main()
{
struct book *head=NULL;
int choice=1;
head=read_file();
if(head==NULL)
{
printf("\n\t\t********

**");
getch();
head=creat();
}
do
{
system("cls");
printf("\t\t----------Welcome---------\n");
printf("\n\n\t\t\t\t欢迎您\n");
printf("\n\n\n\n\n");
printf("\n\t 请选择:");
printf("\n\t 1.查询图书信息\n");
printf("\n\t 2.修改图书信息\n");
printf("\n\t 3.增加图书信息\n");
printf("\n\t 4.删除图书信息\n");
printf("\n\t 5.显示所有图书信息\n");
printf("\n\t 6.按作者排序图书信息\n");
printf("\n\t 0.退出系统\n");
scanf("%d",&choice);
switch(choice)
{
case 1: find(head); break;
case 2: modify(head); break;
case 3: insert(head); break;
case 4: del(head); break;
case 5: print(head); break;
case 6: sort(head); break;
case 0: system("cls");
printf("\n\n\n\n\n\t^^^^^^^^^^谢谢使用,再见^^^^^^^^^^!\n\n");
break;
}
}while(choice!=0);
save(head);
}

相关主题