8:添加图书:输入一本书的信息后,将它的信息添加到图书管理系统中 9:统计图书信息:根据输入的图书类别统计某一类图书的信息
10录入文件功能:将现有的图书信息直接输入到文件中或者将链表中的信息写入文件
11模糊查询功能:根据的一个汉字,这个字若被包含在书名中,就输出书的信息
(二) 详细设计
程序的主体设计思想是根据结构化程序设计思想分模块进行设计,有一个主函数并在主函数中调用各函数。
主函数先调用权限函数,然后要求使用者输入密码输入正确获得权限可继续,否者跳出,然后输出菜单,再用switch分支结构进行选择进入不同的分支来实现各项功能。
1、权限函数
定义一个标志变量flag让它的初值为0,用它来看输入者输入的密码是否正确,若正确令这个变量为1,并跳出for循环,返回函数值1;若输入3次密码还没对则返回函数值0,表示没有获得权限。
2、建立链表函数:
先让head=tail=NULL,在while循环中将将图书信息保存到p所指向的结点,若head==NULL,让head指针指向p;一个个节点上;若head!=NULL,将p接在当前尾结点后面去,将图书信息保存到链表上(尾插法)。
3、保存图书信息函数
保存文件函数先以“w”方式,打开文件,并将文件地址赋给一个指针,然后在while循环中从头结点开始,不断将图书信息写到文件中,直至到了链表最后的结点,关闭文件。
4、录入图书信息函数:
调用创建链表函数和将链表的信息保存到文件的函数将链表中的图书信息保存,可以从文件中直接录入信息或者现场编写信息保存。
5、输出图书信息函数:
在链表中操作,先令p指向头结点,并不断后移,直至p所指的内容为空在此过程中不断将p所指向的内容输出。 6、查找图书信息函数:
先利用一个标志变量判断输入的编号是否存在,若不存在,结束这个函数,存在就让p指向头结点,并不断后移,在此过程中将p->num与输入的编号比较,当找到符合条件的图书时,将它的信息全部输出。
7、根据条件将系统中的图书进行排序函数
可以选择根据图书的价格或者图书的名字在链表中对系统中的图书进行排序,利用价格进行排序时利用两个for循环,里面的for循环循环一次找到图书价格最小的图书并用附设的snall指针指向它,外循环中每次将small所指向的图书信息与当前外循环中p所指向的图书信息进行交换,并让p指向下一个节点,外循环结束后就完成了对系统中的图书进行排序,利用书名进行排序时原理差不多只是比较的对象变成了字符串。
8、添加图书信息函数
先让p指针指向head结点,并不断后移直到指向最后一个结点,然后为p分配一个相应的内存空间,将要加入的图书信息存到p结点中,然后将p结点加到链表最后面,然后将新的链表信息保存到文件中。 9、删除图书信息函数
先定义一个标志变量flag,0表示输入的图书编号不正确,1表示输入的编号正确可以进行删除操作,先遍历整个链表将图书的编号存入数组中,然后将输入的编号与存入数组的编号比较,若相等则令flag=1;并跳出循环,然后指针后移查找到满足条件的图书,并将其其前后节点相连,并将它的信息完全删除,输入的编号不存在就输出“输入的编号不正确”,并结束这个函数的运行,最后将链表中的信息保存到文件中去。
10、修改图书信息函数
先判断输入的编号在图书管理系统中是否存在,若不存在就输出“输入的编号不正确”,并结束函数的运行;当编号存在时,先遍历链表找到满足条件的结点,并将它的信息修改为要改成的信息。最后将链表中的信息保存到文件
11、统计某一类图书的信息函数
将链表中的种类名不断与输入的种类名比较,如果二者相同,就输出这本图书的信息,计数变量count加1,并令标志变量变为1;循环结束后,flag=0(初始时赋为0)表示没有与输入类别相符的图书,flag=1,表示有满足条件的书,count数量表示符合信息的书的本数。 12、根据关键字模糊查询图书信息
先将要查询的关键字保存在字符数组s中,在链表中从头结点开始循环,将每个节点的书名保存在c函数中,调用strstr函数,若数组s中的字符串在数组c中,就输出这本书的信息,否者继续循环。
#include
int num;
char bname[20];//书名 char wname[20];//作者 char pname[20];//出版社 char sort[20];//种类 int time;
int price;
struct booknode *next; };
int size=sizeof(struct booknode); int quanxian();//权限函数
struct booknode *lurubook();//录入信息 struct booknode *createlist();//创建图书链表
void save (struct booknode *head);//保存为文件(覆盖以前信息) void save1(struct booknode *p);//保存为文件(不覆盖以前信息) struct booknode *save2();//从文件中读取信息并生成链表
struct booknode *deletebook(struct booknode *head,int num );//删除图书信息
void xiugaibook(struct booknode *head,int num );//修改图书信息 void tianjiabook(struct booknode *head);//添加图书信息 void printbook(struct booknode *head);//输出图书信息
void seekbook(struct booknode *head,char bname[20]);//查找图书信息
void orderbook(struct booknode *head);//给图书排序
void tongjibookxinxi(struct booknode *head);//统计某一类图书信息 void mohucahxun(struct booknode *head);//模糊查询(根据在书中的关键字)
int main(void){//密码是tushuguan struct booknode *head,*tail,*p; head=tail=p=NULL; int t,choice,num; char bname[20]; t=quanxian(); if(t==0){
printf(\你还没有权限。\\n\ return 0;}
printf(\欢迎光临图书管理系统!*******************\\n\
printf(\录入图书 2;输出图书信息****************\\n\
printf(\查询图书信息******************\\n\
4:对图书排序
printf(\删除图书 6:修改图书********************\\n\
printf(\添加图书 8:统计图书信息****************\\n\
printf(\
退
出
9
模
糊
**************************************\\n\
do{
printf(\
scanf(\
switch(choice){
case 1: head=lurubook();break;
case 2: printbook(head);break; case 3: printf(\请输入书的名字:\
scanf(\ seekbook(head,bname);
break;
case 4: orderbook(head);
break;
case 5:printf(\请输入要删除的书的编号:\
scanf(\
head=deletebook(head,num);
break;
case 6:printf(\请输入要修改的书的编号:\
scanf(\
xiugaibook(head,num);
break;
case 7:tianjiabook(head);
break;
case 8:tongjibookxinxi(head);