单链表实现图书管理系统

合集下载

数据结构_图书馆管理系统

数据结构_图书馆管理系统

湖南科技大学课程设计报告题目: 图书管理基本业务模拟院系:计算机科学与工程学院专业班级:计算机科学与技术一班学号: 0905010119学生姓名:张杰指导教师:李峰2010年12月31日一、问题分析图书馆基本业务模拟包含多方面的操作,其中本程序描述的是图书馆的新书入库、读者注册、图书馆借阅、归还、信息查询(含书籍信息查询和读者信息查询)等功能。

1)新书入库功能:新到书籍入库包含几方面的操作:查询该书名的书籍在图书馆信息中是否已经存在,若存在,则增加可借数量和书籍总量,若不存在,则新增加概述信息,从界面输入书籍的编号(0~999999的长整型)、书名(字符串类型)、该书作者名(字符串类型)、该书出版社信息(字符串类型)、出版日期(长整型)、该书的现存量(整型)、该书的总量(整型)。

输入该信息之后,将该节点插入到书籍信息链表中去。

该节点的插入位置根据查找,找到合适的位置插入,这样可以保证整个数据都是有序的,方便查找。

2)读者注册功能没有账号和密码读者和管理员都不能登录系统,本系统默认第一个注册系统的是系统管理员,借阅号为1000,权限是1,并输入自己基本信息,默认可借本数为10,并将所借书信息区全部置零。

不是第一个注册的读者,借阅号从1000往后顺延,自己设置密码,权限为0.,其余信息与管理员相同,但是登陆之后的界面,管理员可以看到“入库”菜单选项,普通读者不能看到该选项。

3)借阅功能书籍借阅主要涉及存书库和读者信息库双方的更新。

用户首先登陆系统,查询(3种查询方式)该书是否存在,该书的剩余数量是否大于零,最后查询该读者是否已经借满书籍。

若以上条件都满足,则将该书编号存入该读者的借阅信息区,将该读者的可借书数量减一,该存书的可借数量减一。

4)归还功能读者登录后按书名号来归还所借书籍,若书名号正确并且确认归还该书籍,则从读者的借书区删除该书籍,读者的课结束数量加一,将该书的可借数量增加一,然后返回。

5)信息查询功能信息查询分为读者信息查询和书籍信息查询,读者信息查询是在读者登录之后,可以显示本人的基本信息以及借书状况(所借书的本数、可借书本书以及所借书的信息),还可查询书籍信息,可根据书籍的编号来查找书籍、根据书名来查找书籍、根据作者名来查询书籍。

C语言实训图书管理链表结构

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语言用链表实现图书管理系统

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();
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语⾔单链表实现图书管理系统本⽂实例为⼤家分享了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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;}。

相关文档
最新文档