图书管理系统

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>

#define M 10
#define N 15

typedef struct book_info
{
char ISBN[N];//书号
char name[M];//书名
char writer[M];//作者
char time[M];//出版日期
char publisher[N];//出版社
char price[M];//价格
}Book;

typedef struct link
{
Book info;
struct link * next;

}Node,*Link;

void Add_book(Link *Head,Link *New);//添加图书信息函数原型声明
void Delete_book(Link *Head); //删除图书信息函数原型声明
void Find_book(Link *Head); //查找图书信息函数原型声明
void Update_book(Link *Head); //修改图书信息函数原型声明
void Print_book(Link *Head); //输出图书信息函数原型声明

/*添加数据子操作*/
void print_info(Link *New,int i);

/*删除子操作*/
void delete_ISBN(Link *Head);
void delete_name(Link *Head);
void delete_writer(Link *Head);
void delete_publisher(Link *Head);

/*查找子操作*/
void search_ISBN(Link *Head);
void search_name(Link *Head);
void search_writer(Link *Head);
void search_publisher(Link *Head);
void search_price(Link *Head);
void search_time(Link *Head);

/*修改子操作*/
void update_ISBN(Link *p);
Link update_name(Link p);
Link update_writer(Link p);
Link update_publisher(Link p);
Link update_price(Link p);
Link update_time(Link p);

void choose_op(Link *Head);

/*输出一本图书的信息*/
void print(Link *Head);

/*图书管理系统菜单*/
void Menus(Link *Head,Link *New);

int main(int argc, char **argv)
{
FILE * fp;
int bytes_read,bytes_write;

Link Head = NULL,p; //节点声明
Link New = NULL;
int c = 1;
p = Head;

Head = (Link)malloc(sizeof(Node));//建立头节点
Head->next = NULL; //空链表


while(c)
{
Menus(&Head,&New);

printf("你想继续操作吗?
1.继续
2.退出 ");
scanf("%d",&c);

}
return 0;
}

/****************************************************
函数功能:选择菜单
****************************************************/
void Menus(Link *Head,Link *New)
{
int ch;
printf("/***************欢迎进入图书管理系统****************/ ");
printf("1.添加图书信息
2.删除图书信息
3.查找图书信息
4.修改图书信息
5.输出图书管理系统所有图书信息
6.退出系统
/***************************************************/ ");
scanf("%d",&ch);
switch(ch)
{
case 1:
Add_book(Head,New);
Print_book(Head);
break;
case 2:
Delete_book(Head);
Print_book(Head);
break;
case 3:
Find_book(Head);
break;
case 4:
Update_book(Head);
break;
case 5:
Print_book(Head);
break;
case 6:
exit(0);
default:
printf("输入错误,请重新输入! ");

}
}
/****************************************************
函数功能:修改指定图书的ISBN
****************************************************/
void update_ISBN(Link *p)
{
printf("请输入新的ISBN: ");
scanf("%s",(*p)->info.ISBN);

}
/****************************************************
函数功能:修改指定图书的书名
****************************************************/
Link update_name(Link p)
{
printf("请输入新的书名: ");
scanf("%s",p->info.name);
return p;
}
/****************************************************
函数功能:修改指定图书的作者
****************************************************/
Link update_writer(Link p)
{
printf("请输入新的作者名字: ");
scanf("%s",p->info.writer);
return p;
}

/****************************************************
函数功能:修改指定图书的出版社名字
****************************************************/
Link update_publisher(Link p)
{
printf("请输入新的出版社名字: ");
scanf("%s",p->info.publisher);
return p;
}

/****************************************************
函数功能:修改指定图书的价格
****************************************************/
Link update_price(Link p)
{
printf("请输入新的价格: ");
scanf("%d",p->info.price);
return p;
}

/****************************************************
函数功能:修改指定图书的出版日期
****************************************************/
Link update_time(Link p)
{
printf("请输入新的出版日期: ");
scanf("%s",p->info.time);
return p;
}


/*****************************************************
函数功能:修改指定图书的信息
*****************************************************/
void Update_book(Link *Head)
{
char str[N];
int flag = 0;
Link p;
/*输出录入图书的信息*/
Link q;


printf("请输入你要修改图书的ISBN: ");//根据ISBN找到指定图书
scanf("%s",str);

p = *Head;

if(p->next == NULL)//链表为空
{
printf("没有图书,不能进行修改操作. ");
}

while(p->next != NULL)
{
if(strcmp(p->next->info.ISBN,str) == 0)//如果p->next->info.ISBN与指定的ISBN号相同,则输出对应的图书信息
{
flag = 1;
printf(" /------------你想要修改图书的所有信息为----------------/ ");

/*调用函数显示指定图书的所有信息*/
q = p->next;
print(&q);

/*调用函数选择修改操作*/
choose_op(&q);

break;
}
p = p->next;
}
if(!flag)
{
printf("不能进行修改操作,没有ISBN为%s的书 ",str);
}

}

/******************************************************
函数功能:根据需要选择要进行修改的操作
******************************************************/
void choose_op(Link *p)
{
int ch;
Link q;
q = *p;
int c = 1;

while(c)
{
c = 0;
printf("请选择你想进行的修改操作: ");
printf("1.修改ISBN
2.修改书名
3.修改作者
4.修改出版社名
5.修改书的价格
6.修改出版日期 ");
scanf("%d",&ch);

switch(ch)
{
case 1:
update_ISBN(&q);
print(&q);
break;
case 2:
update_name(q);
break;
case 3:
update_writer(q);
break;
case 4:
update_publisher(q);
break;
case 5:
update_price(q);
break;
case 6:
update_time(q);
break;
default:
printf("输入错误 ");
}
C: printf("还要继续修改吗?
1.继续
0.退出 ");
scanf("%d",&c);
if(c > 1)
{
printf("输入错误,请重新输入! ");
goto C;
}

}
printf("修改后: ");
print(p);
}

/*****************************************************
函数功能:查找指定图书的信息
****************************************************/
void Find_book(Link *Head)
{
int ch;

printf("请选择你想进行的查找操作: ");
printf("1.按ISBN查找
2.按书名查找
3.查找指定作者的所有书
4.查找指定出版社出版的所有书
5.查找书的价格范围在指定区间的书
6.查找出版时间在指定区间内的书 ");
scanf("%d",&ch);

switch(ch)
{
case 1:
search_ISBN(Head);
break;
case 2:
search_name(Head);
break;
case 3:
search_writer(Head);
break;
case 4:
search_publisher(Head);
break;
case 5:
search_price(Head);
break;
case 6:
search_time(Head);
break;
default:
printf("输入错误 ");
}

}
/*****************************************************
函数功能:根据ISBN查找图书信息
*****************************************************/
void search_ISBN(Link *Head)
{
Link p;
char str[N];
int flag = 0;

printf("请输入你想查找图书的ISBN: ");
scanf("%s",&str);

p = (*Head)->next;

if(p == NULL)//链表为空
{
printf("没有图书,不能进行查找操作. ");
}

while(p != NULL)
{
if(strcmp(p->info.ISBN,str) == 0)//如果p->next->info.ISBN与指定的ISBN号相同,则输出对应的图书信息
{
flag = 1;
printf(" /------------你查找的图书信息为----------------/ ");
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("没有ISBN为%s的书 ",str);
}

}
/*****************************************************
函数功能:根据书名查找信息
*****************************************************/
void search_name(Link *Head)
{
Link p;
char str[N];
int flag = 0;

printf("请输入你想查找图书的书名: ");
scanf("%s",&str);

p = (*Head)->next;

if(p == NULL)//链表为空
{
printf("没有图书,不能进行查找操作. ");
}

while(p != NULL)
{
if(strcmp(p->info.name,str) == 0)//如果p->next->info.name与指定的书名相同,则输出对应的图书信息
{
flag = 1;
printf(" /------------你查找的图书信息为----------------/ ");
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("没有书名为%s的书 ",str);
}
}
/*****************************************************
函数功能:查找指定图书作者写的图书信息
*****************************************************/
void search_writer(Link *Head)
{
Link p;
char str[N];
int flag = 0;

printf("请输入你想查找图书的作者: ");
scanf("%s",&str);

p = (*Head)->next;

if(p == NULL)//链表为空
{
printf("没有图书,不能进行查找操作. ");
}

while(p != NULL)
{
if(strcmp(p->info.writer,str) == 0)//如果p->next->info.writer与指定的作者相同,则输出对应的图书信息
{
flag = 1;
printf(" /------------你查找的图书信息为----------------/ ");
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("没有作者%s的书 ",str);
}
}
/*****************************************************
函数功能:查找指定出版社出版的图书信息
*****************************************************/
void search_publisher(Link *Head)
{
Link p;
char str[N];
int flag = 0;

printf("请输入你想查找图书的出版社名字: ");
scanf("%s",&str);

p = (*Head)->next;

if(p == NULL)//链表为空
{
printf("没有图书,不能进行查找操作. ");
}

while(p != NULL)
{
if(strcmp(p->info.publisher,str) == 0)//如果p->next->info.publisher与指定的出版社名字相同,则输出对应的图书信息
{
flag = 1;
printf(" /------------你查找的图书信息为----------------/ ");
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("没有出版社%s的书 ",str);
}
}
/*****************************************************
函数功能:查找图书价格在指定区间上的书
*****************************************************/
void search_price(Link *Head)
{
Link p;
char a[M],b[M];
int flag = 0;

printf("请输入你想查找图书价格的下限: ");
scanf("%s",a);
printf("请输入你想查找图书的上限: ");
scanf("%s",b);

p = (*Head);//->next;

if(p == NULL)//链表为空
{
printf("没有图书,不能进行查找操作. ");
}

while(p != NULL)
{
if((p->info.price>a) && (p->info.price<b))//如果p->next->info.price在指定的区间[a,b]内,则输出对应的图书信息
{
flag = 1;
printf(" /------------价格位于[%d,%d]内图书信息为----------------/ ",a,b);
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("没有图书价格位于[%d,%d]内的书 ",a,b);
}
}
/*****************************************************
函数功能:查找出版日期在区间[a,b]中的图书
*****************************************************/
void search_time(Link *Head)
{
Link p;
char a[M],b[M];
int flag = 0;

printf("请输入你想查找图书出版日期的区间[a,b]:(以逗号隔开) ");
scanf("%s,%s",a,b);

p = (*Head);

if(p == NULL)//链表为空
{
printf("没有图书,不能进行查找操作. ");
}

while(p != NULL)
{
if((p->info.time >= a) && (p->info.time <= b))//如果p->next->info.time在指定的区间[a,b]内,则输出对应的图书信息
{
flag = 1;
printf(" /------------出版日期位于[%s,%s]内图书信息为----------------/ ",a,b);
print(&p);
break;
}
p = p->next;
}
if(!flag)
{
printf("没有出版日期位于[%s,%s]内的书 ",a,b);
}
}
/*****************************************************
函数功能:删除图书
*****************************************************/
void Delete_book(Link *Head)
{
Link p;
int ch;

printf("请选择你想进行的删除操作: ");
printf("1.删除与指定ISBN相同的书
2.删除与指定书名相同的书
3.删除指定作者的书
4.删除指定出版社的书 ");
scanf("%d",&ch);

switch(ch)
{
case 1:
delete_ISBN(Head);
break;
case 2:
delete_name(Head);
break;
case 3:
delete_writer(Head);
break;
case 4:
delete_publisher(Head);
break;
default:
printf("输入错误! ");
}
}
/*****************************************************
函数功能:删除与指定ISBN相同的书
*****************************************************/
void delete_ISBN(Link *Head)
{
Link p,q;
char str[N];
int flag = 0;
printf("请输入你想删除图书的ISBN: ");
scanf("%s",&str);

p = *Head;

if(p->next == NULL)//链表为空
{
printf("没有图书,不能进行删除操作. ");
}

while(p->next != NULL)
{
if(strcmp(p->next->info.ISBN,str) == 0)//如果p->next->info.ISBN与指定的ISBN号相同,则删除此图书节点
{
flag = 1;
q = p->next;
p->next = q->next;
free(q);
break;
}
p = p->next;
}
if(!flag)
{
printf("没有ISBN为%s的书 ",str);
}


}
/*****************************************************
函数功能:删除与指定书名相同的书
*****************************************************/
void delete_name(Link *Head)
{
Link p,q;
char str[N];
int flag = 0;
printf("请输入你想删除图书的名字: ");
scanf("%s",&str);

p = *Head;

if(p->next == NULL)//链表为空
{
printf("没有图书,不能进行删除操作. ");
}

while(p->next != NULL)
{
if(strcmp(p->next->info.name,str) == 0)//如果p->next->info.ISBN与指定的书名相同,则删除此图书节点
{
q = p->next;
p->next = q->next;
free(q);
flag = 1;
break;
}
p = p->next;
}
if(!flag)
{
printf("没有这本书 ");
}

}
/*****************************************************
函数功能:删除指定作者的书
*****************************************************/
void delete_writer(Link *Head)
{
Link p,q;
char str[N];
int flag = 0;
printf("请输入你想删除图书的作者名: ");
scanf("%s",&str);

p = *Head;

if(p->next == NULL)//链表为空
{
printf("没有图书,不能进行删除操作. ");
}

while(p->next != NULL)
{
if(strcmp(p->next->info.writer,str) == 0)//如果p->next->info.ISBN与指定的作者名相同,则删除此图书节点
{
q = p->next;
p->next = q->next;
free(q);
flag = 1;
break;
}
p = p->next;
}
if(!flag)
{
printf("没有作者%s的书 ",str);
}

}
/*****************************************************
函数功能:删除指定出版社的书
*****************************************************/
void delete_publisher(Link *Head)
{
Link p,q;
char str[N];
int flag = 0;
printf("请输入你想删除图书的出版社名字: ");
scanf("%s",&str);

p = *Head;

if(p->next == NULL)//链表为空
{
printf("没有图书,不能进行删除操作. ");
}

while(p->next != NULL)
{
if(strcmp(p->next->info.publisher,str) == 0)//如果p->next->info.ISBN与指定的出版社名字相同,则删除此图书节点
{
q = p->next;
p->next = q->next;
free(q);
flag = 1;
break;
}
p = p->next;
}
if(!flag)
{
printf("没有%s出版社的书 ",str);
}
}

/*****************************************************
函数功能:录入新的书籍信息
****************************************************/
void Add_book(Link *Head,Link *New)
{
int i;
int num;
Link p;
FILE * fp;

if((fp = fopen("F:\book_info.txt","a+")) == NULL)
{
perror("书库文件打开失败,不能录入信息! ");
exit(1);
}

p = (*Head)->next;

printf("你想录入几本书? ");
scanf("%d",&num);

for(i = 0; i < num; i++)
{
*New = (Link)malloc(sizeof(Node));
/*输入图书的信息*/
print_info(New,i);

/*头插法插入节点*/
(*New)->next = (*Head)->next;
(*Head)->next = *New;
}
}

/*******************************************************
函数功能:输入图书的信息
*******************************************************/
void print_info(Link *New,int i,FILE *fp)
{
printf("请输入第%d本书的信息: ",i+1);

printf("ISBN:");
scanf("%s",&(*New)->info.ISBN);
fwrite((*New)->info.ISBN,N,1,fp);

printf("书名:");
scanf("%s",&(*New)->info.name);
fwrite((*New)->info.name,M,1,fp);

printf("作者:");
scanf("%s",&(*New)->info.writer);
fwrite((*New)->info.writer,M,1,fp);

printf("出版社:");
scanf("%s",&(*New)->info.publisher);
fwrite((*New)->info.ISBN,N,1,fp);

printf("出版时间:");
scanf("%s",&(*New)->info.time);
fwrite((*New)->info.ISBN,N,1,fp);

printf("价格:");
scanf("%5f",&(*New)->info.price);
fwrite((*New)->info.ISBN,N,1,fp);
}

/********************************************************
函数功能:输出图书信息
*******************************************************/
void Print_book(Link *Head)
{
int i = 0;
Link p;
p = *Head;

printf("/*******************************************
管理系统所有的图书为: ");
if(p->next == NULL)
{
printf("没有图书! ");
}
while(p->next != NULL)
{
i++;
print(&p->next);//调用函数输出指针p所指向的图书的信息
p = p->next;
}
}

/**************************************************
函数功能:输出一本图书的信息
*************************************************/
void print(Link *L)
{
Link p;
p = *L;

printf("ISBN:%s ",p->info.ISBN);
printf("书名:%s ",p->info.name);
printf("作者:%s ",p->info.writer);
printf("出版社:%s ",p->info.publisher);
printf("出版时间:%s ",p->info.time);
printf("价格:%f ",p->info.price);

}

原文地址:https://www.cnblogs.com/wlp1115/p/6576568.html