数据结构链表(图书管理信息)

合集下载

链表操作

链表操作

链表操作图书管理基本业务包括:1、对一种书的采编入库(类别、书名、作者、出版社、ISBN(唯一)、价格、数量)。

2、对一种书进行搜索(类别、ISBN、书名、作者)若有多个结果则同时显示出来。

3、对一种书进行清除库存(通过ISBN)。

4、对一种书实现借阅和归还,同时可以查看该学生借阅了几本书。

基本要求:采编入库:新购一种书,登记入册,若库存中已经有了,则总量增加。

(所有项均用英文单词和数字输入)例如入库某种书:Literature,Old Man and the Sea,Hemingway,Tsinghua University Press,978-7-5011-6964-1,35.6,10清除库存:某种书报损或无效了,将它从库存中删除(所有项都删除)。

借阅:如果一种书现存量大于0,则借出去,并登记借阅者的图书证号(自己定义6位数字字符串)。

通过对图书证号的查询,可以知道该学生已经借阅了几本书,并显示书名。

归还:注销对借阅者的登记,改变该书的现存量。

实现提示:1.1图书表可以采用链式或顺序存储结构实现。

图书的顺序表结构:typedef struct Book{char type[30]; //图书类别(文学、期刊、英语…..)char BookName[50]; //图书名称char Author[20]; //作者char Press[50]; //出版社char ISBN[20]; //ISBN编号(每一类书都有唯一编号,如:978-7-5011-6964-1)float Price; //图书价格int Number; //入库数量}Book;typedef struct BList{Book *elem;int length; //当前图书种类数量int listsize; //初始时可存放图书长度}BList;图书的链表结构:typedef struct Book{char BookName[50];char Author[20];char Press[50];char ISBN[20];float Price;int Number;}Book;typedef struct LNode{Book data;Struct LNode *next;}LNode,*LinkList;1.2、图书的入库则是顺序表或链表的插入操作(可以插入到最后一个位置)。

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构链表的特点

数据结构链表的特点

数据结构链表的特点一、什么是链表链表是一种常见的数据结构,它和数组一样用于存储元素,但链表的内部结构和操作方式与数组不同。

链表由一系列结点组成,每个结点包含数据和指向下一个结点的指针。

通过这种方式,链表将所有结点按顺序连接起来。

每个结点可以存储任意类型的数据,并且可以动态地插入、删除和修改。

二、链表的特点链表作为一种数据结构,具有以下几个特点:1. 非连续存储与数组不同,链表的结点在内存中可以是不连续存储的。

每个结点通过指针指向下一个结点,因此链表的元素可以在内存中分散存储。

2. 动态性链表的长度可以动态地增加或减少,可以随时插入、删除和修改结点。

这使得链表在处理需要频繁修改长度的情况下更加高效。

3. 灵活性链表的插入和删除操作非常灵活,可以在任意位置进行操作。

相比之下,数组的插入和删除操作只能在尾部进行。

4. 增删操作高效由于链表的结构特点,插入和删除结点的时间复杂度为O(1)。

当需要在链表的头部或特定位置插入或删除结点时,链表的效率要高于数组。

5. 随机访问低效链表的结点并不是连续存储的,因此无法通过下标直接访问结点,需要从头开始遍历链表才能找到目标结点。

因此,链表的随机访问效率较低,时间复杂度为O(n)。

三、链表的分类1. 单向链表单向链表是最基本的链表结构,每个结点只包含指向下一个结点的指针。

单向链表只能从头到尾遍历,不能逆向遍历。

2. 双向链表双向链表在单向链表的基础上增加了一个指向前一个结点的指针,使得链表可以双向遍历,更加灵活。

3. 循环链表循环链表是一种特殊的链表,它的尾结点指向头结点,形成一个循环。

循环链表可以无限遍历下去,常用于实现循环队列。

4. 双向循环链表双向循环链表是双向链表和循环链表的结合,既可以双向遍历,也可以无限遍历下去。

四、链表的应用链表作为一种常用的数据结构,在计算机科学中有着广泛的应用,以下是链表常见的应用场景:1. 链表存储大量数据由于链表可以动态地增加和减少结点,适用于存储大量数据的场景。

掌握数据结构中的链表和数组的应用场景

掌握数据结构中的链表和数组的应用场景

掌握数据结构中的链表和数组的应用场景链表和数组都是常用的数据结构,它们在不同的场景下有不同的应用。

一、链表的应用场景:1.链表适合动态插入和删除操作:链表的插入和删除操作非常高效,只需修改指针的指向,时间复杂度为O(1)。

因此,当需要频繁进行插入和删除操作时,链表是一个很好的选择。

-操作系统中的进程控制块(PCB):操作系统需要频繁地创建、停止、销毁进程,使用链表存储这些PCB,可以方便地插入、删除和管理进程。

-聊天记录:在聊天应用中,新的消息会动态插入到聊天记录中,使用链表存储聊天记录可以方便地插入新消息。

2.链表节省内存空间:每个节点只需存储当前元素和指向下一个节点的指针,不需要像数组一样预分配一块连续的内存空间,因此链表对内存空间的利用更加灵活。

-操作系统中的内存管理:操作系统使用链表来管理空闲内存块和已分配的内存块,可有效节省内存空间。

3.链表支持动态扩展:链表的长度可以随时变化,可以动态地扩容和缩容。

-缓存淘汰算法:在缓存中,如果链表已满,当有新数据需要加入缓存时,可以通过删除链表头部的节点来腾出空间。

4.链表可以快速合并和拆分:将两个链表合并成一个链表只要调整指针的指向即可,时间复杂度为O(1)。

-链表排序:在排序算法中,链表归并排序利用链表快速合并的特性,使得归并排序在链表上更高效。

二、数组的应用场景:1.随机访问:数组可以根据索引快速访问元素,时间复杂度为O(1)。

-图像处理:图像通常以像素点的形式存储在数组中,可以通过索引快速访问某个特定像素点的颜色信息。

2.内存连续存储:数组的元素在内存中是连续存储的,可以利用硬件缓存机制提高访问效率。

-矩阵运算:矩阵可以通过二维数组来表示,利用矩阵的连续存储特性,可以高效地进行矩阵运算。

3.大数据存储:数组可以预先分配一块连续的内存空间,非常适合存储大量的数据。

-数据库中的数据表:数据库中的数据表通常使用数组来实现,可以快速存取和处理大量的数据。

数据结构课程设计图书管理系统

数据结构课程设计图书管理系统

数据结构课程设计图书管理系统Revised on November 25, 2020数据结构课程设计图书管理系统一需求分析该程序是模拟图书馆管理系统,实现图书采编入库、借书、还书、查询等基本业务。

此程序规定:(1) 管理员能够向系统中输入每种书的基本信息,包括书号、书名、作者、现存量和库存量、借阅记录,并保存记录;(2) 用户(读者)能够按书号、书名、作者查询图书信息;(3) 管理员能够实现图书采编入库(新购入一本书,经分类和确定书号之后登记到图书账目中去。

如果这种书在帐中已有,则只将总库存量增加)、借阅(如果书的现存量大于0,则借出一本,登记借阅者的图书证号和归还期限)、归还(删除对借阅者的登记,改变该书的现存量)、销毁(将图书从账目中删除)等操作。

二概要设计系统用到的抽象数据类型定义:1、ADT LinearList{数据元素:D={a i|a i∈D0,i=1,2,…,n,n≥0,D0为某一数据对象}关系:S={<a i,a i+1>|a i,a i+1∈D0,i=1,2,…,n-1}基本操作:(1)InitList(L)(2)DestroyList(L)(3)ClearList(L)(4)EmptyList(L)(5)ListLength(L)(6)Locate(L,e)(7)GetData(L,i)(8)InsList(L,i,e)(9)DelList(L,i,&e) }ADT LinearList2、ADT String{数据对象:D={ai |ai∈CharacterSet,i=1,2,…,n;n≧0}数据关系:R={<ai-1,ai>|ai-1,ai∈D,i=2,…,n;n≧0}基本操作:(1) StrAsign(S,chars)(2) StrInsert(S,pos,T)(3) StrDelete(S,pos,len)(4) StrCopy(S,T)(5) StrEmpty(S)(6) StrCompare(S,T)(7) StrLength(S)(8) StrClear(S)(9) StrCat(S,T)(10)SubString(Sub,S,pos,len)(11)StrIndex(S,pos,T)(12)StrReplace(S,T,V)(13)StrDestroy(S)}ADT String系统中的子程序和功能说明:InitBo(Book &boo);初始化图书信息InitRe(lend &Lin);初始化借阅者信息BinarySearch(Book boo,char SearchNum[]);二分法查找比较书号Buy(Book &boo, char BuyNum[]);新书采编入库系统Delete(Book &boo,char DeleteNum[]);清除图书信息系统Borrow(Book &boo,lend &Lin,char BorrowNum[],char CaNum[]);借阅图书处理系统Return(Book &boo,lend &Lin,char ReturnNum[],char BorrowerNum[]);归还图书系统SearchByNum(Book &boo,char SeaNum[]);按书号查找系统SearchByName(Book &boo);按书名查找系统SearchByAuth(Book &boo);按作者查询系统Menu();主菜单显示系统Search();查询系统子菜单main();主函数●系统程序功能结构图三详细设计●功能实现过程bool BinarySearch(Book boo,char SearchNum[]) ext=NULL;total++;/*总量加1*/}}void Delete(Book &boo,char DeleteNum[])/*清除图书信息*/{if(书库中没有此书)输出“无此书”;if(书库中有此书){strcpy(连续两本书的相关信息);现存量减1;库存量减1;}else 输出“此书已有借阅者,无法删除!”;}void Borrow(Book &boo,lend &Lin,char BorrowNum[],char CaNum[])/*借阅图书信息*/{if(没有找到此书) 输出“书库中无此书!”;if(书库中有此书){借出一本书后,该书的现存量减1;并在借阅记录链表中插入该条记录;再对应读者信息记录链表,如果已有该读者证号信息,直接在该链表中插入此次借阅记录;如果无该读者证号信息,申请新单链表存放借阅记录。

北京理工大学-数据结构实验报告-实验四--图书管理系统

北京理工大学-数据结构实验报告-实验四--图书管理系统

实验四图书管理系统姓名:任子龙学号:1120140167 班级:05111451一。

需求分析(1)问题描述有一个小型书库保管了大量图书,关于图书有大量信息需要处理,这些信息包括图书的分类、书名、作者名、购买日期、价格等。

现要求编写一个程序以便于对图书的管理。

(2)基本要求:a.建立图书信息.b.提供查找功能,按照多种关键字查找需要的书籍。

例如按书名查找,输入书名后,将显示出该图书的所有信息,或显示指定信息。

c.提供排序功能,按照多种关键字对所有的书籍进行排序,例如按出版日期进行排序。

d.提供维护功能,可以对图书信息进行添加、修改、删除等功能。

(3)数据结构与算法分析将每一本书看作是一个基本单元。

由于涉及添加、修改操作,这里使用了链表作为数据存储结构;同时,考虑到排序功能,尝试使用双向链表。

其中,每本书作为一个结点,数据域包含char 型变量,指针域含有左右指针left和right。

二.概要设计1。

抽象数据类型的定义为实现上述功能,程序中使用了双向链表,只需要定义一种数据类型:typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;注意结点的指针域有left和right两个。

2.本程序包含两个模块(1)主程序模块主函数只包含了Menu_select()函数。

目的是进入主菜单界面,进行功能选择;直到输入操作码0,退出系统;(2)双向链表单元模块——实现书籍信息的链式存储的抽象数据类型.各函数之间的调用关系:三。

详细设计1。

结点类型typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;2.子函数(1)功能菜单调用函数Menu_select()使用户进入主菜单界面,进行功能选择;先进入无限循环,输入操作码进行系统管理工作,直到输入操作码0,退出系统;(2)各种功能函数Initialize()//初始化图书系统信息;Insert()//添加新的图书信息;Sort()//对图书进行排序,本程序可以实现按“图书编号”、“出版日期"、“图书价格”多种关键字进行排序;Search()//实现对图书的查找功能,本程序可以实现按“图书编号"、“出版日期”、“图书价格”多种关键字进行查找;deletebook()//删除无效的图书信息;Print_book()//打印全部图书信息。

数据结构实验-基于线性表的图书信息管理.doc

数据结构实验-基于线性表的图书信息管理.doc

数据结构实验:基于线性表的图书信息管理。

××大学11-12学年第二学期数据结构实验报告专业:班级级别: 姓氏:号码:实验地点:B6计算中心机房教师:实验主题:基于线性表的图书信息管理实验环境:Visual Studio 6.0实验目的:1、掌握线性表的定义;2、掌握线性表格的基本操作,如建立、搜索、插入和删除等。

实验内容:1.必须定义包含图书信息(图书编号、书名、定价)的序列表和链表,使其具有以下功能:(1)从给定的文件book.txt中逐个读取图书信息;(2)逐一显示图书列表中所有图书的相关信息;(3)统计表中的图书数量;(4)输出具有最高图书价格的图书信息(考虑到可能有多个图书);(5)计算所有书籍的平均价格;(6)根据书名进行搜索,返回对应书名的图书编号和价格(考虑重名);(7)根据指定位置返回相应位置的所有图书信息;(8)给定一本书的相关信息,将其插入表中指定的位置,并将插入的结果重写到文件book.txt中;(9)删除指定位置的book记录,并将删除的结果重写到file book.txt中;(10)以相反的顺序存储图书列表信息,并且以相反的顺序将图书信息存储在文件book_inverser.txt中2.选择(1)按图书价格排序,并将排序结果以格式(定价、图书编号、图书标题)存储在文件book_sort.txt中。

(2)实现两个一元多项式的加法、减法和乘法。

实现方法、实验结果和结论分析等。

(1)实施方法1。

所用数据结构的定义及其相关描述(相关结构或类的定义和含义)//定义结构书//定义结构{ char no .[30];//代码字符名称[30];//标题int价格;//价格};//序列表类型定义结构代码//序列表定义{结构书*元素;//指向数据元素的基址整数长度;//序列表的当前长度}列表;//定义链表类型定义结构代码//定义链表{结构书数据;//数据字段结构LNode * next//指针字段}LNode,* LinkList//单变量二次多项式typedef结构PNode { float coef//参数int expn//指数结构PNode * next//指针字段}PNode,*多项式;2.自定义函数的名称和函数描述//函数声明(序列表)状态初始化列表(SqLiST L);-班级级别:姓氏:号码:实验地点:B6计算中心机房教师:实验主题:基于线性表的图书信息管理实验环境:Visual Studio 6.0实验目的:1、掌握线性表的定义;2、掌握线性表格的基本操作,如建立、搜索、插入和删除等。

实验1 基于线性表的图书信息管理

实验1 基于线性表的图书信息管理

北京林业大学实验任务书学长的话:记住一定看了要理解,不要只抄北京林业大学学年—学年第学期数据结构实验任务书专业名称:实验学时: 4课程名称:数据结构A 任课教师:实验题目:基于线性表的图书信息管理实验环境:实验目的:1、掌握线性表的定义;2、掌握线性表的基本操作,如建立、查找、插入和删除等。

实验内容:分别定义一个包含图书信息(书号,书名,定价)的顺序表和链表,使其具有如下功能:(1) 从给定的文件book.txt逐个读入图书信息;////ok(2) 逐个显示图书表中所有图书的相关信息;//////ok(3) 统计表中图书个数;///////ok(4) 输出图书价格最低的图书信息(考虑可能有多个);////////ok(5) 计算所有图书的平均价格;//////////////////ok(6) 根据书名进行查找,返回相应书名的图书的书号和定价(考虑重名情况);(7) 根据指定的位置,返回相应位置的图书的全部信息;(8) 给定一本图书相关信息,插入到表中指定的位置,将插入后的结果重新写入文件book.txt;(9) 删除指定位置的图书记录,将删除后的结果重新写入文件book.txt;(10) 将图书表信息读入后逆序存储,然后将逆序的图书信息写入文件book_inverser.txt中。

(11) 按照图书价格升序进行排序,将排序的图书信息写入文件book_sort.txt中。

(12) 将价格小于30元的图书价格提高20%,价格大于等于30元的图书价格提高30%,将修改后的图书信息写入文件book_new.txt中。

选做内容(利用链表实现):实现两个一元多项式的加法、减法、乘法运算。

我只给代码,这个我写了将近一个月才写完的。

链表:import java.io.*;import java.util.*;public class数据结构试验一 {public static void main(String args[]){File readFile=new File("book.txt");//Book book=new Book();Scanner read=new Scanner(System.in);//String的输入Scanner readOne=new Scanner(System.in);//int的输入Scanner readTwo=new Scanner(System.in);//double输入Mylist list=new Mylist();Mylist list2=new Mylist();//逆序Mylist list3=new Mylist();//排序Mylist list4=new Mylist();//价格变动try{FileReader inOne=new FileReader(readFile);BufferedReader inTwo=new BufferedReader(inOne);String s=null;int j=0,x=0;while((s=inTwo.readLine())!=null){// System.out.println(s);if(x==0){x=1;System.out.println(s);}else{Book book1=new Book();String ss[]=s.split("\\t");for(j=0;j<3;j++){book1.no=ss[0];=ss[1];book1.price=Integer.parseInt(ss[2]);} //这种字符串的解析不会用list.addTail(book1);list2.Inverser(book1);list3.Sort(book1);}}inTwo.close();inOne.close();list.Output();//输出System.out.println("------------逆序链表的输出-----------");list2.Output();System.out.println("-------------排序的链表的输出-----------");list3.Output();System.out.println("-------------价格变化的输出-----------");list.New();list.Output();//list4.Output();FileWriter toOne=new FileWriter(readFile);BufferedWriter toTwo=new BufferedWriter(toOne);FileWriter toOne1=new FileWriter(readFile);BufferedWriter toTwo1=new BufferedWriter(toOne1);System.out.println("--------------输出图书的本数-----------");System.out.println("本数是:"+(list.length-1));System.out.println("--------------输出最低价格的图书-----------");list.Minprice();System.out.println("--------------输出平均价格-----------");double ave=list.head.next.date.price;System.out.println("书的平均价格是:"+list.Aveprice(ave,list.head.next,list.length-1));//list.Output();System.out.println("--------------按书名查找-----------");System.out.println("请输入你要查找的书名:");String name=read.nextLine();list.SearchName(name);System.out.println("--------------按位置查找-----------");System.out.println("请输入你要查找的位置");int i=readOne.nextInt();list.SearchID(i);System.out.println("--------------插入-----------");Point temp=new Point();System.out.println("请输入要插入的位置");int t=readOne.nextInt();System.out.println("请输入书的信息");Book tbook=new Book();tbook.no=read.nextLine();=read.nextLine();tbook.price=readTwo.nextDouble();list.Insert(t, tbook);toTwo.write("ISBN 书名定价");toTwo.newLine();for(temp=list.head.next;temp!=null;temp=temp.next){toTwo.write(temp.date.no+" "++""+temp.date.price);toTwo.newLine();}toTwo.flush();toTwo.close();toOne.close();System.out.println("-------------删除-----------");System.out.println("请输入你要删除的书名");String tname=read.nextLine();list.Delete(tname);list.Output();temp=new Point();//temp=list.head;toTwo1.write("ISBN 书名定价");toTwo1.newLine();for(temp=list.head.next;temp!=null;temp=temp.next){toTwo1.write(temp.date.no+" "++""+temp.date.price);toTwo1.newLine();}toTwo1.flush();toTwo1.close();toOne1.close();System.out.println("-------------逆序存放写入另一个文件中-----------");File file1=new File("book_inverser.txt");FileWriter toOne2=new FileWriter(file1);BufferedWriter toTwo2=new BufferedWriter(toOne2);temp=new Point();temp=list2.head;toTwo2.write("ISBN 书名定价");toTwo2.newLine();for(temp=list2.head.next;temp!=null;temp=temp.next){toTwo2.write(temp.date.no+" "++""+temp.date.price);toTwo2.newLine();}toTwo2.flush();toTwo2.close();toOne2.close();System.out.println("-------------价格升序排序写入新文件-----------");File file2=new File("book_sort.txt");FileWriter toOne3=new FileWriter(file2);BufferedWriter toTwo3=new BufferedWriter(toOne3);temp=new Point();temp=list3.head;toTwo3.write("ISBN 书名定价");toTwo3.newLine();for(temp=list3.head.next;temp!=null;temp=temp.next){toTwo3.write(temp.date.no+" "++""+temp.date.price);toTwo3.newLine();}toTwo3.flush();toTwo3.close();toOne3.close();System.out.println("-------------价格变动-----------");File file3=new File("book_new.txt");FileWriter toOne4=new FileWriter(file3);BufferedWriter toTwo4=new BufferedWriter(toOne4);temp=new Point();temp=list4.head;toTwo4.write("ISBN 书名定价");toTwo4.newLine();for(temp=list4.head.next;temp!=null;temp=temp.next){toTwo4.write(temp.date.no+" "++""+temp.date.price);toTwo4.newLine();}toTwo4.flush();toTwo4.close();toOne4.close();}catch(IOException e){System.out.println(e);}}}class Book{String no;String name;double price=0;public Book(String no,String name,double price){this.no=no;=name;this.price=price;}public Book(){}}class Point{Book date=new Book();Point next=null;public Point(Book date,Point next){this.date=date;this.next=next;}public Point(){}public Book getDate(){return date;}public void setDate(Book date){this.date=date;}public Point getNext(){return next;}public void setNext(Point next){this.next=next;}public void Outbook(Point temp){System.out.println(temp.date.no+" "++""+temp.date.price);}}class Mylist{//Book date=new Book();public Point head=null;Point tail=null;int length=0;int length1=0;public Mylist(){this.head=new Point();length=0;length1=0;}public void addHead(Book date){head=new Point(date,head);}public void addTail(Book date){Point tail=new Point(date,null);Point temp=new Point();temp=head;while(temp.next!=null){temp=temp.next;//temp=tail;}temp.setNext(tail);length++;}public void Output(){Point temp=new Point();temp=head.next;while(temp!=null){System.out.println(temp.date.no+" "++""+temp.date.price);temp=temp.next;}}//输出public void Minprice(){Point temp=new Point();temp=head.next;Point ch=new Point();ch.date=head.next.date;for(int i=0;i<length;i++){if(temp.date.price<ch.date.price){ch.date=temp.date;}temp=temp.next;}//找到最低价格的书System.out.println("最低价格书的信息是:");Point temp1=head.next;for(int i=0;i<length;i++){if(temp1.date.price==ch.date.price){temp1.Outbook(temp1);}temp1=temp1.next;}//查找和最低价格书一样价格的}//最低价格的图书(考虑有多本的情况)public double Aveprice(double ave,Point temp,int length){//System.out.println("平均价格是;");//Point temp=new Point();//temp=head;//int i=1;//double ave=temp.date.price;if(temp.next!=null){ave=(Aveprice(temp.next.date.price,temp.next,length-1)*(length-1) +temp.date.price)/(length);return ave;}else{return temp.date.price;}}//图书平均价格public void SearchName(String name){Point temp=new Point();temp=head.next;int ch=0;for(int i=0;i<length;i++){if(.equals(name)){temp.Outbook(temp);ch=1;}temp=temp.next;}if(ch==0){System.out.println("没有找到您要找的书");}}//书名查找,返回书的信息,考虑有书名一样的情况public void SearchID(int i){Point temp=head.next;if(i>length){System.out.println("您的输入有误");}else{for(int j=0;j<i-1;j++){temp=temp.next;}}temp.Outbook(temp);}//按位置查找public void Insert(int i,Book book){Point temp=head.next;Point p=new Point(book,null);if(i>length){System.out.println("您的输入有误");}else{for(int j=0;j<i-2;j++){temp=temp.next;}p.next=temp.next;temp.next=p;}}//插入,给定位置和输的信息,插入后重新写入文件public void Delete(String name){Point temp=head;//temp=head.next;int ch=0;for(int i=0;i<length-1;i++){if(.equals(name)){temp.next=temp.next.next;ch=1;break;}else{}temp=temp.next;}if(ch==1){System.out.println("删除完毕");}else{System.out.println("没有找到你要删除的书");} }//删除。

图书管理系统链表

图书管理系统链表

图书管理系统链表#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;。

数据结构课程设计——图书管理信息系统

数据结构课程设计——图书管理信息系统

图书管理信息系统一、课程设计题目:图书管理信息系统二、课程设计内容:实现图书管理信息系统的设计。

这是一个数据结构的综合使用,涉及的知识比较全面,特别是对文件的使用更为全面。

进入系统后,操作员可进行系统维护、读者管理、图书管理、图书流通、退出系统等操作。

系统维护:有“初始化”和“读盘”两个重要操作。

第一次开始运行时,必须选择“初始化”,使有关文件指针、计数器等初始化为0;而在以后的每次操作开始时,选择“读盘”,将保存过的相关图书信息磁盘文件读入,以便进行各类操作。

读者管理:可实现读者信息的追加一项输入。

需要输入读者号、读者名、可借书数。

输入“y”可连续输入信息,若输入“n”则结束输入,退出读者管理。

图书管理:有“图书信息输入”和“图书信息查询”两个重要操作。

若选“图书信息输入”,就进入相关子模块,在输入信息的同时建立相应的索引及索引文件和索引链头文件,输入书号、书名、作者名、出版社、分类号、藏书量等信息,根据提示输入“y”实现连续输入,若输入“n”则结束输入,退出图书管理;有了图书信息数据之后,就可以进行图书信息的查询以及图书借阅等操作了。

若选“图书信息查询”,可根据提示按书号、书名、作者、出版社等进行查询,系统会将查询结果输出。

图书流通:有“借书处理”和“还书处理”两个重要操作。

当选择“借书处理”,系统接受输入信息后,首先查询读者文件。

若没查到,显示“非法读者!”,若查到,则再检查该读者书是否已借满,如果未借满,则继续检查图书文件;否则显示“书已借满!”。

检查图书文件如发现书号不存在或书已借出,都会提示读者“非法书号!”或“书已借出”,否则,进行借出处理,修改借阅文件、读者文件以及图书主文件的相关数据项,并显示“借书成功!”。

当选择“还书处理”,系统在接受输入信息之后,首先用书号查询借还书文件,若找到,则填入还书日期,然后再用书号查询图书主文件,修改借出数,用读者号查找读者文件,修改读者的借书数,而后显示“还书成功!”,否则显示“非法书号!”并返回主控菜单。

数据结构图书管理系统实验报告

数据结构图书管理系统实验报告

竭诚为您提供优质文档/双击可除数据结构图书管理系统实验报告篇一:数据结构-图书管理系统实验报告数据结构课程设计报告课程名称_________题目名称学生学院专业班级学号学生姓名指导教师20XX年7月8日一、需求分析1.图书管理系统中图书管理模块包括图书类型定义:书号、现存量、总存量,出版时间为整型,定价为浮点型,书名、著者名为字符型,借阅指针、预约指针为读者类型;读者类型定义:证号为整型、姓名为字符型,另外借阅类型和预约类型组合成其中的共用体类型。

b树(2-3树)类型定义:关键字个数和关键字数组为整型、另外还有指向双亲的指针、指向子树的指针、记录单元指针;b树查找结果类型定义:节点指针、关键字序号和查找标志变量为整型。

2.演示程序以用户和计算机的对话方式进行,在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在后面。

该演示系统,没有使用文件,全部数据放在内存存放。

四项基本业务都以书号为关键字进行的,采用了b树(2-3树)对书号建立索引,以提高效率。

3.图书管理系统实现功能:①采编入库:新书购入,将书号、书名、著者、册数、出版时间添加入图书账目中去,如果这种书在帐中已有,则只将总库存量增加,每新增一个书号则以凹入表的形式显示b树现状。

②清除库存:实现某本书的全部信息删除操作,每清除一个书号则已以凹入表的形式显示b树现状。

③图书借阅:如果书的库存量大于零时则执行出借,登记借阅者的图书证号和姓名,系统自动抓取当前借阅时间和计算归还时间。

④图书预约:如果某书库存为零,则记录预约者姓名和证号,系统自动抓取当前预约时间和取书时间。

⑤图书归还:注销借阅者信息,并改变该书的现存量。

⑥作者专区:输入作者名字,系统将查找相应作者全部著作并显示出来。

⑦图书信息:可以根据书号查阅此书基本信息、借阅信息和预约信息,亦可以查找全部图书基本信息。

二、概要设计1.抽象数据类型b树定义:ADTbTree{数据对象:D是具有相同特性的数据元素的集合。

图书馆管理系统数据字典

图书馆管理系统数据字典

图书馆管理系统数据字典1. 概述图书馆管理系统是一个用于管理图书馆资源和服务的软件系统。

该系统通过对图书馆的各种资源进行管理,包括图书、期刊、报纸、音像资料等,以及读者的信息和借阅记录,实现了图书馆的日常运营和管理。

2. 数据字典2.1 图书信息表(Book)字段名数据类型描述book_id INT 图书ID,唯一标识符title VARCHAR 图书标题author VARCHAR 图书作者publisher VARCHAR 图书出版社publish_date DATE 图书出版日期isbn VARCHAR 图书ISBN号price DECIMAL 图书价格status VARCHAR 图书状态(可借、已借出、遗失等)2.2 期刊信息表(Journal)字段名数据类型描述journal_id INT 期刊ID,唯一标识符title VARCHAR 期刊标题publisher VARCHAR 期刊出版社publish_date DATE 期刊出版日期issn VARCHAR 期刊ISSN号price DECIMAL 期刊价格status VARCHAR 期刊状态(可借、已借出、遗失等) 2.3 报纸信息表(Newspaper)字段名数据类型描述newspaper_id INT 报纸ID,唯一标识符title VARCHAR 报纸标题publisher VARCHAR 报纸出版社publish_date DATE 报纸出版日期price DECIMAL 报纸价格status VARCHAR 报纸状态(可借、已借出、遗失等) 2.4 音像资料信息表(AVMaterial)字段名数据类型描述avmaterial_id INT 音像资料ID,唯一标识符title VARCHAR 音像资料标题director VARCHAR 音像资料导演producer VARCHAR 音像资料制片人publish_date DATE 音像资料出版日期price DECIMAL 音像资料价格status VARCHAR 音像资料状态(可借、已借出、遗失等)2.5 读者信息表(Reader)字段名数据类型描述reader_id INT 读者ID,唯一标识符name VARCHAR 读者姓名gender VARCHAR 读者性别birthday DATE 读者出生日期address VARCHAR 读者地址phone VARCHAR 读者电话号码email VARCHAR 读者电子邮箱2.6 借阅记录表(BorrowRecord)字段名数据类型描述record_id INT 借阅记录ID,唯一标识符reader_id INT 读者ID,外键关联到读者信息表item_id INT 资源ID,外键关联到图书、期刊、报纸或音像资料信息表borrow_date DATE 借阅日期due_date DATE 应还日期return_date DATE 归还日期fine DECIMAL 逾期罚款金额3. 数据关系3.1 图书信息表与借阅记录表之间的关系:一对多关系,一个图书可以对应多条借阅记录,一个借阅记录只能对应一个图书。

数据结构与算法分析lecture3(链表)

数据结构与算法分析lecture3(链表)

it=fence->next->element;//remember value
Link<Elem>* ltemp=fence->next;//remember link node
fence->next=ltemp->next;//remove from list
if(tail=ltemp) tail=fence;//reset tail
//overload new and delete operators for freelist
void* operation new(size_t); void operation delete(void*); };
template <class Elem> Link<Elem>* Link<Elem>::freelist = NULL;
bool insert(const Elem&);
bool append(const Elem&);
bool remove(Elem&);
void setStart()
{
fence = head;
rightcnt+ = leftcnt;
leftcnt = 0;
}
h
7
void setEnd()
};
ABC
h
3
insert
head
fence tail
20
23
12
15
head
fence
tail
?
20
23
10
12
15
h
4
Linked list implementation

数据结构-图书管理系统

数据结构-图书管理系统

数据结构-图书管理系统数据结构图书管理系统在当今数字化的时代,图书管理系统扮演着至关重要的角色。

无论是学校的图书馆、城市的公共图书馆还是企业内部的资料室,都需要一个高效、便捷且可靠的图书管理系统来满足人们对于知识获取和信息管理的需求。

图书管理系统的核心在于对数据的有效组织和管理,而这就离不开数据结构的运用。

数据结构就像是图书馆的书架,为图书的存放和检索提供了有序的方式。

常见的数据结构如数组、链表、栈、队列、树和图等,在图书管理系统中都有着各自独特的应用。

首先,让我们来谈谈数组。

数组是一种线性的数据结构,它可以用来存储固定数量的相同类型元素。

在图书管理系统中,可以用数组来存储图书的基本信息,如书名、作者、ISBN 码等。

由于数组的存储是连续的,所以在读取和写入数据时具有较高的效率。

但它也有局限性,那就是在插入和删除元素时,需要移动大量的数据,操作相对较为复杂。

链表则是另一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

链表在图书管理系统中的优势在于插入和删除操作比较简单,只需要修改指针即可。

例如,当需要删除一本图书的信息时,只需要将相关节点的指针调整,而无需像数组那样移动大量数据。

然而,链表在随机访问元素时效率较低,因为需要从头开始依次遍历节点才能找到目标元素。

栈和队列也是图书管理系统中常用的数据结构。

栈遵循“后进先出”的原则,就像一叠盘子,最后放上去的盘子最先被拿走。

在图书管理系统中,栈可以用于保存用户的操作记录,以便在需要时进行回退。

队列则遵循“先进先出”的原则,类似于排队买票的人群,先来的先得到服务。

可以用队列来处理图书借阅的排队请求,保证公平性和有序性。

接下来是树结构,二叉树和二叉搜索树在图书管理系统中应用广泛。

二叉搜索树的特点是左子树的节点值小于根节点值,右子树的节点值大于根节点值。

这使得在查找特定图书时能够大大提高效率,时间复杂度为 O(log n)。

此外,还可以使用平衡二叉树(如 AVL 树、红黑树等)来保证树的平衡性,进一步提高查找、插入和删除操作的效率。

数据结构形考实验报告

数据结构形考实验报告

数据结构形考实验报告一、实验目的本次数据结构形考实验的目的是通过设计一个简单的图书管理系统,综合应用所学的数据结构知识,包括链表、栈、队列、树等基本数据结构及其操作,加深对数据结构的理解和应用。

二、实验内容1. 设计一个图书管理系统,包括以下功能:(1)添加图书信息(2)删除图书信息(3)修改图书信息(4)查询图书信息(5)借阅图书(6)归还图书2. 使用链表存储图书信息,并实现相应操作函数。

3. 使用栈存储借阅记录,并实现相应操作函数。

4. 使用队列存储归还记录,并实现相应操作函数。

5. 使用二叉搜索树存储读者信息,并实现相应操作函数。

三、实验过程与结果1. 设计思路首先,我们需要定义两个结构体:Book和Reader。

Book包含了一本书的基本信息,如编号、名称、作者等;Reader包含了一位读者的基本信息,如姓名、学号、性别等。

接着,我们使用链表来存储所有的Book节点。

在链表中,每个节点代表一本书。

然后,我们使用二叉搜索树来存储所有的Reader节点。

在二叉搜索树中,每个节点代表一位读者。

为了方便管理借阅和归还记录,我们分别使用栈和队列来存储这些记录。

2. 实现过程(1)添加图书信息:在链表末尾添加一个新节点即可。

(2)删除图书信息:在链表中查找要删除的节点,然后将其从链表中删除。

(3)修改图书信息:在链表中查找要修改的节点,然后修改相应的信息即可。

(4)查询图书信息:遍历整个链表,输出所有的Book节点。

(5)借阅图书:在Reader节点中添加一条借阅记录,并将该记录压入栈中。

(6)归还图书:从Reader节点中删除一条借阅记录,并将该记录加入队列中。

3. 实验结果经过测试,我们的程序能够正确地实现所有功能。

我们可以添加、删除、修改、查询图书信息;可以借阅、归还图书,并且能够正确地管理借阅和归还记录。

四、实验总结通过本次数据结构形考实验,我深刻理解了数据结构的应用和操作。

我们通过设计一个简单的图书管理系统,综合运用了链表、栈、队列和二叉搜索树等基本数据结构及其操作。

数据结构实验:基于线性表的图书信息管理

数据结构实验:基于线性表的图书信息管理
O(n)
void Count( LinkList L );//输出数据个数的函数
O(1)
void Compare( LinkList L );//比较价格函数
O(n)
void Average( LinkList L );//求平均价格函数
O(n)
void Search_name( LinkList L );//按照书名查找
当没有此书时会有提示7按照指定的位置查找图书信息当输入非法时有提示8在指定位置插入图书信息当位置不合法或者空间不足时有提示9删除指定位置的图书信息当输入位置不合法是提示10图书信息逆序链表1当输入超出菜单所给选项的数字时有提示2输出所有的图书信息3统计图书个数4查找价格最高的图书如果有多本书同时为最高价可全部输出5计算所有图书的平均价格6按书名查找图书可查找多本同名图书当无查找书籍信息时有提示7按输入位置查找图书信息当位置不合法是有提示8在指定位置插入信息当位置不合法是有提示9删除指定位置的图书信息当位置不合法是有提示10将所有图书信息逆序11将所有图书信息按照价格由高到低排序3
void MultiplyPolyn( Polynomial &Pa, Polynomial &Pb );//一元多项式相乘
3. 主要功能算法的时间复杂度
⑴顺序表
函数名称
时间复杂度
Status InitList( SqList &L );//顺序表初始化
O(1)
void Input( SqList &L );//输入函数
提示
(7)按输入位置查找图书信息,当位置不合法是有提示
(8)在指定位置插入信息,当位置不合法是有提示
(9)删除指定位置的图书信息,当位置不合法是有提示

数据结构严蔚敏c语言版 isbn

数据结构严蔚敏c语言版 isbn

数据结构严蔚敏C语言版 ISBN1. 引言本文将介绍数据结构中的一个重要概念:ISBN(International Standard Book Number,国际标准书号)。

ISBN是一种用于标识图书的唯一编码方式,它可以帮助图书馆、书店和出版商等机构对图书进行管理和识别。

在本文中,我们将通过C语言编写一个简单的ISBN管理系统,以展示如何使用数据结构来处理ISBN。

我们将使用严蔚敏编著的《数据结构(C语言版)》作为参考。

2. 数据结构设计为了实现ISBN管理系统,我们需要设计适当的数据结构来存储和操作图书信息。

在这里,我们可以使用链表作为主要的数据结构。

2.1 图书信息结构体首先,我们需要定义一个用于表示图书信息的结构体。

该结构体应包含以下字段:•char title[100]:图书标题•char author[50]:图书作者•int year:出版年份•long long isbn:ISBN编码typedef struct {char title[100];char author[50];int year;long long isbn;} Book;2.2 链表节点结构体接下来,我们需要定义一个链表节点的数据结构,以便在链表中存储图书信息。

该节点应包含以下字段:•Book book:存储的图书信息•struct Node* next:指向下一个节点的指针typedef struct Node {Book book;struct Node* next;} Node;2.3 链表结构体最后,我们需要定义一个链表的数据结构,以便管理和操作链表节点。

该链表应包含以下字段:•Node* head:指向链表头节点的指针•int size:链表中节点的数量typedef struct {Node* head;int size;} LinkedList;3. ISBN管理系统实现有了上述定义的数据结构,我们可以开始实现ISBN管理系统了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p->elem[p->length++]=q;
return ok;
}
void Output(Sqlist p) //输出线性表
{
int i;forFra biblioteki=0;i<p.length;i++)
printf("%s %f",p.elem[i].name,p.elem[i].price);
}
status Delete(Sqlist *p,int i) //删除指定位置成员
case '3':{printf("请输入书名和价格:");scanf("%s%f",,&B.price);if(Insert(&A,B)==1) printf("插入成功\n");};break;
case '4':{printf("请输入位置:");scanf("%d",&n);if(Delete(&A,n)==1) printf("删除成功\n");};break;
typedef struct //定义线性表
{
ElemType *elem;
int length;
int listsize;
}Sqlist;
status Init(Sqlist *p) //初始化线性表
{
p->elem=NULL;
p->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
while((ch=getchar())!='8')
{
getchar();
switch(ch)
{
case '1':if(Init(&A)) printf("初始化成功\n");else printf("初始化不成功\n");break;
case '2':printf("请输入书名和价格:"),scanf("%s%f",A.elem[0].name,&A.elem[0].price);break;
if(!(p->elem))
return fault;
p->length=0;
p->listsize=MAXSIZE;
return ok;
}
status Insert(Sqlist *p,ElemType q) //从末尾插入成员
{
if(p->length==p->listsize)
return fault;
{
int n=p->length;
if(p->length==p->listsize||i>p->listsize)
return fault;
while(n>i)
{
p->elem[n]=p->elem[n-1];
n--;
}
p->elem[i]=q;
return ok;
}
ElemType Get(Sqlist p,int i) //从线性表中取得成员
default:printf("请输入位置:"),scanf("%d",&n),C=Get(A,n),printf("%s%f",,B.price);
}
}
}
case '5':Output(A);break;
case '6':{printf("请输入书名和价格:");scanf("%s%f",,&B.price);printf("请输入位置:");scanf("%d",&n);if(Insert2(&A,B,n)==1) printf("插入成功\n");};break;
{
int *q,*r;
if((i<1)||i>p->length)
return fault;
q=&p->elem[i-1];
r=&p->elem+p->length-1;
for(++q;q<=r;++q)
*(q-1)=*q;
--p->length;
return ok;
}
status Insert2(Sqlist *p,ElemType q,int i) //从指定位置插入
{
return p.elem[i];
}
void main(void)
{
int n;
char ch;
Sqlist A;
ElemType B,C;
printf("操作菜单:\n");
printf(" 1-------------初始化线性表\n 2-----------输入书目\n 3------------从末尾插入书目\n 4-----------删除书目\n 5-----------输出所有书目\n 6---------从指定位置插入书目\n 7------------取得特定书目信息\n 8-------------结束程序\n");
#include<stdio.h>
#define MAXSIZE 100
#define fault 0 //定义符号常量
#define ok 1
typedef int status;
typedef struct book //定义结构体
{
char name[10];
float price;
}ElemType;
相关文档
最新文档