《基于二叉排序树的图书信息检索.doc》由会员分享,可在线阅读,更多相关《基于二叉排序树的图书信息检索.doc(24页珍藏版)》请在三一文库上搜索。
1、课程设计报告设计题目:基于二叉排序树的图书信息检索 学 院: 电子工程学院 专 业: 电子信息工程 班 级: 021115 学号: 02111410学生姓名: 李晨 电子邮件: 时 间: 2014 年 10 月 17成 绩: 指导教师: 目 录1 前言11.1课程设计的目的11.2 图书借阅管理系统的设计与实现的基本要求113数据结构相关知识的阐述12 功能描述23 系统设计24 算法设计34.1 节点数据的设计34.1.1 图书的存储结构模型34.1.1 管理员存储模型34.2 公共参变量说明44.2.1 administer *admins,*current_admin=NULL44.2
2、.2 libcard *clients,*current_client=NULL;44.3 二叉排序树的插入模块的设计44.4二叉排序树的创建模块的设计54.5二叉排序树的查找模块设计64.6二叉排序树的删除模块设计74.7 主函数的设计95 详细设计105.1 采用排序二叉树作为存储结构105.2创建链表的二叉树105.3 二叉排序树的插入模块,采用递归算法实现115.4 本模块实现二叉排序树的建立125.5 二叉排序树的查找算法145.6 二叉排序树的删除算法156 调试分析186.1 进入系统186.2成进入系统之后你就可以进行相关操作了187 课程设计总结218 参考文献221 前言1
3、.1课程设计的目的 通过数据结构课程设计能更加熟练的掌握C语言以及数据结构的相关知识,能宏观的把握数据结构的各个相关部分的知识,深入的理解各个分支结构的作用和运用,特别是通过本此课程设计更能熟练的掌握和运用二叉树的相关知识,如通过二叉树能实现查找、删除、排序等从而实现对图书借阅管理。因而课程设计的主要目的就是使同学们能熟练的运用数据结构的相关知识实现各种功能。1.2 图书借阅管理系统的设计与实现的基本要求对每种书登记内容包括书号、书名、作者、出版社、出版日期、页码、价格;对所有藏书以书号为关键字建立索引表排序二杈树,用以方便进行二分查找;(1)采编入库:新购一种书,确定书号后,登记到图书帐目表
4、中,如果表中已有,则只将库存量增加;(2)借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;(3)归还:注销对借阅者的登记,改变该书的现存量。系统主要功能如下:输出形式:能按书号、书名、著作者查找库存的书籍信息;能按学生的借书证号显示学生信息和借阅信息;书籍入库;借书功能实现;还书功能实现。 13数据结构相关知识的阐述本课程设计运用到得数据结构部分主要在于二叉树的运用,采用二叉树的二叉链表存储结构把单本的书关联起来,这样就可对馆藏的所有书进行统一的管理;采用排序二叉树作为索引表的优点是方便按索书号为关键字进行查询;对于一个实用的管理系统来说缺省查找是必不可少
5、的,本系统中采用字符串的模式匹配算法来实现信息的缺省检索。采用二分查找实现精确查找;运用二叉树的插入、删除、排序来实现对图书的添加、删除、排列。2 功能描述二叉树的排序主要用于对图书管理系统的图书进行排序,采用二叉树的二叉链表存储结构把单本的书关联起来。这样就可对馆藏的所有书进行统一的管理了。二叉树的插入用于实现对图书管理系统的图书进行添加,对二叉树的节点插入新节点,然后从新排列新序列来实现图书的插入。二叉树的删除主要用来对图书管理系统的图书进行销毁,对二叉树节点的删除,节点表示一本图书,删除节点就表示销毁不需要的图书信息。3 系统设计3.1 设计思路由于课程设计的要求是用纯的c语言实现,不能
6、采用数据库等操作数据,故节点的设计采用标准c语言提供的一种叫做结构体的复合数据类型存储书的信息,然后再采用二叉树的二杈链表存储结构把单本的书关联起来。这样就可对馆藏的所有书进行统一的管理了。根据我们日程经验,客户到图书馆借书或者到书店买书,客户可以通过多种查询方式获得所需要的书,通过索书号只能进行精确查找,对于一个实用的管理系统来说缺省查找是必不可少的,本系统中采用字符串的模式匹配算法来实现信息的缺省检索。采用二分查找实现精确查找。4 算法设计4.1 节点数据的设计4.1.1 图书的存储结构模型(1)typedef struct booklong int starting;/借书日期long
7、int ending;/应还日期char bookinform120;/这里面存储书籍的描述信息long int callnum;/索书号char bookname30;char writer20;int totalstorage, nowstorage;/书本的馆藏量,现有量book;(2)/*本结构体用于创建二叉树*/typedef struct volumebook books;struct volume *lchild;struct volume *rchild;volume,*Btvolume;说明:采用二叉树而非链表进行图书的管理4.1.1 管理员存储模型 typedef stru
8、ct administerchar adminID12;char password12;char adminname20;/管理员名字.char adminmessage150;struct administer *next;administer;说明:采用二叉树而非链表进行图书的管理4.2 公共参变量说明4.2.1 administer *admins,*current_admin=NULL;说明:admins作为链接所有管理员的头指针 current_admin用于管理当前登陆的管理员用户 同一时刻只允许最多一名管理员登录4.2.2 libcard *clients,*current_cl
9、ient=NULL;说明:clients作为链接所有客户的头指针current_client用于管理当前登陆的客户同一时刻最多只允许一名客户登录4.3 二叉排序树的插入模块的设计void insertBST(Btvolume *bst,book *key)功能说明:利用二叉树的结点插入方法对结点进行插入设置,从而来实现对图书信息进行插入。如下图: 4.4二叉排序树的创建模块的设计 void createBST(Btvolume *bst,int manner)功能说明:在二叉树的根节进行创建,通过文件和键盘的信息输入方法来添加相关结点及相关图书信息。如下图:4.5二叉排序树的查找模块设计Btv
10、olume searchBST(Btvolume bst,long int key) 功能说明:利用二叉树的结点查找方法对结点进行查找设置,从而来实现对图书信息进行查找。如下图: 4.6二叉排序树的删除模块设计 int delBST(Btvolume bst,int key)功能说明:利用二叉树的结点删除方法对结点进行删除设置,然后从新排列,从而来实现对图书信息进行删除,如下图:4.7 主函数的设计功能说明:主要目的是对图书管理的实现,通过对算法设计和组织,利用图形化界面来实现用户和管理员对图书系统的访问。如下图:5 详细设计5.1 采用排序二叉树作为存储结构#include#include#
11、include#include#include /函数结构体#define MAXNUM 10typedef struct booklong int starting;/借书日期long int ending;/应还日期char bookinform120;/这里面存储书籍的描述信息long int callnum;/索书号char bookname30;char writer20;int totalstorage, nowstorage;/书本的馆藏量,现有量book;5.2创建链表的二叉树功能:本结构体用于创建链表的二叉树,通过对结点的生成来创建新的二叉树,最终生成图书管理系统。typed
12、ef struct volumebook books;struct volume *lchild; /左孩子部分struct volume *rchild; /右孩子部分volume,*Btvolume;typedef struct libcardchar userID12;char password12;/用户的密码char clientname20;/用户的名字char usermessage150;/用户信息book borrow10;/每本借书证限借书十本struct libcard *next;libcard;typedef struct administerchar adminID
13、12;char password12;char adminname20;/管理员的名字.char adminmessage150;struct administer *next;administer;administer *admins,*current_admin=NULL;libcard *clients,*current_client=NULL;5.3 二叉排序树的插入模块,采用递归算法实现功能:本结构体用于二叉排序树的插入模块,采用递归算法实现,通过对结点的插入来创建新的二叉树,最终生成图书管理系统。void insertBST(Btvolume *bst,book *key)Btvo
14、lume s;if(*bst=NULL) /递归结束条件s=(Btvolume)malloc(sizeof(volume);s-books.callnum = key-callnum;s-books.nowstorage = key-nowstorage;s-books.totalstorage = key-totalstorage;s-books.starting = key-starting;s-books.ending = key-ending;strcpy(&(s-books.bookinform),&(key-bookinform);strcpy(&(s-books.bookname
15、),&(key-bookname);strcpy(&(s-books.writer),&(key-writer);s-lchild=NULL;s-rchild=NULL;*bst=s; /递归结束条件else if(key-callnum books.callnum)insertBST(&(*bst)-lchild),key);else if(key-callnum (*bst)-books.callnum)insertBST(&(*bst)-rchild),key);else(*bst)-books.nowstorage+=key-nowstorage;(*bst)-books.totals
16、torage+=key-totalstorage;5.4 本模块实现二叉排序树的建立功能说明:1、参数 Btvolume *bst 为待创建树的根节点 2、只有库存量为空的时候才能调用本模块 3、只有管理员才能调用本模块 4、参数 manner 用于指定从文件创建还是从键盘创建manner=1:键盘、manner=2:从文件 5、只有在系统初始化是才允许从键盘创建void createBST(Btvolume *bst,int manner)book *key;FILE *f_book_store=NULL;f_book_store = fopen(book_store.txt,r);*bst
17、=NULL;while(1)key=(book *)malloc(sizeof(book);/if(manner=1)/*输入书本信息*/key-starting=0;key-ending=0;printf(输入索书号:);scanf(%ld,&(key-callnum);if(key-callnum = 0)free(key);break;/*输入书本信息*/printf(输入入库量:);scanf(%d,&(key-totalstorage);key-nowstorage=key-totalstorage;printf(输入书本名:);scanf(%s,&(key-bookname);pr
18、intf(输入著作者:);scanf(%s,&(key-writer);printf(输入书描述:);scanf(%s,&(key-bookinform);elseif(!feof(f_book_store)/判断文件是否结束key=read_book_file(f_book_store);if(key-callnum books.callnum = key)return bst;if(bst-books.callnum rchild,key);return searchBST(bst-lchild,key);5.6 二叉排序树的删除算法功能:实现对馆藏的书籍进行销毁 ,返回是否成功int d
19、elBST(Btvolume bst,int key)int success=0;Btvolume p,f,s,q;p=bst;f=NULL;/实现对图书管理while(p)if(p-books.callnum = key)break;f=p;if(p-books.callnum key)p=p-lchild;elsep=p-rchild;/选择对左节点还是右结点进行访问if(p=NULL)success=1;return success; /结点为空,对结点访问成功if(p-lchild=NULL)if(f=NULL)bst=p-rchild;else if(f-lchild=p)f-lch
20、ild=p-rchild;elsef-rchild=p-rchild;free(p);success=1; /访问结点的左孩子和右孩子成功elseq=p;s=p-lchild;while(s-rchild)q=s;s=s-rchild;if(q=p)q-lchild=s-lchild;elseq-rchild=s-lchild;p-books.callnum=s-books.callnum; /对左右孩子进行设置free(s);success=1;return success;5.7 显示管理员信息功能:本结构体重要用于对管理员信息进行管理,显示管理员的信息。void display_admi
21、ns(administer *head)int i=0;administer *temp=head;if(head = NULL)printf(您好,当前无管理员!n);return;while(temp!=NULL)printf(-n);printf(管理员 ID:%sn,temp-adminID);printf(管理员姓名:%sn,temp-adminname);printf(管理员信息:%sn,temp-adminmessage);printf(-n);temp=temp-next;void display(volume *key)time_t t;if(key=NULL)printf(
22、对不起,本馆目前无此藏书!n);return;printf(-n);printf(索书号:%dn,key-books.callnum);printf(书名 :%sn,key-books.bookname);printf(作者 :%sn,key-books.writer); 6调试6.1 进入系统您有三种选择,登录,注册和离开如果您已注册可直接登录,若目前还没有注册请先注册。当您选择注册之后会出现如下界面,当您两次输入的密码不能匹配系统会让你一直输,直到匹配为止。6.2成进入系统之后你就可以进行相关操作了6.2.1管理员用户(1) 图书入库功能(2) 图书查询(3)图书浏览7 总结通过一周多的学
23、习思考与实践,让我对C语言有了更深层次的了解,一个好的程序需要一个好的数据结构和一个好的算法,通过本次课程设计的过程中,掌握了数据结构的作用,数据结构的重点不在于它的算法的复杂度,数据结构的主要目的是为了让学生们学会如何将算法组合成为一个正确的、可靠的、可维护的系统。通过熟练的运用数据结构的二叉树的遍历、排序、节点的插入以及删除,从而来实现对图书管理系统的设计和维护。在这次课程设计的过程中,遇到过很多难题,主要表现在代码的错误上。而很多错误并不是由于没有掌握好数据结构的知识,而是在一些细节上出错,如代码拼写错误等等。因此在课程设计的过程中,我们得细心的去写每一个代码。避免不该出现的错误,耽误了大量的时间。这次还要多谢同学,耐心给我解答各种疑惑,提供给我多条解决问题的途径,虽然这次我们是各行其是,但我也感觉到了团队合作的魅力,见识到了同学学识的渊博,感觉到了自己和同学的差距,要多向同学学习,学习同学的积极进取及踏实努力。这次课程设计也加深了我们同学之间的友谊,总之,这次课程设计让我受益匪浅。8 参考文献1数据结构(C语言版),严蔚敏,清华大学出版社,20032c程序设计,容政,胡建伟,西安电子科技大学,2006.3计算机软件技术基础教程,刘彦明,西安电子科技大学2001.
链接地址:https://www.31doc.com/p-6179250.html