单链表实现图书管理系统
数据结构_图书馆管理系统
湖南科技大学课程设计报告题目: 图书管理基本业务模拟院系:计算机科学与工程学院专业班级:计算机科学与技术一班学号: 0905010119学生姓名:张杰指导教师:李峰2010年12月31日一、问题分析图书馆基本业务模拟包含多方面的操作,其中本程序描述的是图书馆的新书入库、读者注册、图书馆借阅、归还、信息查询(含书籍信息查询和读者信息查询)等功能。
1)新书入库功能:新到书籍入库包含几方面的操作:查询该书名的书籍在图书馆信息中是否已经存在,若存在,则增加可借数量和书籍总量,若不存在,则新增加概述信息,从界面输入书籍的编号(0~999999的长整型)、书名(字符串类型)、该书作者名(字符串类型)、该书出版社信息(字符串类型)、出版日期(长整型)、该书的现存量(整型)、该书的总量(整型)。
输入该信息之后,将该节点插入到书籍信息链表中去。
该节点的插入位置根据查找,找到合适的位置插入,这样可以保证整个数据都是有序的,方便查找。
2)读者注册功能没有账号和密码读者和管理员都不能登录系统,本系统默认第一个注册系统的是系统管理员,借阅号为1000,权限是1,并输入自己基本信息,默认可借本数为10,并将所借书信息区全部置零。
不是第一个注册的读者,借阅号从1000往后顺延,自己设置密码,权限为0.,其余信息与管理员相同,但是登陆之后的界面,管理员可以看到“入库”菜单选项,普通读者不能看到该选项。
3)借阅功能书籍借阅主要涉及存书库和读者信息库双方的更新。
用户首先登陆系统,查询(3种查询方式)该书是否存在,该书的剩余数量是否大于零,最后查询该读者是否已经借满书籍。
若以上条件都满足,则将该书编号存入该读者的借阅信息区,将该读者的可借书数量减一,该存书的可借数量减一。
4)归还功能读者登录后按书名号来归还所借书籍,若书名号正确并且确认归还该书籍,则从读者的借书区删除该书籍,读者的课结束数量加一,将该书的可借数量增加一,然后返回。
5)信息查询功能信息查询分为读者信息查询和书籍信息查询,读者信息查询是在读者登录之后,可以显示本人的基本信息以及借书状况(所借书的本数、可借书本书以及所借书的信息),还可查询书籍信息,可根据书籍的编号来查找书籍、根据书名来查找书籍、根据作者名来查询书籍。
C语言实训图书管理链表结构
目录1、问题定义 (3)2、系统设计 (3)2.1 总体设计 (3)2.2 详细设计 (4)2.2.1数据结构设计 (4)2.2.2 主控main()函数执行流程 (5)2.2.3输入记录模块 (5)2.2.4输出记录模块 (5)2.2.5添加记录模块 (5)2.2.6删除记录模块 (6)2.2.7查询记录模块 (6)2.2.8函数功能描述 (6)3、系统实现 (7)3.1 编码 (7)3.1.1 程序预处理 (7)3.1.2 主函数main() (7)3.1.3 主菜单界面 (10)3.1.4 显示图书信息 (11)3.1.5增加图书信息 (11)3.1.6删除图书信息 (12)3.1.7查询图书信息 (14)3.2 测试与调试 (15)3.2.1 概述 (15)3.2.2 程序测试 (16)4、系统维护 (20)5、归纳总结 (20)5.1 开发经验 (20)5.2 实训中遇到的问题及解决方法 (20)5.3 设计中尚存的不足之处 (21)5.4 感想和心得体会 (21)图书管理02本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和单链表的各种基本操作。
本程序中涉及结构体、单链表等方面的知识。
通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握利用单链表存储结构实现对图书管理的原理,为进一步开发出高质量的管理信息系统打下坚实的基础。
1、问题定义创建一个图书信息管理系统。
假设系统中每本图书信息只包括编号、书名、作者名字、单价、出版社名字。
程序的运行效果如下图所示,选择菜单实现相应功能。
2、系统设计2.1 总体设计采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。
需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。
可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。
C语言用链表实现图书管理系统
C语⾔⽤链表实现图书管理系统基本要求:1)采⽤链式存储结构实现2)图书信息:每种书的登记内容包括书号、书名、著作者、现存量和库存量等信息;3)读者信息:每个读者的登记内容包括读者号、姓名、性别等信息4)借阅信息:每条借阅信息包括读者号、书号、借阅时间、归还时间5)系统主要功能如下:a)读者的增删改,图书信息的增删改,其中图书的增加(采编⼊库):新购⼀种书,确定书号后,登记到图书帐⽬表中,如果表中已有,则只将库存量增加;b)借阅:如果⼀种书的现存量⼤于0,则借出⼀本,在借阅信息中登记读者号、书号、借阅时间,改变图书现存量;c)归还:填写对应借阅记录的归还时间,改变该书的现存量。
d)查询:可查询书籍信息、读者信息、借阅信息等e)图书、读者、借阅信息均可保存在⽂件中,可从⽂件中调⼊学校实验专周⽐较⽔,出的都是⼀些⼩题⽬,从中挑了⼀个⼯程量最⼤的也只是这个⼩实验,然后我就尽量写的详细⼀点,把各个功能分开。
⽂件调⽤不是很熟悉,仓促学了⼀点⽪⽑就⽤上了,有兴趣以后⾃⾏扩展。
实验⼤致思路和顺序表差不多,多了⼀些链表基本操作,分别存储图书信息和读者信息,初始化并插⼊数据后开始⽤第三个结构体存储借阅信息,通过判断输⼊法内容和读者号、图书号是否⼀致来决定借阅成功或失败。
链式结构体中的数组是为了⽅便存储字符串。
#include <cstdio>#include <cstdlib>#include <string.h>#define ERROR 0#define OK 1#define MAXSIZE 50//字符串容纳最⼤长度 50typedef int Status;typedef int ElemType;//图书信息typedef struct Book{char book_id[MAXSIZE];//图书序号char book[MAXSIZE];//书名char author[MAXSIZE];//作者int num;//现存量int kucun;//库存量char read_id[MAXSIZE];//借阅者的idstruct Book *next;}LBook,*LinkBook;//读者信息typedef struct Reader{char read_id[MAXSIZE];//读者号char reader[MAXSIZE];//读者姓名char ssex[MAXSIZE];//读者性别// char borrow_book[10];struct Reader *next;}LReader,*LinkReader;//查阅信息typedef struct info{char book_id[MAXSIZE];//图书序号char book_name[MAXSIZE];//图书名称char read_id[MAXSIZE];//读者序号char reader[MAXSIZE];//读者名字char time1[MAXSIZE];//借阅时间char time2[MAXSIZE];//归还时间struct info *next;}*information,Info;Status InitBook(LinkBook &L){L=new Book;if(!L) return ERROR;L->next=NULL;L->kucun=0;L->num=0;return OK;}//初始化读者信息Status InitReader(LinkReader &L){L=new Reader;if(!L) return ERROR;L->next=NULL;return OK;}//初始化借阅信息Status Information(information &C){C=new Info;if(!C) return ERROR;//遍历图书信息void DisBook(LinkBook L){//不改动数值可以不引⽤&LBook *p;p=L->next;//指向第⼀个节点printf("开始展开所有图书信息\n");printf("------------------>\n");while(p)//p!=NULL{printf("图书序号:%s\n图书名称:%s\n图书作者:%s\n现存量:%d\n库存量:%d\n",p->book_id,p->book,p->author,p->num,p->kucun); printf("------------------>\n");p=p->next;}}//遍历读者信息void DisReader(LinkReader L){//不改动数值可以不引⽤&LReader *p;p=L->next;//指向第⼀个节点printf("开始展开所有读者信息\n");printf("------------------>\n");while(p)//p!=NULL{printf("读者号:%s\n姓名:%s\n性别:%s\n",p->read_id,p->reader,p->ssex);printf("------------------>\n");p=p->next;}}//遍历借阅信息void DisBorrow(information L) {Info *p;p=L->next;printf("展开所有订阅信息:\n");printf("------------------>\n");while(p)//p!=NULL{printf("图书:%s\n读者:%s\n借阅⽇期:%s\n归还⽇期:%s\n",p->book_name,p->reader,p->time1,p->time2);printf("------------------>\n");p=p->next;}}//删除读者操作Status DelReader(LinkReader &L,char *i){LReader *p=L;while(p->next)//{if(strcmp(p->next->read_id,i)==0){Reader *s=p->next;p->next=s->next;//p->next=p->next->nextdelete s;return OK;}p=p->next;}return ERROR;}//删除图书信息操作Status DelBook(LinkBook &L,char *i){LBook *p=L;while(p->next)//{if(strcmp(p->next->book_id,i)==0){Book *s=p->next;p->next=s->next;//p->next=p->next->nextdelete s;return OK;}p=p->next;}return ERROR;}//添加读者信息(前插法)--量插void AddReader(LinkReader &L,int n){LReader *p;L=new Reader;L->next=NULL;int i;p=L->next;printf("请输⼊读者号,姓名和性别:\n");for(i=n;i>0;--i){p=new Reader;scanf("%s %s %s",p->read_id,p->reader,p->ssex);}//初始添加图书信息(前插法)--单插Status AddBook(LinkBook &L,ElemType e){LBook *p;L=new Book;L->next=NULL;int i,j;p=L->next;for(i=0;i<e;i++){p=new LBook;p->num=p->kucun=0;printf("请选择图书编号和数量:\n");scanf("%s%d",p->book_id,&j);printf("请插⼊图书的名字和作者名:\n");scanf("%s%s",p->book,p->author);p->num+=j;p->kucun+=j;p->next=L->next;L->next=p;}}//Insert 后续添加图书Status InsertBook(LinkBook &L,char *n,ElemType e) {LBook *p,*s;p=L->next;while(p){if(strcmp(p->book_id,n)==0){//如果存在过这本书p->kucun+=e;p->num+=e;return OK;}p=p->next;}p=new LBook;p->num=p->kucun=0;printf("请插⼊图书的名字和作者名:\n");scanf("%s%s",p->book,p->author);p->num=e;p->kucun=e;p->next=L->next;L->next=p;}//后续添加读者号Status InsertReader(LinkReader &L,char *n) {LReader *p,*s;p=L->next;while(p){if(strcmp(p->read_id,n)==0){//如果读者号已存在printf("该账户已经被注册!\n");return OK;}p=p->next;}p=new LReader;strcpy(p->read_id,n);printf("请插⼊读者的名字和性别:\n");scanf("%s%s",p->reader,p->ssex);p->next=L->next;L->next=p;}//按图书序号查找图书信息Status GetBook(LinkBook L,char *n){LBook *p = L->next;while(p)//p!=NULL{if(strcmp(p->book_id,n)==0){printf("查找的结果为:\n");printf("图书序号:%d\n图书名称:%s\n图书作者:%s\n现存量:%d\n库存量:%d\n",p->book_id,p->book,p->author,p->num,p->kucun); printf("------------------>\n");return OK;}p=p->next;}printf("没找到该图书,请核对输⼊是否正确\n");}//搜索图书序号修改图书信息Status AlterBook(LinkBook L,char *n){LBook *p = L->next;while(p)//p!=NULL{if(strcmp(p->book_id,n)==0){printf("图书查到,请修改:\n");printf("书名为:%s\n请修改:",p->book);scanf("%s",p->book);printf("作者:%s\n请修改:",p->author);scanf("%s",p->author);printf("现存量和库存量为%d和%d\n请修改:",p->num,p->num);scanf("%d,%d",&p->num,&p->kucun);printf("------------------>\n");return OK;}p=p->next;}printf("没找着该图书,请重新检查!\n");return ERROR;}//按读者号查找读者信息Status GetReader(LinkReader L,char *n){LReader *p = L->next;while(p)//p!=NULL{if(strcmp(p->read_id,n)==0){printf("查找的结果为:\n");printf("读者号:%s\n姓名:%s\n性别:%s\n",p->read_id,p->reader,p->ssex); printf("------------------>\n");return OK;}p=p->next;}printf("没找到该读者,请核对输⼊是否正确\n");}//通过读者号修改读者信息Status AlterReader(LinkReader L,char *n){LReader *p = L->next;while(p)//p!=NULL{if(strcmp(p->read_id,n)==0){printf("读者信息查到,请修改:\n");printf("读者号:\n");scanf("%s",&p->read_id);printf("读者名:\n");scanf("%s",p->reader);printf("读者性别:\n");scanf("%s",p->ssex);printf("------------------>\n");return OK;}p=p->next;}printf("没找到该读者,请核对输⼊是否正确\n");}//借阅书Status Borrow(LinkBook &L,LinkReader &S,information &C ){LBook *p=L->next;LReader *q=S->next;Info *s=C->next;char n[10],m[10];printf("请输⼊读者证号和图书号进⾏借阅:\n");scanf("%s%s",m,n);while(p){if(strcmp(p->book_id,n)==0){s=new Info;strcpy(s->book_id,n); //字符串赋值,需要函数strcpy(s->book_name,p->book);if(p->kucun>0){//判断是否还有库存p->kucun--; //借⾛了,该书库存-1}else {printf("这本书已经被借完了!\n");delete s;return ERROR;}break;}p=p->next;}while(q){if(strcmp(q->read_id,m)==0){strcpy(s->read_id,m);//字符串赋值strcpy(s->reader,q->reader);// strcpy(q->borrow_book,p->book);break;}printf("读者号或者图书号错误,请检查输⼊是否有误!\n");return ERROR;}printf("请填写借阅和归还⽇期:\n");scanf("%s%s",s->time1,s->time2);s->next=C->next;C->next=s;return OK;}//归还书Status Return(LinkBook &L,LinkReader &S,information &C ){LBook *p=L->next;LReader *q=S->next;Info *s=C->next;char n[10],m[10];printf("请输⼊读者证号和图书号进⾏归还:\n");scanf("%s%s",m,n);while(p){if(strcmp(p->book_id,n)==0){s=new Info;strcpy(s->book_id,"已归还"); //原来的信息填写为已归还,做个记录,也可以删掉都⾏啊;strcpy(s->book_name,"已归还");//删掉代码:略了p->kucun++; //归还了,库存+1Info *S=C;Info *P=S->next;S->next=P->next;delete P;break;while(q){if(strcmp(s->read_id,m)==0){// strcpy(q->borrow_book,"暂⽆");strcpy(p->book_id,0);return OK;}q=q->next;}}p=p->next;}return ERROR;}//保存到txt中 --路径默认选择到我的桌⾯,可更改void saveBook(LinkBook L,LinkReader S,information &C) {FILE *fp=NULL;LBook *p=L->next;LReader *q=S->next;Info *s=C->next;fp=fopen("C:/Users/23211/Desktop/books.txt","w+");while(p){fprintf(fp,"%s %s %s %d %d\n",p->book_id,p->author,p->book,p->num,p->kucun);p=p->next;}fp=fopen("C:/Users/23211/Desktop/Readers.txt","w+");while(q){fprintf(fp,"%s %s %s\n",q->read_id,q->reader,q->ssex);q=q->next;}fp=fopen("C:/Users/23211/Desktop/Borrow.txt","w+");while(s){fprintf(fp,"%s %s %s %s %s %s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2);s=s->next;}printf("更新完成!\n");}//从⽂件中读取void ReadBook(LinkBook L,LinkReader S,information &C) {LBook *p=L->next;LReader *q=S->next;Info *s=C->next;p=new LBook;q=new LReader;s=new Info;FILE * fp=NULL;printf("--------------------------------------------------->\n");printf("展开图书信息:\n");fp=fopen("C:/Users/23211/Desktop/books.txt","r");while(fscanf(fp,"%s%s%s%d%d",p->book_id,p->author,p->book,&p->num,&p->kucun)!=EOF){printf("图书序号:%s,作者:%s,书名:%s,数量:%d,库存:%d\n",p->book_id,p->author,p->book,p->num,p->kucun); p-p->next;}printf("--------------------------------------------------->\n");printf("展开读者信息:\n");fp=fopen("C:/Users/23211/Desktop/Readers.txt","r");}printf("--------------------------------------------------->\n");printf("展开借阅信息\n");fp=fopen("C:/Users/23211/Desktop/Borrow.txt","r");while(fscanf(fp,"%s%s%s%s%s%s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2)!=EOF){printf("图书号:%s\n,图书名:%s\n,读者号:%s\n,读者姓名:%s\n,借阅⽇期:%s\n,归还⽇期:%s\n",s->book_id,s->book_name,s->read_id,s->reader,s->time1,s->time2); s=s->next;}printf("--------------------------------------------------->\n");printf("提取完成完成!\n");}void function(){//功能菜单printf("<------------------------------------------------>\n");printf("<-----------0-欢迎来到鳝溪校区阅览室!-0---------->\n");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("<---------------10.查询读者信息------------------>\n");printf("<---------------11.查询图书信息------------------>\n");printf("<---------------12.查询借阅信息------------------>\n");printf("<---------------13.导出读者、图书和借阅信息------>\n");printf("<---------------14.导⼊读者,图书和借阅信息------>\n");printf("<---------------15.查看功能菜单------------------>\n");printf("<---------------16.添加图书信息------------------>\n");printf("<---------------17.添加读者信息------------------>\n");printf("<---------------18.归还图书---------------------->\n");printf("<-------------------0.退出----------------------->\n");}void tool(LinkBook L,LinkReader S,information &C){//功能实现int i,choose;char n[MAXSIZE];ElemType e;while(1){printf("请输⼊你要选择的功能:\n请选择:");scanf("%d",&choose);switch(choose){case 1:printf("请插⼊多少种不同的图书:\n");scanf("%d",&e);AddBook(L,e);break;case 2:printf("请选择插⼊读者数量:\n");scanf("%d",&e);AddReader(S,e);break;case 3:DisBook(L);break;case 4:DisReader(S);break;case 5://添加读者借阅信息if(Borrow(L,S,C))printf("添加成功!\n");else printf("添加失败!\n");break;case 6:printf("请输⼊要删除的读者号:\n");scanf("%s",n);if(DelReader(S,n)){printf("删除成功!\n");}else{printf("该读者号不存在,请检查是否有这个读者号!\n");}break;case 7:printf("请输⼊要删除的图书序号:\n");scanf("%s",n);if(DelBook(L,n)){printf("删除成功!\n");}else{printf("该图书不存在,请检查是否有这个图书号!\n");}break;AlterReader(S,n);break;case 9:printf("请输⼊要修改的图书号:\n");scanf("%s",n);AlterBook(L,n);break;case 10:printf("请输⼊要查询的读者号:\n");scanf("%s",n);GetReader(S,n);break;case 11:printf("请输⼊要查询的图书序号:\n");scanf("%s",n);GetBook(L,n);break;case 12://遍历借阅信息DisBorrow(C);break;case 13://导出读者、图书和借阅信息saveBook(L,S,C);break;case 14://导⼊读者、图书和借阅信息ReadBook(L,S,C);break;case 15://功能菜单function();break;case 16:printf("插⼊图书信息:\n");printf("请输⼊图书号和数量:\n");scanf("%s%d",n,&e);InsertBook(L,n,e);break;case 17:printf("插⼊读者信息:\n");printf("请输⼊读者号:\n");scanf("%s",n);InsertReader(S,n);break;case 18://归还Return(L,S,C);break;case 0://退出程序printf("拜拜!\n");exit(0);default:printf("不在选择范围内,更多功能请等待扩展。
图书管理系统链表课设完美版
课程设计报告( 2012-- 2013年度第1学期)课程设计名称:高级语言程序设计(C)题目:基于文件存储的学生大体信息管理系统院系:控制与运算机工程学院班级:创自1201学号:19学生姓名:唐骞指导教师:林碧英设计周数:一周成绩:日期:2013年1月2日一、课程设计的目的与要求1.课程设计目的掌握数据结构的分析、设计与实现的大体方式,提高程序设计能力。
2. 课程设计要求(1) 同一个题目,别离采用结构体数组和单向链表完成,结构体数组和单向链表中的数据用文件存储;(2) 一个操作对应一个函数;(3) 编程语言选用C;(4) 所有操作用菜单提示,界面要求友好、操作方便;(5) 按照设定的功能,用一组数据测试,验证功能的正确性。
二、设计正文一、课程设计题目进行文件的链表操作,包括读取、创建、修改、删除等二、需求分析本系统主要实现了图书馆内管理的一般功能,包括查询、添加、删除、修改图书信息等。
所设计的系统以菜单方式工作,为用户提供清楚的利用提示,依据用户的选择来进行各类处置,图书信息包括编号、书名、作者、出版社、价钱等。
录入的图书信息用文件形式保留,并能够对其进行阅读、查询、修改、删除等大体操作。
3、概要设计本程序包括9个函数:①主函数main()②初始化单链表函数LINK creat(),LINK linkc()③显示操作菜单函数menu()④显示单链表内容函数void show(LINK head);⑤插入元素函数void add(LINK head);⑥删除元素函数void dele(LINK head);⑦查找元素函数int checkn(LINK head);⑧保留函数void save(LINK head);⑨修改函数void change(LINK head);包括关系如下4、详细设计结点类型和指针类型typedef struct book{char shuhao[31];char name[31];char writer[31];char publisher[31];float price;int remain;}BOOK;typedef struct link{BOOK a;struct link *next;}NODE,*LINK;单链表的大体操作LINK creat(),LINK linkc() void show(LINK head); void add(LINK head); void dele(LINK head);int checkn(LINK head); void save(LINK head); void change(LINK head);五、调试分析一、菜单界面二、显示3、保留4、修改五、查询一、按出版社查询二、按书名查询3、按作者查询三、课程设计总结或结论回顾这次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,能够学到很多很多的东西,同时不仅能够巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
图书管理系统链表实现
ci n.get();
system("cls");
goto begi n;
}
showbook(head);
}
else if(str[O] == 3){
if(head == NULL){
cout << "你的图书是空的,请增加图书"<<endl;
cout <<"按回车键返回主程序"<<endl;
book *l;
while(head){
l = head;
head = head -> n ext;
}
list -> num二num;
list -> price = price;
list -> next = NULL;
l -> n ext = list;
}
int getBookNum(book *head){ int num = 0;
head = head -> n ext;
}
}
void Delete(book *head, int num){II删除图书
book *l;
if(head -> num == nu m){
l = head;
head = head -> n ext;
::head = head;〃双冒号是全局操作符,表示head是全局变量
cout <<"操作成功!!!"<< endl; return;
}
head = head -> n ext;
}
cout << "找不到要删除的图书编号"<<endl;
图书馆管理系统查询部分详细
4.4查询图书信息Searchbook( )void searchbook(head){int op;printf(“1按书名查找\n2按作者查找\n3按出版社查找\n4按出版日期查找5按ISBN查找\n6 按图书定价查找\n”)scanf(“%d”,&op);switch(op){case 1:void Name(head);break;case 2:void Writer(head);break;case 3:void Publisher(head);break;case 4:void Data(head);break;case 5:void Num(head);break;case 6:void Price(head);break;}}4.4.1按书名查找。
Name( )进入查询子菜单,输入查找的书名,按书名对单链表中的图书信息进行查询。
void Name(Book *head){Book *p;/*移动指针*/char s[80];printf(”输入要查询的图书名:\n");scanf(”%s",&s);p=head;/*将头指针赋给p*/while(p-〉next!=NULL){while(strcmp(p—> Name,s)) /*当记录的图书名不是要找的,或指针不为空时*/{p=p-〉next;/*移动指针,指向下一结点*/}if(!(strcmp(p-> Name,s))){printf("书名\t作者\tIBSN\t出版社\t出版日期\t价格\n”);printf(”%s%s%s%s%s%f”,p—>name,p->writer,p—〉num,p—〉data,p—>price);p=p-〉next;}elseprintf("没有书名为%s的图书.\n”,s);/*显示没有该书*/}}4.4.2 按作者查找。
图书管理系统
图书管理系统--链表的学习和操作包含文件操作用途:图书管理实现方式:C语言单链表结构;书的数据包括书名,作者,位置,数量;下图为软件功能源文件是使用vs2019编写,所以如果复制进vs2019格式会更清晰些。
如果是linux平台需要删除system(“pause”)和system(“cls“)语句关于这里面源代码的问题,可以加1809913712,备注图书管理进行询问以下是具体代码的实现:#pragma once#include<stdio.h>#include<stdlib.h>#include<string.h>#define _strsize 20 //定义书名等的长度#define arrsize 7 //定义函数数组的长度typedef struct bookdata //一本书的相关数据{char name[_strsize]; //书名char author[_strsize]; //作者char posn[_strsize]; //所在位置int total; //库里面的本数}bookdata;typedef struct book //单链表的节点{bookdata data; //书的数据struct book* pnext; //指向下一个节点的指针变量}book,*pbook;typedef struct list //单链表{pbook head; //单链表的头指针pbook tail; //单链表的尾指针int count; //用于计数链表内图书的本数(一个名称为一本,多本同名书不重复记录)}list, *plist;void printhead(plist booklist); //打印菜单plist creatlist(); //创建单链表pbook cbook(); //创建一本书int IsEmpty(plist booklist); //判断链表是否为空void tarlist(plist booklist); //遍历链表void insertbyhead(plist booklist); //插入节点void borrow(plist booklist); //修改节点(借阅库里图书减1)void returnbook(plist booklist); //修改节点(归还库里图书加1)void delete(plist booklist); //删除节点void readfile(plist booklist); //打开数据文件void savefile(plist booklist); //保存数据文件void quit(plist booklist); //退出系统void search(plist booklist); //查找图书void clearbuf(); //清空缓存区pbook cbook() //创建单本书节点{pbook newbook = (pbook)malloc(sizeof(book)); //申请内存空间if (NULL == newbook) //初始化内存{printf("内存分配失败");exit(0);}else{bookdata ebook; //书数据录入printf("输入数据:\n \t1:Name\t2:Author\t3:Position\t4:Total \n"); //提示录入scanf("%s %s %s %d", ,ebook.author, ebook.posn,&ebook.total); //录入newbook->data = ebook; //将书的数据赋值进节点newbook->pnext = NULL; //下一节点赋值为空}return newbook;}plist creatlist() //创建链表{plist booklist = (plist)malloc(sizeof(list)); //申请空间if (NULL == booklist) //初始化printf("内存分配失败");else{booklist->head = NULL; //头节点为空booklist->tail = NULL; //尾节点为空booklist->count = 0; //数据节点数为0}return booklist;}int IsEmpty(plist booklist) //判断链表是否为空{if (booklist->count == 0) //节点数为0,就是空;return 1;elsereturn 0;}//借阅void borrow(plist booklist){char name[_strsize]; //定义借阅书籍的名称printf("Please Enter the book name: ");scanf("%s", name); //输入借阅书籍的名称pbook pmove = booklist->head; //定义临时变量用于遍历while (strcmp(pmove->, name) != 0) //循环查找同名书籍{pmove = pmove->pnext;}if (NULL == pmove) //如果临时变脸为空,即表示未找到相关书籍printf("No Such Book\t");else//找到相关书籍,对同名书籍数量减1pmove->data.total--;}//归还void returnbook(plist booklist){char name[_strsize]; //定义归还书籍的名称printf("Please Enter the book name: ");scanf("%s", name); //输入归还书籍的名称pbook pmove = booklist->head; //定义临时节点变量用于遍历while (strcmp(pmove->, name)!=0){pmove = pmove->pnext;}if (NULL == pmove) //临时变量为空未找到数据printf("No Such Book\t");elsepmove->data.total++; //找到数据,对同名书籍数量+1}//浏览void tarlist(plist booklist){pbook pmove = booklist->head; //定义临时变量用于遍历printf("\tName\t\tAuthor\t\tPosition\tTotal\n");while (pmove) //遍历打印所有图书{printf("\t%-16s%-16s%-16s%-16d\n", pmove->,pmove->data.author, pmove->data.posn,pmove->data.total);pmove = pmove->pnext;}printf("\n\n");}//添加void insertbyhead(plist booklist){int k;//定义一个整型变量用于接收插入方式printf("Operation Way:\n 1 Byhead\n 2 Bytail\n");scanf("%d", &k);pbook newbook; //定义新书节点switch (k){case 1://头插法newbook = cbook(); //创建书籍节点if (IsEmpty(booklist)) //链表为空时{booklist->head = newbook; //新节点就是链表的头节点booklist->tail = newbook; //因只有一个节点,所以新节点也是尾节点booklist->count++; //异名书籍+1}else//链表不为空{newbook->pnext = booklist->head; //新节点的下一节点指向头节点booklist->head = newbook; //改变头节点的标识为新节点,即新节点为头节点booklist->count++; //异名书籍+1}break;case 2://尾插法newbook = cbook();if (IsEmpty(booklist)) //链表为空时booklist->head = newbook; //新节点就是链表的头节点elsebooklist->tail->pnext = newbook; //链表不为空时,尾节点的下一节点指向新节点booklist->tail = newbook; //改变尾节点标识为新节点,即新节booklist->count++; //异名书籍+ 1break;default:printf("Wrong Enter");break;}}//删除void delete(plist booklist){char name[_strsize]; //定义需要删除的书名printf("Please Enter the book name to delete: ");scanf("%s", name);pbook pmove, ptemp; //定义两个临时变量用于遍历if (booklist->head == NULL) //判断链表是否为空{printf("No book in the system");return;}else if (strcmp(booklist->head->, name) == 0) //头节点为要删除节点{pmove = booklist->head; //临时变量指向头节点booklist->head = booklist->head->pnext; //删除头节点,即让将头节点的下一节点赋值给头节点free(pmove);//释放旧的头节点空间}else{pmove = booklist->head; //两个临时变量均指向头节点ptemp = booklist->head;while (strcmp(pmove->, name) != 0) //循环遍历{ptemp = pmove;//先移动节点赋值给后移动节点pmove = pmove->pnext; //移动先移动节点,是的后移动的节点的下一个指向先移动的节点if (NULL == pmove) //先移动节点为空时,未找到图书{printf("No such Book\n");return;}if (strcmp(booklist->tail->, pmove->) == 0) //当尾节点数据为要删除数据时{ptemp->pnext = pmove->pnext; //后移动节点的下一个指向空booklist->tail = ptemp; //尾节点指向后移动节点free(pmove); //释放旧的尾节点空间}ptemp->pnext = pmove->pnext; //当删除数据不是头尾节点时,后移动节点指向先移动节点的下一个节点free(pmove); //释放删除的数据节点的空间}booklist->count--; //减一本书}//查找void search(plist booklist){char searchname[_strsize]; //定义查找书名printf("Please Enter the Name of book: ");scanf("%s", searchname);pbook movebook; //定义临时变量用于遍历movebook = booklist->head; //临时变量等于头节点while (movebook){if (strcmp(movebook->,searchname)==0) //找到数据,打印全部数据{printf("\tName:\t\t %s\n\tAuthor:\t\t %s\n\tPosition:\t %s\n\tTotal:\t\t %d\n", movebook->, movebook->data.author, movebook->data.posn, movebook->data.total);return;}movebook = movebook->pnext; //循环赋值}if (movebook == NULL) //未找到数据,打印提示信息printf("\tNo Such Book\n");}//退出void quit(plist booklist){savefile(booklist); //退出先保存exit(0); //退出命令}//清空缓存区void clearbuf(){char ch;doch = getchar(); //对ch循环使用gechar 来清空缓存while (ch != 0 && ch != '\n');}void printhead(plist booklist){printf("\t\t");for (int i = 0; i < 80; i++)printf("*");printf("\n\t\t\t\tWelcom to the library manage system ");printf("\n\t\t");for (int i = 0; i < 80; i++)printf("-");printf("\n\t\t\t\t\t Operation code:\n");printf("\n\t\t\t\t\t 1: Borrow\n\n\t\t\t\t\t 2: Return\n\n\t\t\t\t\t 3: Browse\n\n\t\t\t\t\t 4: Insert\n\n\t\t\t\t\t 5: Delete\n\n\t\t\t\t\t 6: search\n\n\t\t\t\t\t 7: quit\n");printf("\n\t\t");for (int i = 0; i < 80; i++)printf("*");printf("\n\t\tTotal %d books in system", booklist->count);printf("\n\t\tPlease enter the operation number : ");}void readfile(plist booklist){FILE* libry = fopen("library.dat", "r"); // 定义文件指针,并以只读的方式打开文件名为library.dat的文件if (libry == NULL)libry = fopen("library.dat", "w"); //如果没有这个文件就创建文件bookdata ebook; //创建一个书的数据结构体,用于接收文件数据while (fscanf(libry, "%s\t%s\t%s\t%d\n", ,ebook.author,ebook.posn,&ebook.total) != EOF)//循环接收文件数据{pbook ptemp = (pbook)malloc(sizeof(book)); //创建节点ptemp->data = ebook; //将数据结构体赋值给链表节点的数据域ptemp->pnext = NULL; //节点的指针域为空if(booklist->head==NULL) //尾插法创建整个链表,这里如果使用头插法整个链表的的顺序会每次发生反转booklist->head = ptemp;elsebooklist->tail->pnext = ptemp;booklist->tail = ptemp;booklist->count++;}fclose(libry); //数据取到后关闭文件}//保存文件void savefile(plist booklist){FILE* libry = fopen("library.dat", "w"); //以写的方式打开library.dat文件pbook ptemp = booklist->head;while (ptemp){fprintf(libry, "%s\t%s\t%s\t%d\n", ptemp->, ptemp->data.author, ptemp->data.posn, ptemp->data.total); //以结构体的方式写入文件ptemp = ptemp->pnext;}fclose(libry); //写入完成后关闭文件}int main(){plist booklist = creatlist(); //创建链表readfile(booklist); //打开文件void (*p[arrsize])(plist) = { borrow,returnbook,tarlist,insertbyhead,delete,search,quit}; //创建函数数组,实现相关功能while (1){int k; //定义菜单编号printhead(booklist); //打印菜单scanf("%d", &k);if (k >= 1 && k <= arrsize) //菜单数据范围p[k - 1](booklist);else//防止错误输入{printf("Wrong Enter\n");clearbuf(); //清空缓存,以便接收下一次输入}system("pause");system("cls");}return 0;}。
C语言单链表实现图书管理系统
C语⾔单链表实现图书管理系统本⽂实例为⼤家分享了C语⾔单链表实现图书管理系统的具体代码,供⼤家参考,具体内容如下单链表实现的图书管理系统相⽐于结构体实现的管理系统,可以随时开辟新的空间,可以增加书的信息单链表的实现⾸先肯定还是打印单链表的常规操作,创建表头,创建节点,表头法插⼊,特定位置删除,打印链表struct book{char name[20];float price;int num; //书的数量};//3 数据容器——链表struct Node{struct book data;struct Node*next;};void printflist(struct Node*headnode);struct Node*headnode = NULL;//创建表头struct Node*createlisthead(){//动态内存申请struct Node*headnode = (struct Node*)malloc(sizeof(struct Node));//变量的基本规则:使⽤前必须初始化headnode->next = NULL;return headnode;}//创建节点,为插⼊做准备//把⽤户的数据变为结构体变量struct Node* createnewnode(struct book data){struct Node*newnode = (struct Node*)malloc(sizeof(struct Node));newnode->data = data;newnode->next = NULL;return newnode;}//表头法插⼊void insertbyhead(struct Node*headnode, struct book data){struct Node* newnode = createnewnode(data);//必须先连后断newnode->next = headnode->next;headnode->next = newnode;}//指定位置删除void deletenodebyname(struct Node*headnode, char *bookname){struct Node*posleftnode = headnode;struct Node*posnode = headnode->next;//字符串⽐较函数while (posnode != NULL && strcmp(posnode->,bookname)){posleftnode = posnode;posnode = posnode->next;}//讨论结果if (posnode == NULL){printf("未找到数据");return ;}else{posleftnode->next = posnode->next;free(posnode);posnode = NULL;}printflist(headnode);}//查找书籍struct Node*searchbyname(struct Node*headnode, char *bookname){struct Node *posnode = headnode->next;while (posnode != NULL &&strcmp(posnode->, bookname)){posnode = posnode->next;}return posnode;}//打印链表——从第⼆个节点开始打印void printflist(struct Node*headnode){struct Node* pmove = headnode->next;printf("书名\t价格\t数量\n");while (pmove!=NULL){printf("%s\t%.1f\t%d\n", pmove->,pmove->data.price,pmove->data.num );pmove = pmove->next;}printf("\n");}冒泡排序——通过价格第⼀个for循环表⽰遍历次数,第⼆个for循环使相邻的两个元素进⾏⽐较并交换1 ⽐较条件⾥,只⽤q指针即可2 交换时需要创建⼀个临时变量//冒泡排序算法void bubblesortlist(struct Node*headnode){for (struct Node*p = headnode->next; p != NULL; p = p->next){for (struct Node*q = headnode->next; q->next != NULL; q = q->next){if (q->data.price > q->next->data.price){//交换struct book tempdata = q->data;q->data = q->next->data;q->next->data = tempdata;}}}printflist(headnode);}如果不储存信息,那么每次在输⼊信息完毕后关闭控制台,信息⽆法保留,所以我们通过⽂件的⽅式来储存信息⽂件写操作1 通过创建节点指针变量来遍历输出⽂件中的信息2 通过fprintf可以将输⼊的信息保持下来//写操作void savefile(const char*filename, struct Node*headnode){FILE*fp = fopen(filename, "w");struct Node*pmove = headnode->next;while (pmove != NULL){fprintf(fp, "%s\t%.1f\t%d\n", pmove->, pmove->data.price, pmove->data.num);pmove = pmove->next;}fclose(fp);fp = NULL;}⽂件读操作1 当⽤ “r”的形式打开⽂件失败时,说明没有此⽂件,则可以⽤“w+”的形式打开,当没有⽂件时,会创建⼀个⽂件2 把读取出的数据以表头法插⼊到链表中则可以再次打印出信息//⽂件读操作void readfile(const char *filename, struct Node*headnode){FILE*fp = fopen(filename, "r");if (fp == NULL){//不存在⽂件则创建fp = fopen(filename, "w+");}struct book tempdata;while (fscanf(fp, "%s\t%f\t%d\n", , &tempdata.price, &tempdata.num) != EOF){insertbyhead(headnode, tempdata);}fclose(fp);fp = NULL;}剩余代码1 当查找书籍时先⽤临时指针接受找到书籍的指针,然后再打印书籍信息//1 界⾯void menu(){printf("---------------------------------\n");printf("\t图书管理系统\n");printf("\t0.退出系统\n");printf("\t1.登记书籍\n");printf("\t2.浏览书籍\n");printf("\t3.借阅书籍\n");printf("\t4.归还书籍\n");printf("\t5.书籍排序\n");printf("\t6.删除书籍\n");printf("\t7.查找书籍\n");printf("---------------------------------\n");printf("请输⼊0~7\n");}//2 做交互void keydown(){int input = 0;struct book tempbook; //创建临时变量,存储书籍信息struct Node*result = NULL; //创建临时指针变量,指向查找书籍的节点scanf("%d", &input);switch (input){case 0:printf("【退出】\n");printf("退出成功\n");system("pause");exit(0); //关闭整个程序break;case 1:printf("【登记】\n");printf("输⼊书籍的信息(name,price,num)");scanf("%s%f%d", , &tempbook.price, &tempbook.num);insertbyhead(headnode, tempbook);savefile("book.txt", headnode);break;case 2:printf("【浏览】\n");printflist(headnode);break;case 3:printf("【借阅】\n"); //书籍存在,数量-1printf("请输⼊要借阅的书籍");scanf("%s", );result = searchbyname(headnode, );if (result == NULL){printf("没有相关书籍,⽆法借阅");}else{if (result->data.num > 0){result->data.num--;printf("借阅成功");}elseprintf("⽆库存");}break;case 4:printf("【归还】\n"); //书记归还,数量+1printf("请输⼊要归还的书籍");scanf("%s", );result = searchbyname(headnode, );if (result == NULL)printf("来源⾮法");else{result->data.num++;printf("书籍归还成功!");}break;case 5:printf("【排序】\n");bubblesortlist(headnode);savefile("book.txt", headnode);break;case 6:printf("【删除】\n");printf("输⼊要删除的书名");scanf("%s", );deletenodebyname(headnode, );savefile("book.txt", headnode);break;case 7:printf("【查找】\n");printf("请输⼊要查找的书籍");scanf("%s", );result = searchbyname(headnode, );if (result == NULL){printf("未找到相关信息!\n");}else{printf("书名\t价格\t数量\n");printf("%s\t%.1f\t%d\t", result->, result->data.price, result->data.num); }break;default:printf("选择错误,请重新选择:>");break;}}int main(){headnode = createlisthead();readfile("book.txt", headnode);while (1){menu();keydown();system("pause");system("cls");}system("pause");return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
课程设计——图书借阅管理系统
数据结构课程设计说明书要求:实现图书馆的增加图书、查询图书、删除图书、借阅图书、还书;增加会员、查询会员、删除会员、借书信息、到期书催还等智能化管理过程。
一、问题描述图书借阅管理系统是一个学校不可缺少的部分,它的内容对于学校的管理者和读者来说都至关重要,直接关系到图书的借用率,所以开发图书管理系统能够为管理员和读者提供充足的信息和快捷的查询手段。
编写程序系统主要实现图书馆的增加图书、查询图书、删除图书、借阅图书、还书;增加会员、查询会员、删除会员、借书信息、到期书催还等智能化管理过程。
二、实验目的1.强化和巩固理论基础,掌握编程技巧,为后续的专业课学习打下良好的基础;2.要求用C/C++语言及相应开发环境,实现一个小型完整程序的设计与开发;3.巩固深化所学课程的知识,培养学生运用知识,分析和解决实际问题的能力。
三、设计过程3.1 系统需求分析图书借阅管理系统主要分为两大功能:(1)图书管理(增加图书、查询图书、删除图书、图书借阅、还书到期书催还);(2)会员管理(增加会员、查询会员、删除会员、借书信息);要完成这个题目,主要是建立解决图书和会员的信息的存储,解决的方法是建立两个带头结点的单链表,分别用于存储图书和会员。
解决了这个问题后就是如何建立这两个链表的联系了,解决的方法是在图书结点中设一个借书人编号,在会员结点中设一个数组用于存会员借的书。
解决了这两个问题,剩下的工作就简单了。
只需按链表的操作就可以了。
3.1.1 功能要求在图书借阅管理程序中须实现以下功能:(1)图书修改功能:能对图书借阅系统存储的信息进行修改。
提供两种修改方式,如按照图书编号修改、按照书名修改。
图书编号是图书记录的自然顺序编号。
(2)图书删除功能:能对图书借阅系统的图书信息进行删除。
删除时以记录为单位,能一次删除一条记录。
(3)借书功能:能对借出的图书作记录信息,能一次借出一本图书。
(4)还书功能:能将被借出的图书信息还原,能一次借出一本图书。
图书管理系统链表
图书管理系统链表#include#include //控制台数据输入输出的函数#include//文件流#include //控制数据输出格式#includeconst int Maxr=100 ;//最多的读者数const int Maxb=100; //最多的图书数const int Maxbor=5; //每位读者最多借的书class Book{//图书类,实现对图书的描述,图书的编号,书名,借出,还入等功能private:int tag; //删除标记 1:已删 0:未删int no; //图书编号char name[20]; //书名char author[20];//作者char fenlei[20];//分类号char cbs[20]; //出版社int cbtime;//出版时间double bookprice;//图书价格int onshelf; //是否再架 1:再架 2:已借public:Book(){;}char *getname(){//获取书名return name;}char *getauthorname() {//获取作者名return author;}char *getfenlei(){//获取分类号return fenlei;}char *getcbsname() {//获取出版社名return cbs;}int getcbtime(){//获取出版时间return cbtime;}double getbookprice() {//获取图书价格return bookprice;}int getno(){//获取图书编号return no;}int gettag(){//获取删除标记return tag;}void setname(char na[]){//设置书名strcpy(name,na);}void setauthorname(char aa[]) {//设置作者名strcpy(author,aa);}void setfenlei(char fe[]){//设置分类号strcpy(fenlei,fe);}void setcbs(char ca[]){//设置出版社strcpy(cbs,ca);}void setcbtime(int time){//设置时间cbtime=time;}void setbookprice(double price) {//设置图书价格bookprice=price;}void setonshelf(int oa){onshelf=oa;}void delbook(){//删除图书char i;cout<<"确定删除吗?Y/N ?"<<endl;cin>>i;if(i=='y'||i=='Y')tag=1;}void addbook(int n,char *na,char *aa,char *fe,char *ca,int time,double price,int oa){//增加图书tag=0;no=n;strcpy(name,na);strcpy(author,aa);strcpy(cbs,ca);strcpy(fenlei,fe);cbtime=time;bookprice=price;onshelf=oa;}int borrowbook(){//借书操作if (onshelf>0){onshelf--;return 1;}}void retbook(){//还书操作onshelf++;}void disp(){//输出图书cout<<setw(3)<<no<<setw(10)<<name<<setw(10)<<auth or<<setw(10)<<fenlei<<setw(15)<<cbs<<setw(10)<<cbtime< <setw(10)<<bookprice<<setw(10)<<onshelf<}};class BDatabase{//图书库类,实现对图书的维护,查找,删除等private:int top; //图书记录指针Book book[Maxb]; //图书记录public:BDatabase(){//构造函数,将book.txt读到book[]中Book b;top=-1;fstream file("book.txt",ios::in);while (1){file.read((char *)&b,sizeof(b));if (!file)top++;book[top]=b;}file.close();}void clear(){//全删char i;cout<<"确定全部删除吗?Y/N ?"<<endl;cin></endl;</setw(3)<<no<<setw(10)<<name<<setw(10)<<author<< setw(10)<<fenlei<<setw(15)<<cbs<<setw(10)<<cbtime<<setw (10)<<bookprice<<setw(10)<<onshelf<</endl;>i;if(i=='y'||i=='Y')top=-1;}int addbook(int n,char *na,char *aa,char *fe,char *ca,int time, double price,int oa){//增加图书Book *p=query1(n);if (NULL==p){top++;book[top].addbook(n,na,aa,fe,ca,time,price,oa);return 1;}}Book *query1(int bookid){//按编号查找图书for(int i=0;i<=top;i++)if(book[i].getno()==bookid &&book[i].gettag()==0){return &book[i];}return NULL;}Book *query2(char a[]){//按书名查找图书Book *e;int r=0;for(int i=0;i<=top;i++)if(strcmp(book[i].getname(),a)==0 &&book[i].gettag()==0) {if(r==0)cout<<setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;e=&book[i];e->disp();r++;}if(r==0)cout<<"找不到该书!"<<endl;return NULL;}Book *query3(char a[]){//按作者查找图书Book *e;int r=0;for(int i=0;i<=top;i++)if(strcmp(book[i].getauthorname(),a)==0&&book[i].gettag()==0){if(r==0)cout<<setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;e=&book[i];e->disp();r++;}if(r==0)cout<<"找不到该书!"<<endl;return NULL;}Book *query4(char a[]){//按出版社查找图书Book *e;int r=0;for (int i=0;i<=top;i++)if (strcmp(book[i].getcbsname(),a)==0 &&book[i].gettag()==0){if(r==0)cout<<setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;e=&book[i];e->disp();r++;}if(r==0)cout<<"找不到该书!"<<endl;return NULL;}void bookdata(); //图书库信息void disp(){for(int i=0;i<=top;i++)if(book[i].gettag()==0)book[i].disp();}~BDatabase(){//析构函数,将book[]写到book.txt文件中fstream file("book.txt",ios::out);for(int i=0;i<=top;i++)if(book[i].gettag()==0)file.write((char *)&book[i],sizeof(book[i]));file.close();}};void BDatabase::bookdata(){char choice3;char bname[40];//书名char auname[40];//作者名char bfenlei[40];//分类号char cname[40];//出版社int time;//出版时间double price;//价格char ch;int choice4;int bookid;int bookod;Book *b;while (choice3!='0'){cout<<"\n\t\t\t** 图书信息 **\n"< cout<<"\t\t\t** 1.新增 **"<<endl; cout<<"\t\t\t** 2.更改 **"<<endl; cout<<"\t\t\t** 3.删除 **"<<endl; cout<<"\t\t\t** 4.查找 **"<<endl; cout<<"\t\t\t** 5.显示 **"<<endl; cout<<"\t\t\t** 6.全删 **"<<endl; cout<<"\t\t\t** 0.返回 **"<</endl;</endl;</endl;</endl;</endl;</endl;</endl;</setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;</endl;</setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;</endl;</setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;cout<<"\t\t\t 请选择:";cin>>choice3;switch(choice3){case '1':cout<<"请输入新书编号:";cin>>bookid;b=query1(bookid);if(b!=NULL){cout<<"该编号已经存在,不能添加!"<<endl;break;}cout<<"请输入新书书名:";cin>>bname;cout<<"请输入新书作者名:";cin>>auname;cout<<"请输入新书分类号:";cin>>bfenlei;cout<<"请输入新书出版社:";cin>>cname;cout<<"请输入新书出版时间:";cin>>time;cout<<"请输入图书价格:";cin>>price;cout<<"请输入新书数量:";cin>>bookod;addbook(bookid,bname,auname,bfenlei,cname,time,price,b ookod);char choice2;{cout<<"\n\t\t\t** 是否保存 Y/N ?**\n"<<endl;cout<<"\t\t\t** 1. Y 保存 **"<<endl;cout<<"\t\t\t** 0. N 不保存 **"<<endl;cout<<"\t\t\t 请选择: ";cin>>choice2;switch(choice2){case '1':cout<<"添加图书成功!";break;case '0':break;}}getch();break;case '2':cout<<"请输入图书编号:";cin>>bookid;b=query1(bookid);if(b==NULL){cout<<"该图书不存在! "<<endl;break;}cout<<"该图书的信息是:"<<endl;cout<<setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;b->disp();cout<<"是否修改?( y/n ):";cin>>ch;if(ch=='y'||ch=='Y'){int a;cout<<"\n\t\t\t** 图书修改 **\n"<cout<<"\t\t\t** 1.修改书名 **"<<endl;cout<<"\t\t\t** 2.修改作者 **"<<endl;cout<<"\t\t\t** 3.修改分类号 **"<<endl;cout<<"\t\t\t** 4.修改出版社 **"<<endl;cout<<"\t\t\t** 5.修改出版时间**"<<endl;cout<<"\t\t\t** 6.修改图书价格**"<<endl;cout<<"\t\t\t** 7.修改图书数量**"<<endl;cout<<"\t\t\t** 0.返回 **"<cout<<"\t\t\t 请选择:";cin>>a;switch(a){case 1: cout<<"请输入新的书名:";cin>>bname; b->setname(bname); break;case 2: cout<<"请输入新的作者:";cin>>auname; b->setauthorname(auname); break; case 3: cout<<"请输入新的分类号:";cin>>bfenlei; b->setfenlei(bfenlei); break;case 4: cout<<"请输入新书出版社:";cin>>cname; b->setcbs(cname); break;case 5: cout<<"请输入新书出版时间:";cin>>time;b->setcbtime(time); break;case 6: cout<<"请输入图书价格:";cin>>price; b->setbookprice(price); break;case 7: cout<<"请输入新的存量:";cin>>bookod; b->setonshelf(bookod); break; case 0: break;}}cout<<"修改图书成功!";getch();break;case '3':cout<<"请输入图书编号:";cin>>bookid;b=query1(bookid);if(b==NULL){cout<<"该图书不存在,无法删除!"<<endl;break;}b->delbook();cout<<"删除成功!";ge</endl;</endl;</endl;</endl;</endl;</endl;</endl;</endl;</setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;</endl;</endl;</endl;</endl;</endl;</endl;tch();break;case '4':cout<<"\n\t\t\t** 1.按图书编号查找 **"<<endl;cout<<"\t\t\t** 2.按图书书名查找 **"<<endl;cout<<"\t\t\t** 3.按图书作者查找 **"<<endl;cout<<"\t\t\t** 4.按图书出版社查找**"<<endl;cout<<"\t\t\t** 0. 返回 **"<<endl;cout<<"\t\t\t 请选择:";cin>>choice4;switch(choice4){case 1:cout<<"请输入图书编号:";cin>>bookid;b=query1(bookid);if(b==NULL){cout<<"该图书不存在!";break;}cout<<setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;b->disp();break;case 2:cout<<"请输入图书书名:";cin>>bname;b=query2(bname);break;case 3:cout<<"请输入图书作者:";cin>>auname;b=query3(auname);break;case 4:cout<<"请输入图书出版社:";cin>>cname;b=query4(cname);break;case 0:break;}break;case '5':cout<<setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;disp();getch();break;case '6':clear();break;default:break;}}}class Reader{//读者的信息描述private:int tag; //删除标记 1表示已删 0表示未删int no; //读者编号char name[20]; //读者姓名int borbook[Maxbor]; //所借图书public:Reader() //构造函数{ ; }friend ostream &operator<<(ostream &output,Reader &rd) {output<<rd.no;output<<" ";output<<endl;return output;}char *getname(){//获取姓名return name;}int gettag(){//获取删除标记return tag;}int getno(){//获取读者编号return no;}void setname(char na[]){//设置姓名strcpy(name,na);}void delbook(){//设置删除标记 1:已删 0:未删char i;cout<<"确定删除吗?Y/N ?"<<endl; cin>>i;if(i=='y'||i=='Y')tag=1;}void addreader(int n,char *na) {//增加读者tag=0;no=n;strcpy(name,na);for(int i=0;iborbook[i]=0;}void borrowbook(int bookid) {//借书操作for(int i=0;i{if (borbook[i]==0){borbook[i]=bookid;return ;}}}int retbook(int bookid){//还书操作for(int i=0;i{if(borbook[i]==bookid){borbook[i]=0;cout<<"还书成功!"<<endl;return 1;}}cout<<"未借该书,还书失败!"<<endl;return 0;}void disp(){//读出读者信息int have=0;int bz=0;cout<<setw(5)<<no<<setw(21)<<name<<setw(15); for(int i=0;iif(borbook[i]!=0){if(bz==0){have=1;cout<<"["<<borbook[i]<<"]\t</borbook[i]<<"]\t</setw(5)<<no<<setw(21)<<name<<setw(15);</endl;</endl;</endl;</endl;</rd.no;</setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;</setw(3)<<"编号"<<setw(10)<<"书名"<<setw(10)<<"作者"<<setw(10)<<"分类号"<<setw(15)<<"出版社"<<setw(10)<<"出版时间"<<setw(10)<<"图书价格"<<setw(10)<<"存量"<<endl;</endl;</endl;</endl;</endl;</endl;\t"<bz++;}else{cout<<"\r\t\t\t\t\t""["<<borbook[i]<<"]\t\t"<<setw(15)< }}if(have==0)cout<<"\t 还未借书"<<endl;}};class RDatabase{//读者类库,实现建立读者的个人资料private:int top; //读者记录指针Reader read[Maxr]; //读者记录public:RDatabase(){//构造函数,将reader.txt读到read[]中Reader s;top=-1;fstream file("reader.txt",ios::in); //打开一个输入文件while (1){file.read((char *)&s,sizeof(s));if (!file)break;top++;read[top]=s;}file.close(); //关闭 reader.txt 文件}void clear(){//删除所有读者信息char i;cout<<"确定全部删除吗?Y/N ?"<<endl; cin>>i;if(i=='y'||i=='Y')top=-1;}int addreader(int n,char *na){//添加读者时先查找是否存在Reader *p=queryid(n);if (p==NULL){top++;read[top].addreader(n,na);return 1;}elsecout<<"该编号已经存在!";return 0;}Reader *queryid(int readerid){//按读者编号查找for (int i=0;i<=top;i++)if (read[i].getno()==readerid&&read[i].gettag()==0){return &read[i];}return NULL;}Reader *queryname(char readername[10]){//按读者姓名查找for (int i=0;i<=top;i++)if (strcmp(read[i].getname(),readername)==0 && read[i].gettag()==0){return &read[i];}return NULL;}void disp(){//输出所有读者信息for(int i=0;i<=top;i++)if (read[i].gettag()==0)read[i].disp();}void readerdata(); //读者库信息~RDatabase(){//析构函数,将read[]写到reader.txt文件中fstream file("reader.txt",ios::out);for (int i=0;i<=top;i++)if (read[i].gettag()==0)file.write((char *)&read[i],sizeof(read[i])); file.close();}};void RDatabase::readerdata(){char choice1;char rname[20];int readerid;char readername[10];int choice2;Reader *r;while(choice1!='0'){cout<<"\n\t\t\t** 读者信息 **\n"<<endl; cout<<"\t\t\t** 1. 新增 **"<<endl;cout<<"\t\t\t** 2. 更改 **"<<endl;cout<<"\t\t\t** 3. 删除 **"<<endl;cout<<"\t\t\t** 4. 查找 **"<<endl;cout<<"\t\t\t** 5. 显示 **"<<endl; cout<<"\t\t\t** 6. 全删 **"<<endl; cout<<"\t\t\t** 0. 返回 **"<cout<<"\t\t\t 请选择:";cin>>choice1;switch(choice1){case '1':cout<<"请输入读者编号:"; cin>>readerid;cout<<"请输入读者姓名:"; cin>>rname;addreader(readerid,rname);cout<<"添加读者成功!"<<endl; getch();break;case '2':cout<<"请输入读者编号:"; cin>>readerid;r=queryid(readerid);if(r==NULL){cout<<"该读者不存在! "< break;}cout<<"请输入新的姓名:"; cin>>rname;r->setname(rname);cout<<"修改</endl;</endl;</endl;</endl;</endl;</endl;</endl;</endl;</endl;</endl;</borbook[i]<<"]\t\t"<<setw(15)<读者成功!"<<endl;getch();break;case '3':cout<<"请输入读者编号:";cin>>readerid;r=queryid(readerid);if(r==NULL){cout<<"该读者不存在!" << endl;break;}r->delbook();cout<<"删除成功!"<<endl;getch();break;case '4':cout<<"\n\t\t\t** 1.按读者编号查找 **"<<endl; cout<<"\t\t\t** 2.按读者姓名查找 **"<<endl; cout<<"\t\t\t** 0.返回 **"<<endl;cout<<"\t\t\t 请选择:";cin>>choice2;switch(choice2){case 1:cout<<"请输入读者编号:";cin>>readerid;r=queryid(readerid);if(r==NULL){cout<<"该读者不存在!"<< endl;break;}cout<<setw(10)<<"读者编号"<<setw(17)<<"读者姓名"<<setw(20)<<"已借书编号"<<endl;r->disp();break;case 2:cout<<"请输入读者姓名:";cin>>readername;r=queryname(readername);if(r==NULL){cout<<"该读者不存在!"<<endl;break;}cout<<setw(10)<<"读者编号"<<setw(17)<<"读者姓名"<<setw(20)<<"已借书编号"<<endl;r->disp();break;break;}break;case '5':cout<<setw(10)<<"读者编号"<<setw(17)<<"读者姓名"<<setw(20)<<"已借书编号"<<endl;disp();getch();break;case '6':clear();break;default:break;}}}class maindesk //实现程序的主界面{char choice5;char choice2;double xh,mm;int bookid,readerid;RDatabase ReaderDB;Reader *r;BDatabase BookDB;Book *b;maindesk() {;}int denglu(){int k=0;cout<<"\n\t\t\t 欢迎光临图书馆管理系统!"<<endl; cout<<"\t\t\t 您共有 3 次登陆机会"<<endl;while(choice2!='0'){ ++k;cout<<"\t\t\t ** 1. 登录 **"<<endl;cout<<"\t\t\t ** 0. 退出 **"<<endl;cout<<"\t\t\t 请选择: ";cin>>choice2;switch (choice2){case '1':cout<<"请输入学号和密码"<<endl;cin>>xh>>mm;if((xh>=138325039)&&(xh<=138325039)&&(xh==mm)) {cout<<"登录成功"<enterdesk();}if((xh<138325039)||(xh>138325039)||(xh!=mm)){cout<<"登录失败:您还有"<<3-k<<"次登陆机会"<<endl; if(k>=3){cout<<"您已超过登录次数上限,系统自动退出!"<<endl; return 1;}continue;}break;case '0':break;}return 1;}return 0;}void enterdesk(){while(choice5!='0'){cout<<"\n\t\t\t**** 图书管理系统****\n\n";cout<<"\t\t\t** 1.图书信息 **"<<endl;cout<<"\t\t\t** 2.读者信息 **"<<endl;cout<<"\t\t\t** 3.借阅图书 **"<<endl;cout<<"\t\t\t** 4.归还图书 **"<<endl;cout<<"\t\t\t** 0. 退出 **"<cout<<"\t\t\t 请选择:";cin>>choice5;switch (choice5){case '1':BookDB.bookdata();break;ca</endl;</endl;</endl;</endl;</endl;</endl;</endl;</endl;</endl;</endl;</endl;</setw(10)<<"读者编号"<<setw(17)<<"读者姓名"<<setw(20)<<"已借书编号"<<endl;</setw(10)<<"读者编号"<<setw(17)<<"读者姓名"<<setw(20)<<"已借书编号"<<endl;</endl;</setw(10)<<"读者编号"<<setw(17)<<"读者姓名"<<setw(20)<<"已借书编号"<<endl;</endl;</endl;</endl;</endl;</endl;se '2':ReaderDB.readerdata();break;case '3':cout<<"\t\t\t\t借书操作"<<endl;cout<<"请输入借书读者编号:";cin>>readerid;r=ReaderDB.queryid(readerid);if(NULL==r){//按编号查找是否有该读者cout<<"不存在该读者,不能借书!"<<endl; break;}cout<<"请输入要借图书编号:";cin>>bookid;b=BookDB.query1(bookid);if(b==NULL){//按编号查找是否有该图书cout<<"不存在该图书,不能借书!"<<endl; break;}if(b->borrowbook()==0){cout<<"该图书已借完,不能借书!"<<endl; break;}cout<<"读者借书成功!"<<endl;r->borrowbook(b->getno());break;case '4':cout<<"\t\t\t\t还书操作"<<endl;cout<<"请输入还书读者编号:";cin>>readerid;r=ReaderDB.queryid(readerid);if(r==NULL){cout<<"不存在该读者,不能还书"<<endl; break;}cout<<"请输入要归还图书编号:"; cin>>bookid;b=BookDB.query1(bookid);if(b==NULL){cout<<"不存在该图书,不能还书"< break;}b->retbook();r->retbook(b->getno());break;case '0':break;default:break;}}}};void main() //主函数{maindesk yourDesk;if(yourDesk.denglu())cout<<"\t\t 谢谢使用 , 再见 !"<<endl; }</endl;</endl;</endl;</endl;</endl;</endl;</endl;</endl;。
数据结构图书管理系统
数据结构课程设计说明书年月日1设计目的(小标题黑体五号字)设计一个计算机管理系统完成图书管理基本业务(数据可以存储在一个数据文件中,数据结构、具体数据自定)。
2.设计内容和要求具体功能有:1)每种书的登记内容包括书号、书名、著作者、出版单位、现存量和库存量;2)对书号建立索引表(线性表)以提高查找效率;3)采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;4)借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;5)归还:注销对借阅者的登记,改变该书的现存量。
3.本设计所采用的数据结构所用数据结构:线性表、查找、排序链表:用一组地址任意的存储单元存放线性表中的数据元素。
以元素(数据元素的映象) + 指针(指示后继元素存储位置)= 结点(表示数据元素或数据元素的映象)以“结点的序列”表示线性表称作线性链表(单链表)单链表是一种链式存取的结构,为找第 i 个数据元素必须先找到第 i-1 个数据元素。
因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 和 i。
(1)malloc(size)在内存的动态存储区申请一个长度为size字节的连续空间。
(2)calloc(n,size)在内存的动态存储区申请n个长度为size字节的连续空间,函数返回值为分配空间的首地址。
若此函数未被成功执行,函数返回值为0。
(3)free(p)释放由指针p所指向的存储单元,而存储单元的大小是最近一次调用malloc()或calloc()函数时所申请的存储空间。
运用了单链表的插入、删除、排序、修改等一些操作!4.功能模块详细设计4.1 详细设计思想(一)基本思想:(二)图书信息录入、图书信息的查询、图书信息的排序、图书信息的修改、图书信息的删除、图书的借阅、图书的归还、退出图书管理系统。
(三)程序中的主要函数有:void main() //主函数int CreateListR(LinkList *L) //尾插法建表void LocateElem(LinkList *L) //查询int Sort(LinkList *L) //递增有序排序(直接插入排序法)void Display(LinkList *L) //输出排序结果ModifyList(LinkList *L) //修改int ListDelete(LinkList *L) //删除void Borrow(LinkList *L) //借阅void Return(LinkList *L) //归还4.2 核心代码#include <stdio.h> #include <string.h> #include<stdlib.h>#include<malloc.h>typedef struct {int num;char name[20];char author[20];char press[20];int count;char price[10];} ElemType;typedef struct LNode //定义单链表结点类型{ElemType data;struct LNode *next;} LinkList;void InitList(LinkList *L) //初始化线性表{L = (LinkList *) malloc(sizeof(LinkList)); //创建头结点L->next = NULL;}int CreateListR(LinkList *L) //尾插法建表{int i, n;LinkList *s, *q, *p;p = L;while (p->next != NULL )p = p->next;printf("请输入需要录入的图书信息的个数:n=");scanf("%d", &n);for (i = 1; i < n + 1; i++) {s = (LinkList *) malloc(sizeof(LinkList));printf("书号书名作者出版社名称存馆数量定价\n");scanf("%d%s%s%s%d%s", &s->data.num, s->, s->data.author, s->data.press, &s->data.count, s->data.price);q = L->next;if (q == NULL ) {p->next = s;p = s;p->next = NULL;printf("录入成功!\n");continue;}while (q != NULL ) {if (strcmp(s->, q->) == 0) {printf("此图书已存在!");printf("请重新输入:\n");scanf("%d%s%s%s%d%s", &p->data.num, p->,p->data.author, p->data.press, &p->data.count,p->data.price);}q = q->next;}p->next = s;p = s;p->next = NULL;printf("录入成功!\n");}return 0;}void LocateElem(LinkList *L) //查询{LinkList *p = L->next; //p指向第一个数据结点int c;int x = 0;char name1[10], author1[10], press1[10];printf(" 1 按书名查询:\n");printf(" 2 按作者名查询:\n");printf(" 3 按出版社名称:\n");printf(" 4 返回\n");printf(" 请选择1--4进行操作:\n");scanf("%d", &c);if (c > 4 || c < 1) {printf("您的输入有误!\n");scanf("%d", &c);}switch (c) {case 1:printf("请输入图书书名: \n");scanf("%s", name1);while (p != NULL ) {if (strcmp(name1, p->) != 0) //查找图书书名p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d\t%s\t%s\t%s\t%d\t%s", p->data.num, p->,p->data.author, p->data.press, p->data.count,p->data.price);printf("\n");p = p->next;x++;}}if (p == NULL && x == 0)printf("对不起,不存在此图书!\n");break;case 2:printf("请输入图书作者:\n");scanf("%s", author1);while (p != NULL ) {if (strcmp(author1, p->data.author) != 0) //查找图书作者p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d\t%s\t%s\t%s\t%d\t%s", p->data.num, p->,p->data.author, p->data.press, p->data.count,p->data.price);printf("\n");p = p->next;x++;}}if (p == NULL && x == 0)printf("对不起,不存在此图书!\n");break;case 3:printf("请输入图书的出版社名称: \n");scanf("%s", press1);while (p != NULL ) {if (strcmp(press1, p->data.press) != 0) //查找图书出版社名称p = p->next;else {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d %s %s %s %d %s",p->data.num, p->, p->data.author,p->data.press, p->data.count, p->data.price);printf("\n");p = p->next;x++;}}if (p == NULL && x == 0)printf("对不起!不存在此图书\n");break;case 4:break;}}int Sort(LinkList *L) //递增有序排序(直接插入排序法){LinkList *p = L->next, *q, *r; //p指向第一个数据结点if (p != NULL ) //若原单链表中有一个或以上的数据结点{r = p->next; //r保存*p结点直接后继结点的指针p->next = NULL; //构造只含一个数据结点的有序表p = r;while (p != NULL ) {r = p->next; //r保存*p结点的直接后继结点的指针q = L;while (q->next != NULL && q->next->data.num < p->data.num)q = q->next; //在有序表中找插入*p的直接前驱结点*q的位置p->next = q->next; //将*p插入到*q之后q->next = p;p = r; //扫描原单链表余下的结点}}return 0;}void Display(LinkList *L) //输出排序结果{LinkList *p = L->next;while (p != NULL ) {printf("书号书名作者出版社名称存馆数量定价\n");printf("%d \t %s \t %s\t %s\t%d\t %s", p->data.num,p->, p->data.author, p->data.press, p->data.count,p->data.price);printf("\n");p = p->next;}}int ModifyList(LinkList *L) //修改{LinkList *p = L;char name1[10];printf("请输入要修改的图书的书名:\n");scanf("%s", name1);while (p != NULL ) {if (strcmp(name1, p->) == 0) //查找所要修改的书名{printf("请输入修改后的信息!\n");printf("书号书名作者出版社名称存馆数量定价\n");scanf("%d%s%s%s%d%s", &p->data.num, p->, p->data.author,p->data.press, &p->data.count, p->data.price);printf("修改成功!\n");return 0;}p = p->next;}printf("不存在此图书\n");return 0;}int ListDelete(LinkList *L) //删除{LinkList *p = L->next, *q = L;char name1[10];if (p != NULL ) {printf("请输入要删除的书名:");scanf("%s", name1);}while (p->next != NULL && strcmp(p->, name1) != 0) {p = p->next;q = q->next;}if (p->next != NULL ) //如果p此时不是最后一个节点,说明此时已经找到书{q->next = p->next;printf("删除成功!\n");return 0;}if (p->next == NULL && strcmp(name1, p->) != 0) //如果p此时为最后一个结点并且没有找到与之相符的书名{printf("你输入的书名不存在,请核实后重新输入!\n");} else {q->next = NULL;printf("删除成功!\n");}return 0;}void Borrow(LinkList *L) //借阅{LinkList *p = L->next;char name1[10];printf("请输入要借阅的图书的书名:\n");scanf("%s", name1);while (p->next != NULL && strcmp(name1, p->) != 0)p = p->next;if (p->next == NULL && strcmp(name1, p->) != 0)printf("此图书不存在!\n");else if (p->data.count < 1)printf("此书已借完!\n");else if (strcmp(name1, p->) == 0) {printf("借书成功!\n");p->data.count--;}}void Return(LinkList *L) //归还{LinkList *p = L->next;char name1[10];printf("输入归还书的书名: \n");scanf("%s", name1);while (p->next != NULL && strcmp(name1, p->) != 0)p = p->next;if (p->next == NULL && strcmp(name1, p->) != 0)printf("错误!此图书不存在!\n");else if (strcmp(name1, p->) == 0) {printf("该书归还成功!\n");p->data.count++;}}void menu() { //菜单函数printf("---------------------------------------------------------- \n");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("0.退出系统:\n");printf("请选择你需要的操作:\n");}int main() //主函数{int s;LinkList *L;L = (LinkList *) malloc(sizeof(LinkList));InitList(L);menu();printf("请输入编号:\n");scanf("%d", &s);while (s != 0) {switch (s) {case 1:CreateListR(L);break;case 2:LocateElem(L);break;case 3:Sort(L);Display(L);break;case 4:ModifyList(L);break;case 5:ListDelete(L);break;case 6:Borrow(L);break;case 7:Return(L);break;case 0:printf("谢谢使用\n");break;}scanf("%d", &s);}return 0;}(此页附在说明书后,请在验收前填好)。
基于单链表的教务管理系统设计与实现
基于单链表的教务管理系统设计与实现随着信息化时代的到来,各个行业都开始迎合信息化的潮流,教育行业自然也不例外。
教务管理系统的出现,极大地方便了学校的管理和教育工作者的工作,提高了工作效率。
在本篇文章中,将介绍一种基于单链表的教务管理系统的设计与实现。
一、系统需求分析首先,为了能够设计一套完整的教务管理系统,必须对教务管理的各个方面进行系统地分析和了解,明确各个方面的需求点,才能够更好地满足用户的需求。
主要需求点分为以下几方面:1. 学生管理:包括学生个人信息的录入、修改、查看、删除等功能;生成学生花名册、班级名单、学生汇总表等;考试成绩的录入和查看。
2. 教师管理:包括教师个人信息的录入、修改、查看、删除等功能;生成教师工作表、教师汇总表等。
3. 课程管理:包括课程信息的录入、修改、查看、删除等功能;生成课程表等。
4. 班级管理:包括班级信息的录入、修改、查看、删除等功能;生成班级花名册、学生名单等。
5. 系统权限管理:指的是管理员对教务系统的权限进行设置和管理。
二、系统设计与实现1. 数据结构选择经过对需求分析的研究,我们发现单链表是一种很好的数据结构。
它可以方便地对学生、教师、课程、班级等各种信息进行存储和管理。
因此,我们选择使用C 语言来设计和实现这个教务管理系统,并使用单链表作为主要的数据结构。
2. 系统模块划分针对以上的需求点,我们将教务管理系统划分为学生管理模块、教师管理模块、课程管理模块、班级管理模块和系统权限管理模块。
每个模块都应该有相应的程序来进行数据的录入、修改、删除、查询、输出等操作,同时需要将不同模块中的数据进行关联,实现教务管理系统的完整功能。
3. 系统功能实现每个模块的功能实现都较为简单,但是需要注意的是,数据之间的联系与关联比较复杂。
举个例子,考试成绩记录需要与学生、课程、教师等信息进行关联,班级名单需要与学生信息、班级信息等多个数据进行关联。
在实现过程中,需要将这些数据进行适当的封装,将其关系建立在单链表节点之间,实现数据的关联和查询。
C语言链表图书管理系统
while(fscanf(fp,"%s%s",name2,mima2)!=EOF)
{
if((strcmp(name2,name2)==0)&&(strcmp(mima,mima2)==0))
{
printf("尊敬的%s用户,欢迎使用图书管理系统\n",name);
while(p!=NULL)
{
m++;
if(strcmp(p->ID,a)==0)
{
display2(m);
break;
}
else
p=p->next;
}
if(p==NULL)
printf("对不起,数据库中没有您找的书\n");
printf("请输入书名^_^\n");
scanf("%s",lastbook->name);
printf("请输入书的出版社^_^\n");
scanf("%s",lastbook->chubanshe);
lastbook->next=NULL;
}
else
{
}
void chazhao()
{
int selete=0,m=0;
char a[20];
struct lib *p;
p=link;
printf("欢迎进入查找界面^_^\n");
if(p==NULL)
{
printf("对不起,现在图书馆中还没有图书呢^_^\n");
单链表 案例
单链表案例单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据元素和指向下一个节点的指针。
单链表的特点是节点之间只有单向连接,每个节点只能访问其后继节点。
单链表的应用广泛,下面将列举10个单链表的案例,以展示其在不同领域的应用。
1. 学生信息管理系统:可以使用单链表来存储学生的信息,每个节点代表一个学生,包含学号、姓名、年龄等信息。
通过单链表可以实现学生信息的增加、删除、修改和查找等操作。
2. 图书馆图书管理系统:可以使用单链表来管理图书馆的图书信息。
每个节点代表一本图书,包含图书编号、书名、作者、出版社等信息。
通过单链表可以实现图书的借阅、归还、查询等操作。
3. 经典游戏《贪吃蛇》:在贪吃蛇游戏中,蛇身可以使用单链表来表示。
每个节点代表蛇的一个身体部分,包含位置信息和指向下一个节点的指针。
通过单链表可以实现蛇的移动、长度增加和碰撞检测等功能。
4. 算法中的链表反转:链表反转是一种常见的数据结构操作,可以使用单链表来实现。
通过修改节点的指针指向,可以将链表中的节点顺序颠倒过来。
5. 跳表(Skip List):跳表是一种基于链表的数据结构,可以实现快速的查找、插入和删除操作。
跳表中每个节点除了包含指向下一个节点的指针外,还包含指向下一层节点的指针,通过跳跃式的方式提高查找效率。
6. 链表实现队列:队列是一种先进先出(FIFO)的数据结构,可以使用单链表来实现。
链表的头节点表示队列的队首,尾节点表示队列的队尾,通过插入和删除节点可以实现入队和出队操作。
7. 链表实现栈:栈是一种后进先出(LIFO)的数据结构,可以使用单链表来实现。
链表的头节点表示栈顶,通过插入和删除节点可以实现入栈和出栈操作。
8. 链表实现LRU缓存淘汰算法:LRU(Least Recently Used)是一种常见的缓存淘汰算法,可以使用单链表来实现。
通过将最近访问的节点放到链表头部,最久未访问的节点放到链表尾部,实现缓存的淘汰和替换。
C语言图书管理系统源代码
#include<stdio。
h〉#include<stdlib.h〉#include〈string。
h〉struct tushu{ /*图书结构体*/ char num[10]; /*编号*/char name[20];/*书名*/char writer[20];/*作者*/char press[20];/*出版社*/char kind[20];/*类别*/double time; /*时间*/double price;/*价格*/struct tushu *next;};struct stu /*学生结构体*/ {int snum;/*学号*/char mima[10]; /*密码*/struct stu *next;};FILE *fp; /*图书文件*/FILE *fp1; /*管理员信息文件*/ FILE *fp2; /*学生信息文件*/void menu();/*管理员主菜单(管理员进入对图书及学生信息进行管理操作)*/void xmenu();/*学生主菜单(学生进入可对图书,密码进行操作)*/void gfind(); /*管理员查询(管理员可按一定的方式查询图书)*/void xfind();/*学生查询(学生可按一定的方式查询图书)*/ void secret();/*管理员权限(管理员登陆所用,输入错误次数过多自动退出)*/void sort();/*排序(管理员可按一定的方式对图书进行排序,排序完之后可选择文件进行保存)*/void fprint(struct tushu *head);/*保存(可追加的保存,如添加可用)*/void fprint_(struct tushu *head);/*保存(可覆盖保存如修改,删除,排序后用)*/void hfprint(struct tushu *head); /*还书保存(还书成功后自动保存到文件)*/void jfprint_(struct tushu *head);/*借书保存(借书成功之后自动从图书馆删除)*/struct tushu * Input(); /*图书添加(可进行图书的添加)*/struct tushu *create(); /*从文件创建链表(从文件中读出信息,建立单链表)*/void gBrowse(struct tushu *head);/*管理员浏览(对图书进行遍历)*/void xBrowse(struct tushu *head);/*学生浏览(学生对图书进行遍历)*/void count(struct tushu *head); /*统计数量(管理员可对图书进行统计)*/void Findofname(struct tushu *head); /*按书名查找*/ void Findofwriter(struct tushu *head); /*按作者查找*/void Findofkind(struct tushu *head); /*按类别查找*/void xFindofname(struct tushu *head);/*学生按书名查找*/void xFindofwriter(struct tushu *head);/*学生按作者查找*/ void xFindofkind(struct tushu *head); /*学生按类别查找*/ void Sort_time(struct tushu * head); /*按时间排序(管理员按时间对图书进行排序,排序完之后可选择文件进行保存)*/ void Sort_price(struct tushu *head); /*按价格排序*/void Sort_num(struct tushu * head);/*按编号排序*/ void Delete(struct tushu * head,char m[15]);/*按编号删除(管理员可按编号删除图书)*/void Revise(struct tushu *head);/*修改(管理员可对图书进行修改,并选择是否保存)*/void borrow(struct tushu *head); /*借书*/void huanshu(); /*还书(学生借完书之后进行还书,若没有图书则不能借)*/void gxinxi(); /*管理员信息(有管理员的账号及密码,可进行修改)*/void xmima(struct stu *head1);/*学生密码修改(学生可对自己的密码进行修改)*/struct stu *xcreate();/*从文件创建学生信息(从文件读出学生信息,建立学生链表)*/void xsecret(struct stu *head1);/*学生权限(学生登陆所用)*/void menu() /*管理员主菜单(管理员进入对图书及学生信息进行管理操作)*/{int choice,n=0;struct tushu *head;struct stu *head1,*p;char m[15];there:printf("┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n"); printf(" ┃┃socat 图书管理系统printf(” ┃┗━━━━━━━━━━━━━━━━━━━┛┃\n"); printf(" ┃●[0]退出系统┃\n");printf(” ┃┃\n”);prin tf(” ┃●[1]帮助┃\n");printf(” ┃┃\n”);printf(” ┃●[2]浏览图书┃\n");printf(” ┃┃\n");printf(” ┃●[3]统计图书数目┃\n”);printf(" ┃┃\n”);printf(” ┃●[4]查询┃\n”);printf(” ┃printf(” ┃●[5]添加┃\n");printf(” ┃┃\n”);printf(” ┃●[6]排序┃\n");printf(” ┃┃\n");printf(" ┃●[7]修改┃\n”);printf(” ┃┃\n");printf(" ┃●[8]删除┃\n”);printf(" ┃┃\n”);printf(" ┃●[9]修改账号及密码┃\n");printf(” ┃┃\n”);printf(” ┃●[10]学生信息printf(”┗━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf(” 请选择:”);fflush(stdin);head=create();scanf("%d”,&choice);if(choice==1){//help();printf(”没有内容!\n”);system("pause”);system(”cls”);menu();}else if(choice==2){system(”cls");if(head==NULL){printf(”没有图书,请先添加图书!\n”);system("pause");system("cls");menu();}gBrowse(head);}else if(choice==3){system(”cls");count(head);}else if(choice==4){system("cls");if(head==NULL){printf(”没有图书,请先添加图书!\n”);system("pause”);system(”cls”);menu();}gfind();}else if(choice==5){Input();}else if(choice==6){system("cls");if(head==NULL){printf(”没有图书,请先添加图书!\n”); system("pause”);system(”cls”);menu();}sort(head);}else if(choice==7){system("cls”);if(head==NULL){printf(”没有图书,请先添加图书!\n”);system("pause");system("cls”);menu();}Revise(head);}else if(choice==8){if(head==NULL){printf("没有图书,请先添加图书!\n");system(”pause");system(”cls");menu();}printf(" 请输入想要删除的图书编号:”);scanf(”%s",m);Delete(head,m);}else if(choice==9){gxinxi();else if(choice==10){system(”cls”);head1=xcreate();if(head1==NULL){printf("没有学生信息,请到xuesheng_list.txt添加!\n”); sys tem(”pause”);system(”cls”);menu();}for(p=head1;p!=NULL;p=p—>next){printf(”学生学号密码\n”);printf("%d %s\n",p->snum,p—>mima);}system(”pause”);system("cls”);menu();}else if(choice==0)system(”cls");printf(”\n\n\n\n”);printf(” ━━━━━━━━感谢使用图书管理系统━━━━━━━━\n\n\n”);exit(0);}else{system("cls");printf(”\n\n\n\n ━━━━输入错误,请重新输入!━━━━\n\n\n ");system("pause”);system(”cls”);n++;if(n==3){printf(” \n\n\n ━━━━━━━━你错误次数太多,自动退出!━━━━━━━━\n\n\n”);printf(" ━━━━━━━━感谢使用图书管理系统━━━━━━━━\n\n\n");system(”pause");exit(0);}goto there;}}void xmenu()/*学生主菜单(学生进入可对图书,密码进行操作)*/{struct tushu *head;struct stu *head1;int choice,n=0;there:printf(”┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n");printf(” ┃┃socat 图书借阅系统┃┃\n");printf(” ┃┗━━━━━━━━━━━━━━━━━━━┛┃\n"); printf(” ┃●[0]退出系统┃\n”);printf(” ┃printf(” ┃●[1]帮助┃\n”);printf(” ┃┃\n”);printf(” ┃●[2]浏览图书┃\n");printf(” ┃┃\n”);printf(" ┃●[3]查询┃\n”);printf(” ┃┃\n”);printf(” ┃●[4]借书┃\n");printf(” ┃┃\n”);printf(" ┃●[5]还书┃\n");printf(" ┃┃\n”);printf(” ┃●[6]修改密码printf("┗━━━━━━━━━━━━━━━━━━━━━━━┛\n”); printf(" 请选择:");fflush(stdin);head=create();scanf("%d”,&choice);if(choice==1){//xhelp();printf(”没有内容!\n");system(”pa use");system(”cls”);xmenu();}else if(choice==2){system("cls");if(head==NULL){printf(”没有图书!\n");system("pause”);xmenu();}xBrowse(head);}else if(choice==3){if(head==NULL){printf(”没有图书!\n”);system(”pause”);system(”cls”);xmenu();}xfind();}else if(choice==4){if(head==NULL){printf(”没有图书!\n");system(”pause”);xmenu();}borrow(head);}else if(choice==5){huanshu(head);}else if(choice==6){system("cls”);head1=xcreate();if(head1==NULL){printf(”学生信息被清空!!\n”);system("pause");system("cls”);xmenu();}xmima(head1); ;}else if(choice==0){system("cls");printf(”\n\n\n\n”);printf(” ━━━━━━━━感谢使用图书管理系统━━━━━━━━\n\n\n");exit(0);}else{system("cls”);printf("\n\n\n\n ━━━━输入错误,请重新输入!━━━━\n\n\n ”);system(”pause”);system(”cls”);n++;if(n==3){printf(” \n\n\n ━━━━━━━━你错误次数太多,自动退出!━━━━━━━━\n\n\n”);printf(” ━━━━━━━━感谢使用图书管理系统━━━━━━━━\n\n\n”);system("pause”);exit(0);}goto there;}}void gfind()/*管理员查询(管理员可按一定的方式查询图书)*/{int choice,n=0;struct tushu *head;there:system(”cls”);printf(” ┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n”);printf(” ┃┃socat 图书借阅系统┃┃\n”);printf(” ┃┗━━━━━━━━━━━━━━━━━━━┛┃\n");printf(" ┃●[0]返回┃\n");printf(" ┃┃\n”);printf(" ┃●[1]按书名查找┃\n”);printf(" ┃┃\n”);printf(" ┃●[2]按作者查找┃\n”);printf(” ┃┃\n”);printf(" ┃●[3]按类别查找┃\n”);printf(" ┃┃\n”);printf(" ┃● ┃\n”);printf(”┗━━━━━━━━━━━━━━━━━━━━━━━┛\n”);printf(" 请选择:”);fflush(stdin);head=create();scanf(”%d”,&choice);if(choice==1){system(”cls");Findofname(head); }else if(choice==2){system(”cls”); Findofwriter(head); }else if(choice==3){system(”cls");Findofkind(head); }else if(choice==0){system(”cls”);menu();}else{system(”cls”);printf(”\n\n\n\n ━━━━输入错误,请重新输入!━━━━\n\n\n ”);system("pause");system(”cls");n++;if(n==3){printf(" \n\n\n ━━━━━━━━你错误次数太多,自动退出! ━━━━━━━━\n\n\n”);printf(" ━━━━━━━━感谢使用图书管理系统━━━━━━━━\n\n\n”);system(”pause”);exit(0);}goto there;}}void xfind()/*学生查询(学生可按一定的方式查询图书)*/ {struct tushu *head;int choice,n=0;there:system("cls”);printf(” ┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n”);printf(” ┃┃socat 图书借阅系统┃┃\n”);printf(” ┃┗━━━━━━━━━━━━━━━━━━━┛┃\n");printf(” ┃●[0]返回┃\n”);printf(” ┃┃\n");printf(" ┃●[1]按书名查找┃\n”);printf(” ┃┃\n”);printf(" ┃●[2]按作者查找┃\n”);printf(" ┃┃\n");printf(” ┃●[3]按类别查找┃\n");printf(” ┃┃\n”);printf(" ┃● ┃\n");printf(”┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); printf(” 请选择:");fflush(stdin);head=create();scanf(”%d",&choice);if(choice==1){system(”cls”);xFindofname(head);}else if(choice==2){system(”cls”);xFindofwriter(head);}else if(choice==3){system("cls");xFindofkind(head);}else if(choice==0){system(”cls");xmenu();}else{system("cls");printf("\n\n\n\n ━━━━输入错误,请重新输入!━━━━\n\n\n ”);system(”pause”);system(”cls");n++;if(n==3){printf(” \n\n\n ━━━━━━━━你错误次数太多,自动退出!━━━━━━━━\n\n\n”);printf(” ━━━━━━━━感谢使用图书借阅系统━━━━━━━━\n\n\n”);system("pause”);exit(0);}goto there;}}void sort(){struct tushu *head;int choice,n=0;there:system("cls”);printf(” ┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n");printf(” ┃┃socat 图书借阅系统┃┃\n");printf(" ┃┗━━━━━━━━━━━━━━━━━━━┛┃\n”);printf(" ┃●[0]返回┃\n”);printf(” ┃┃\n");printf(” ┃●[1]按时间排序┃\n”);printf(” ┃┃\n”);printf(” ┃●[2]按价格排序┃\n");printf(" ┃┃\n”);printf(” ┃●[3]按编号排序┃\n”);printf(" ┃┃\n”);printf(” ┃●┃\n”);printf(”┗━━━━━━━━━━━━━━━━━━━━━━━┛\n”);printf(" 请选择:”);fflush(stdin);head=create();scanf("%d",&choice);if(choice==1){system("cls”); Sort_time(head);}else if(choice==2){sys tem(”cls");Sort_price(head);}else if(choice==3){system(”cls”);Sort_num(head); }else if(choice==0){system("cls”); menu();}else{system(”cls");printf("\n\n\n\n ━━━━输入错误,请重新输入!━━━━\n\n\n ”);system(”pause”);system(”cls”);n++;if(n==3){printf(” \n\n\n ━━━━━━━━你错误次数太多,自动退出! ━━━━━━━━\n\n\n”);printf(” ━━━━━━━━感谢使用图书借阅系统━━━━━━━━\n\n\n”);system("pause”);exit(0);}goto there;}}struct tushu *Input(){struct tushu *p1,*p2,*head,*ptr;char num;int x,i=0;system("cls”);p1=(struct tushu *)malloc(sizeof(struct tushu));head=p1;p1-〉price=—1;while(i!=1){printf(”请输入编号,以’#’结束\n”);scanf("%s",p1—>num);if(strcmp(p1-〉num,”#")==0)i=1;while(i!=1){printf(”请依次输入书名作者出版社类别出版时间价格\n”); scanf(”%s%s%s%s%lf%lf”,p1—>name,p1—>writer,p1—〉press,p1-〉kind,&p1-〉time,&p1—〉price);p2=p1;p1=(struct tushu *)malloc(sizeof(struct tushu));p2—〉next=p1;break;}}if(p1-〉price!=-1)p2—〉next=NULL;elsehead=NULL;system("cls”);printf("\n\n\n\t\t\t图书信息输入结束!\n\n\n”);system(”pause”);system(”cls”);printf(”\n\n\n\t\t\t是否保存图书信息?(1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单链表:typedef struct {char num[20];char name[50];float pri;}Book;typedef struct LNode{ //线性表的单链表存储Book book; //数据域struct LNode *next; //指针域}LNode,*LinkList;void Input(LinkList &L){ //前插法创建图书链表LinkList p;L=new LNode;L->next=NULL;//初始化单链表ifstream inFile("book.txt");if(!inFile){cerr<<"Cannot open this file!"<<endl;exit(1);}char book_head1[10],book_head2[10],book_head3[10]; //定义文件中标题inFile>>book_head1>>book_head2>>book_head3;//读取文件中的标题while(!inFile.eof()){//到达文件尾部前逐行依次读取所有图书数据p=new LNode; //生成新结点inFile>>p->book.num>>p->>>p->book.pri;p->next=L->next; //插入到表头L->next=p;h}inFile.close();cout<<"读取完毕!"<<endl;}void Output(LinkList &L){//输出LinkList p;p=L->next;while(p){cout<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<set w(5)<<p->book.pri<<endl;p=p->next;}cout<<"\n信息显示完毕\n"<<endl;}void Searchname(LinkList &L){LinkList p;p=L->next;char name1[20];cout<<"请输入要查找的书名:";cin>>name1;while(p){if(strcmp(name1,p->)==0){cout<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<set w(5)<<p->book.pri<<endl;}p=p->next;}}void Searchnum(LinkList &L){int i;int j=0;LinkList p;p=L->next; //p指向第一个结点cout<<"请输入要查找的书籍的位置";cin>>i;while(p&&j<i-1){ //顺着链表向后扫描,直到p指向第i个元素或p为空j++;p=p->next;}if(!p||j>i){ //第i个元素不存在cout<<"错误!"<<endl;}cout<<"第"<<i<<"本书信息如下:"<<endl;cout<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<set w(5)<<p->book.pri<<endl;}void Max(LinkList &L){LinkList pmax,p;pmax=L->next;p=L->next->next;while(p){if(p->book.pri>pmax->book.pri)pmax=p;p=p->next;}cout<<left<<setw(15)<<pmax->book.num<<"\t"<<left<<setw(50)<<pmax-><<"\t"<<l eft<<setw(5)<<pmax->book.pri<<endl;}void Sort(LinkList L){cout<<"此功能还未实现,研究中"<<endl;}void Inverse(LinkList &L){LinkList p; //待插入到链表的节点LinkList q;p = L->next;L->next = NULL; //初始化链表ofstream outFile("bookinverse.txt");//每一次将p插入到L(头结点)与L->next(链表的第一个结点之间)while (p){q = p->next;p->next = L->next;L->next = p;p = q;}p=L->next;//循环完后,p指向的是链表末尾,需要重置回首元结点,否则无法写入文件while(p){cout<<setw(15)<<p->book.num<<"\t"<<setw(50)<<p-><<"\t"<<setw(5)<<p->book.pri <<endl;outFile<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<s etw(5)<<p->book.pri<<endl;p=p->next;}cout<<"信息已写入bookinverse.txt中!"<<endl;}void Count(LinkList L){int i=0;LinkList p;p=L->next;while(p){i++;p=p->next;}cout<<"当前的图书总数为:"<<i<<endl;}void Insert(LinkList L){Book bk;LinkList p=L; //初始化LinkList s=new LNode; //新结点sint i;int j=0;cout<<"请输入待插入书籍的位置"<<endl;cin>>i;cout<<"请输入待插入的书籍的信息"<<endl;cout<<"书号: "<<endl;cin>>bk.num;cout<<"书名: "<<endl;cin>>;cout<<"价格: "<<endl;cin>>bk.pri;while(p&&j<i-1){ //寻找第i-1个结点j++;p=p->next;}if(!p||j>i-1){cout<<"错误!"<<endl;}s->book=bk; //将结点s的数据域置为bks->next=p->next; //将结点s插入L中p->next=s;//重新写入book.txt文件ofstream outFile("book.txt");p=L->next;while(p){outFile<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<s etw(5)<<p->book.pri<<endl;p=p->next;}cout<<"插入新的书籍后的书籍信息已重新写入book.txt文件"<<endl;}void Delete(LinkList L){Book bk1;LinkList p=L; //初始化LinkList q; //临时保存被删除结点的地址以备释放int i;int j=0;cout<<"请输入待删除书籍的位置"<<endl;cin>>i;while(p->next&&j<i-1){j++;p=p->next;}if(!(p->next)||j>i-1){cout<<"错误!"<<endl;}q=p->next;p->next=q->next;bk1=q->book;delete q;//重新写入book.txt文件ofstream outFile("book.txt");p=L->next;while(p){outFile<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<s etw(5)<<p->book.pri<<endl;p=p->next;}cout<<"删除所选书籍后的书籍信息已重新写入book.txt文件"<<endl;}顺序表typedef struct{Book *book;int length;//图书表的图书记录个数}SqList;void Input(SqList &L){int i=0;char book_head1[10],book_head2[10],book_head3[10]; //定义文件中标题L.book=new Book[MAXSIZE];ifstream inFile("book.txt"); //打开文件if(!inFile) {cerr<<"Cannot open this file!"<<endl;exit(1);}inFile>>book_head1>>book_head2>>book_head3;//读取文件中的标题L.length=0;while(!inFile.eof()){ //逐行依次读取所有图书数据inFile>>L.book[i].num >>L.book[i].name>>L.book[i].pri;i++; //记录图书个数}L.length=i;inFile.close();cout<<"\n读取book.txt 信息完毕!"<<endl;}void Output(SqList L){for(int i=0;i<L.length;i++){cout<<left<<setw(15)<<L.book[i].num<<"\t"<<left<<setw(50)<<L.book[i].name <<"\t"<<left<<setw(5)<<L.book[i].pri<<endl;}cout<<"\n信息显示完毕\n"<<endl;}void Searchname(SqList &L){int y;char name1[20];cout<<"请输入要查找的书名:";cin>>name1;for(y=0;y<L.length;y++){//比较输入的name1与结构体数组中name是否相同;if(strcmp(name1,L.book[y].name)==0){cout<<left<<setw(15)<<L.book[y].num<<"\t"<<left<<setw(50)<<L.book[y].name<< "\t"<<left<<setw(5)<<L.book[y].pri<<endl;break;}}}void Searchnum(SqList &L){int i;cout<<"请输入要查找的书的位置"<<endl;cin>>i;cout<<left<<setw(15)<<L.book[i-1].num<<left<<setw(50)<<L.book[i-1].name<<left<<setw(5)<<L.book[i-1].pri<<endl;}void Max(SqList L){int max=0;cout<<"价格最高的书是:"<<endl;cout<<"书号"<<"\t"<<"书名"<<"\t"<<"价格"<<endl;for (int i=0;i<L.length;i++){if(L.book[i].pri>L.book[max].pri)max=i;}cout<<left<<setw(15)<<L.book[max].num<<"\t"<<left<<setw(50)<<L.book[max ].name<<"\t"<<left<<setw(5)<<L.book[max].pri<<endl;for (int j=0;j<L.length-1;j++){if(j!=max)if(L.book[j].pri==L.book[max].pri)cout<<left<<setw(15)<<L.book[j].num<<"\t"<<left<<setw(50)<<L.book[j].name <<"\t"<<left<<setw(5)<<L.book[j].pri<<endl;}cout<<endl;}void Sort(SqList L){//冒泡排序Book book1; //重新定义一个结构体变量for(int m=0;m<L.length-1;m++){for(int n=0;n<L.length-m-1;n++){if(L.book[n].pri<L.book[n+1].pri){//交换结构体数组的值book1=L.book[n];L.book[n]=L.book[n+1];L.book[n+1]=book1;}}}//写入booksort.txt文件ofstream outFile("booksort.txt",ios::out);for(m=0;m<L.length-1;m++){outFile<<left<<setw(15)<<L.book[m].num<<"\t"<<left<<setw(50)<<L.book[m].nam e<<"\t"<<left<<setw(5)<<L.book[m].pri<<endl;}outFile.close();cout<<"排序后书籍信息已写入booksort.txt文件"<<endl;}void Inverse(SqList L){Input(L);Book book2;int i,j,k;k=L.length/2;for(i=0;i<k;i++){j=L.length-1-i;book2=L.book[i];L.book[i]=L.book[j];L.book[j]=book2;}//写入bookinverse.txt文件ofstream outFile("bookinverse.txt");for(i=0;i<L.length;i++){outFile<<left<<setw(15)<<L.book[i].num<<"\t"<<left<<setw(50)<<L.book[i].name< <"\t"<<left<<setw(5)<<L.book[i].pri<<endl;}outFile.close();cout<<"排序后书籍信息已写入bookinverse.txt文件"<<endl;}void Count(SqList L){cout<<"当前的图书总数为:"<<L.length<<endl<<endl;}void Insert(SqList L){Book book3;int i;int j;cout<<"请输入待插入书籍的位置"<<endl;cin>>i;cout<<"请输入待插入的书籍的信息"<<endl;cout<<"书号: "<<endl;cin>>book3.num;cout<<"书名: "<<endl;cin>>;cout<<"价格: "<<endl;cin>>book3.pri;if(i<1||i>L.length+1){ //i值不合法cout<<"输入的位置错误,请重新输入:"<<endl;cout<<"请输入待插入书籍的位置"<<endl;cin>>i;}for(j=L.length-1;j>=i-1;j--){L.book[j+1]=L.book[j]; //输入位置及之后的元素位置后移}L.book[i-1]=book3; //将新元素book3放入第i个位置L.length++; //表长增加1//重新写入book.txt文件ofstream outFile("book.txt");for(i=0;i<L.length;i++){outFile<<left<<setw(15)<<L.book[i].num<<"\t"<<left<<setw(50)<<L.book[i].name< <"\t"<<left<<setw(5)<<L.book[i].pri<<endl;}outFile.close();cout<<"插入新的书籍后的书籍信息已重新写入book.txt文件"<<endl;}void Delete(SqList L){Book book4;int i;int j;cout<<"请输入待删除书籍的位置"<<endl;cin>>i;if(i<1||i>L.length){cout<<"输入的位置错误,请重新输入:"<<endl;cout<<"请输入待删除书籍的位置"<<endl;cin>>i;}book4=L.book[i-1]; //将要删除的元素保存在book4中for(j=i;j<=L.length-1;j++){L.book[j-1]=L.book[j]; //删除位置之后的元素前移}L.length--; //表长-1//重新写入book.txt文件ofstream outFile("book.txt");for(i=0;i<L.length;i++){ outFile<<left<<setw(15)<<L.book[i].num<<"\t"<<left<< setw(50)<<L.book[i].name<<"\t"<<left<<setw(5)<<L.book[i].pri<<endl;}outFile.close();cout<<"删除所选书籍后的书籍信息已重新写入book.txt文件"<<endl;}。