问题描述:创建一个图书馆管理系统,可进行还书(插入),排序,查找,借书(删除)操作。
基本要求:
①所有信息存储在一个带头结点的单向链表中,每个结点存储一条图书记录,即结构体(book),其中各域为:书号(number)、书名(title)、作者(writer)、定价(pricing)、出版社(publishinghouse),指针域(next)。
②系统初始时图书记录为空,由用户录入信息,进行插入(包括创建),排序,查找,删除操作。
③有两种排序算法可选:选择排序和直接插入排序,均由链表实现。
④如输入有错,给出出错提示。
#include<stdio.h>
#include<stdlib.h>
typedef struct Book
{
long num;
char name[30];
char writer[10];
float price;
char out[50];
struct Book *next;
} know,*link;
link Input()
{
int n;
link head;
link p1,p2;
n=0;
p1=p2=(link) malloc(sizeof(know));
printf("请输入图书编号,名称,作者,价格,出版社,并以图书编号0结束\n");
scanf("%d",&p1->num);
while(p1->num)
{
scanf("%s%s%f%s",&p1->name,&p1->writer,&p1->price,&p1->out);
n++;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(link) malloc(sizeof(know));
scanf("%d",&p1->num);
}
p2->next=NULL;
printf("输入数据成功!\n");
return(head);
}
link Output(link head)
{
if(head==NULL)
{
printf("数据库中无图书信息!\n");
return head;
}
else
{
link p1,p2;
p1=head;
do
{
printf("%d %s %s %.1f %s",p1->num,p1->name,p1->writer,p1->price,p1->out);
p1=p1->next;
printf("\n");
}
while(p1);
}
}
link Sort1(link head)//直接插入排序
{
int i,x=1;
link p1,p2,p3;//p1记录未排序的数,p2记录已经排好序的数,p3记录p1前面的指针;
if(head==NULL||head->next==NULL)
{
printf("数据库中无图书信息或只有一本书!\n");
return head;
}
else
{
p1=head->next;
p3=head;
while(p1)
{
p2=head;
for(i=0; i<x; i++)
{
if((p1->num)>(p2->num)&&(p1->num)<(p2->next->num))//找到合适的位置插入
{
p3->next=p1->next;
p1->next=p2->next;
p2->next=p1;
break;
}
else if((p1->num)<(p2->num))
{
p3->next=p1->next;
p1->next=head;
head=p1;
break;
}
else if((p1->num)>(p2->num)&&i==(x-1))
{
p3=p3->next;
}
p2=p2->next;
}
x++;
p1=p3->next;
}
Output(head);
return head;
}
}
link Sort2(link head)//选择排序
{
link p1,min,p3,front,p2,p4,p5;//min,front,p3用来建立新的链表,p1表示旧链表剩余的数p2记录p1前面的地址,p4和p5用于代替p1和p2;
p3=min=(link) malloc(sizeof(know));
int ok=0;
if(head==NULL||head->next==NULL)
{
printf("数据库中无图书信息或只有一本书!\n");
return head;
}
else
{
while(head->next)
{
p2=head;
p1=head->next;
*min=*head;
ok++;
while(p1)
{
if(min->num>p1->num)
{
*min=*p1;
p4=p2;
p5=p1;
}
p2=p1;
p1=p1->next;
}
if(min->num!=head->num)
{
p4->next=p5->next;
free(p5);
}
else
{
p5=head;
head=head->next;
free(p5);
}
if(ok==1)
{
front=min;
}
else
{
p3->next=min;
}
p3=min;
min=(link) malloc(sizeof(know));
}
p3->next=head;
Output(front);
return front;
}
}
link Back(link head)
{
link book,p1,p2;
printf("请输入还回图书的编号,名称,作者,价格,出版社,并以0结束输入\n");
while(1)
{
p1=head;
book=(link) malloc(sizeof(know));
scanf("%d",&book->num);
if(book->num==0)break;
else
{
scanf("%s%s%f%s",&book->name,&book->writer,&book->price,&book->out);
if(head==NULL)
{
head=book;
book->next=NULL;
}
else
{
while((p1)&&(book->num>p1->num))
{
p2=p1;
p1=p1->next;
}
if(p1==NULL)
{
p2->next=book;
book->next=NULL;
}
else if(head==p1)
{
book->next=head;
head=book;
}
else
{
p2->next=book;
book->next=p1;
}
}
}
}
printf("插入成功!\n");
printf("库存图书还有:\n");
Output(head);
return head;
}
link Find(link head)//查找书籍
{
link book,p1;
book=(link)malloc(sizeof(know));
if(head==NULL)
{
printf("数据库中无图书信息!\n");
return;
}
while(1)
{
p1=head;
printf("请输入要查找图书的编号,并以0结束查找!\n");
scanf("%d",&book->num);
if(book->num==0)break;
else
{
while((p1)&&(book->num!=p1->num))
{
p1=p1->next;
}
if(p1==NULL)
{
printf("对不起,本书已借出!\n");
}
else
{
printf("%d %s %s %.1f %s\n",p1->num,p1->name,p1->writer,p1->price,p1->out);
}
}
}
}
link Borrow(link head)
{
link book,p1,p2;
book=(link)malloc(sizeof(know));
printf("库存图书还有:\n");
Output(head);
while(1)
{
p1=head;
printf("请输入要借图书的编号,并以0结束输入!\n");
scanf("%d",&book->num);
if(book->num==0)break;
else
{
if(head==NULL)
{
printf("数据库中无图书信息!\n");
}
else
{
while((p1)&&(book->num!=p1->num))
{
p2=p1;
p1=p1->next;
}
if(p1==NULL)
{
printf("对不起,本书已借出!\n");
return;
}
else if(head==p1)head=p1->next;
else
{
p2->next=p1->next;
}
}
printf("借书成功!\n");
printf("库存图书还有:\n");
Output(head);
}
}
return head;
}
int main()
{
int s;
link head=NULL;
while(1)
{
printf("1 录入数据\n");
printf("2 还书\n");
printf("3 排序(按书号)\n");
printf("4 查找(按书号)\n");
printf("5 借书\n");
printf("6 输出数据\n");
printf("0 退出\n");
printf("请选择要使用的服务编号:\n");
scanf("%d",&s);
if(s==0)break;
switch(s)
{
case 1:
head=Input();
break;
case 2:
head=Back(head);
break;
case 3:
printf("请选择排序方法:1 直接插入排序 2 选择排序\n");
scanf("%d",&s);
if(s==1)head=Sort1(head);
else if(s==2)head=Sort2(head);
else printf("您输入的编号不合法\n");
break;
case 4:
Find(head);
break;
case 5:
if(head==NULL)printf("对不起,图书已经全部借出!\n");
else head=Borrow(head);
break;
case 6:
Output(head);
break;
default:
printf("您输入的编号不合法!\n");
}
}
}