基于链式存储的图书管理系统
6和7无法出现正确的结果
不知道哪里出错了
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
void menu()
{
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("|======8.新图书入库==================|\n");
printf("|======9.旧图书出库==================|\n");
printf("\n");
}
typedef struct
{
char no[20];
char name[50];
float price;
}book;
typedef struct Book
{
book data;
struct Book *next;
}Book;
typedef struct
{
Book* head;
Book* tail;
int length;
}SqList;
//初始化
int InitList_Sq(SqList *L)
{
L->head=(Book*)malloc(sizeof(Book));
L->head->next=NULL;
L->tail=L->head;
L->length=0;
return 0;
}
//图书信息的输入
int Input_Sq(SqList *L)
{
Book* p;
while(1)
{
p=(Book*)malloc(sizeof(Book));
if(!p)exit(-1);
scanf("%s",p->data.no);
scanf("%s",p->data.name);
scanf("%f",&p->data.price);
if(!strcmp(p->data.no,"0")&&!strcmp(p->data.name,"0")&&p->data.price==0)
{
break;
}
L->tail->next=p;
L->tail=p;
L->length++;
}
L->tail->next=NULL;
return 0;
}
//图书信息的输出
int Output_Sq(SqList *L)
{
Book* p;
if(L->length==0)
{
printf("库中没有图书\n");
return -1;
}
p=L->head->next;
printf("%d\n",L->length);
while(p!=NULL)
{
printf("%s ",p->data.no);
printf("%s ",p->data.name);
printf("%.02f\n",p->data.price);
p=p->next;
}
return 0;
}
//按价格降序
int Sort_Sq(SqList *L)
{
Book *p;
for(int i=0;i<L->length;i++)
{
p=L->head->next;
int j=0;
while(p&&j<L->length-1-i)
{
if(p->data.price<p->next->data.price)
{
book t=p->data;
p->data=p->next->data;
p->next->data=t;
}
p=p->next;
j++;
}
}
return 0;
}
//图书信息的修改
int RevisePrice_Sq(SqList *L)
{
int num=0;
float Avg_price=0;
Book *p,*q;
p=L->head->next;
q=L->head->next;
while(p)
{
Avg_price+=p->data.price;
num++;
p=p->next;
}
Avg_price/=num;
while(q)
{
if(q->data.price>=Avg_price)
{
q->data.price*=1.2;
}
else
{
q->data.price*=1.1;
}
q=q->next;
}
return 0;
}
//图书的逆序存储
int Reversed_Sq(SqList *L)
{
Book* p;
p=L->head->next;
L->head->next=NULL;
while(p)
{
Book* q;
q=p->next;
p->next=L->head->next;
L->head->next=p;
p=q;
}
return 0;
}
//查找最贵图书
int Expensive_Sq(SqList *L)
{
Book *p;
p=L->head->next;
Book* max=p;
Book* maxs[3];
while(p)
{
if(p->data.price>max->data.price)
{
max=p;
}
p=p->next;
}
p=L->head->next;
int k=0;
while(p)
{
if(p->data.price==max->data.price)
{
maxs[k]=p;
k++;
}
p=p->next;
}
printf("%d\n",k);
int i=0;
while(maxs[i]&&i<k)
{
printf("%s ",maxs[i]->data.no);
printf("%s ",maxs[i]->data.name);
printf("%.02f\n",maxs[i]->data.price);
i++;
}
return 0;
}
//查找最爱图书
int Favour_Sq(SqList *L)
{
Book* Fbook[5];
int n;
scanf("%d",&n);
book Fbookname[n];
for(int i=0;i<n;i++)
{
scanf("%s",Fbookname[i].name);
}
Book* p;
int k=0;
for(int j=0;j<n;j++)
{
k=0;
p=L->head->next;
while(p)
{
if(p->data.name==Fbookname[j].name)
{
Fbook[k]=p;
k++;
}
p=p->next;
}
if(k==0)
{
printf("抱歉,没有找到您要的书!\n");
}
else
{
printf("%d\n",k);
for(int i=0;i<k;i++)
{
printf("%s ",Fbook[i]->data.no);
printf("%s ",Fbook[i]->data.name);
printf("%.02f\n",Fbook[i]->data.price);
}
}
}
return 0;
}
//图书的按位置查找
int Select_Sq(SqList *L)
{
int num;
scanf("%d",&num);
int add[num];
int flag=0;
Book *p,*Found;
for(int i=0;i<num;i++)
{
scanf("%d",add+i);
}
for(int i=0;i<num;i++)
{
flag=0;
p=L->head->next;
while(p)
{
if(add[i]>0&&add[i]<L->length)
{
Found=p;
flag=1;
}
p=p->next;
}
if(flag==0)
{
printf("查无此书!\n");
}
else
{
printf("%s ",Found->data.no);
printf("%s ",Found->data.name);
printf("%.02f\n",Found->data.price);
}
}
return 0;
}
//新图书入库
int Insert_Sq(SqList *L)
{
int n;
scanf("%d",&n);
book Ibook;
scanf("%s",Ibook.no);
scanf("%s",Ibook.name);
scanf("%f",&Ibook.price);
if(n<1||n>L->length)
{
printf("插入位置错误,请重新输入:\n");
}
else
{
Book *p;
p=L->head;
int j=0;
while(p&&(j<n-1))
{
p=p->next;
j++;
}
Book *s;
s=(Book *)malloc(sizeof(Book));
s->data=Ibook;
s->next=p->next;
p->next=s;
L->length++;
}
return 0;
}
//旧图书出库
int Delete_Sq(SqList *L)
{
int num;
scanf("%d",&num);
if(num>L->length||num<1)
{
printf("输入位置错误,请重新输入:\n");
}
else
{
Book* p;
p=L->head;
Book* q;
int j=0;
while(p&&(j<num-1))
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
free(q);
L->length--;
}
return 0;
}
int main()
{
menu();
SqList *L;
L=(SqList*)malloc(sizeof(SqList));
InitList_Sq(L);
int choice;
scanf("%d",&choice);
switch(choice)
{
case 1:Input_Sq(L);
Output_Sq(L);
break;
case 2:Input_Sq(L);
Sort_Sq(L);
Output_Sq(L);
break;
case 3:Input_Sq(L);
RevisePrice_Sq(L);
Output_Sq(L);
break;
case 4:Input_Sq(L);
Reversed_Sq(L);
Output_Sq(L);
break;
case 5:Input_Sq(L);
Expensive_Sq(L);
break;
case 6:Input_Sq(L);
Favour_Sq(L);
break;
case 7:Input_Sq(L);
Select_Sq(L);
break;
case 8:Input_Sq(L);
Insert_Sq(L);
Output_Sq(L);
break;
case 9:Input_Sq(L);
Delete_Sq(L);
Output_Sq(L);
break;
default:printf("输入有误,请重新输入\n");
}
return 0;
}