数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(40页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/29/aed9a9f3-25d2-4d26-a250-deeb2cabd380/aed9a9f3-25d2-4d26-a250-deeb2cabd3801.gif)
数据结构课程设计
重庆科技学院
《数据结构》课程设计
报告
学院:
_电气与信息工程学院_专业班级:
计科2013-02
学生姓名:
邹东军学号:
2013440020
设计地点(单位)______计算机基础自主学习中心__
设计题目:
________图书检索系统的设计_________
完成日期:
2014年7月4日
指导教师评语:
_______________________________________
____________________________________________________________________________________________________________________________________________________________________
成绩(五级记分制):
________________
指导教师(签字):
______________
重庆科技学院
课程设计任务书
设计题目:
图书检索系统的设计
学生姓名
邹东军
课程名称
数据结构课程设计
专业班级
计科2013-1,2,3,4
地点
计算机基础自主学习中心
起止时间
2014.6.23-2014.7.4
设计内容及要求
内容:
现有一批图书,现在要求对该图书进行有效管理,图书信息包括:
书名,作者,出版社,出版日期,字数,价格,数量。
假定书的信息已经以一定的格式存放于一个文本文件中,要求写一程序,能读入该数据,并能进行以下操作:
按书名、出版社、出版日期、价格、字数等进行排序,并能向记录中插入新记录,删除旧记录,修改记录信息等,退出程序时能把当前图书信息以文件的形式永久保存在磁盘上。
要求:
程序中必须用到链表。
注:
在完成以上功能基础之上,如果能采用多种不同的排序算法,会适当加分。
设计参数
测试数据要求:
在文本文件中,要求如下格式的数据:
{书名,作者,出版社,出版日期,字数,价格,数量},不能少于500条记录。
数据示例:
数据结构,严蔚敏,清华大学出版社,2007.3,250000,32,30
进度要求
2014.6.23完成任务的讲解、并接受课程设计任务,选定课程设计的题目
2014.6.24了解任务的算法、并画出算法的程序流程图,对任务的关键技术进行验证、并确定解决办法
2014.6.25–2014.6.29程序设计及编码,上机调试
2014.6.30对程序进行调试,设计测试用例进行测试
2014.6.30–2014.7.1整理课程设计的过程、并进行总结,完善程序功能
2014.7.2编写课程设计报告初稿
2013.7.3完善课程设计报告、并准备答辨
2014.7.4提交课程设计报告和程序,进行答辨
参考资料
1.严蔚敏吴伟民,数据结构,清华大学出版社,2007.3
2.程杰,大话数据结构,清华大学出版社,2011.6
3.(美)StephenPrata,CPrimerPlus中文版(第五版),人民邮电出版社,2005.2
其它
说明
1.本表应在每次实施前一周由负责教师填写二份,学院审批后交学院教务办备案,一份由负责教师留用。
2.若填写内容较多可另纸附后。
3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。
系主任:
雷亮指导教师:
黄永文、王双明、王成敏、熊茜
2014年6月13日
摘要
进入信息化时代,传统的图书管理已经不能很好的为人们提供服务,计算机图书管理已成为必然;和人工管理图书相比,图书检索系统具有较大的优点,例如:
查找方便、检索迅速、整理方便等。
在本课程设计是正是用于图书的管理,基于数据结构中的链表对图书进行管理。
在本系统中,具有新增图书、修改图书信息、删除图书信息、查找图书、显示文件信息、根据不同的图书内容进行排序、还可将图书信息写入文件中。
在整个运行过程中,本系统运用C语言输入输出流对信息进行存储,对于图书的排序,本系统运用了冒泡排序、选择排序和简单选择排序,可以清楚地将图书信息输出到屏幕上。
关键字:
数据结构链表排序图书检索
1设计内容和要求
1.1设计系统的目的分析
本系统要求用VisualC++6.0建立一个图书检索系统,对存有图书信息的文件Book.txt进行读入,然后对图书信息进行追加、删除、修改及排序,以到达对图书进行管理的目的。
1.2系统的界面要求
本系统要求的界面简洁、美观,让人一目了然,使用起来方便。
于是软件设计要求当运行程序是首先提示用户选取服务功能,通过数字键0-6来进行选择相应的数字按钮便可以实现用户所需要的功能。
1.3功能分析
该系统用六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想;运用一个单链表保存图书信息,然后将其用以实现追加、删除、修改、查询、显示、排序及退出功能。
1.4设计要求分析
(1)、进一步掌握数据结构程序设计的能力;
(2)、进一步理解和运用结构化程序设计的思想与方法;
(3)、初步掌握开发一个小型实用系统的基本方法;
(4)、学会调试一个较长程序的基本方法;
(5)、学会使用流程图表示算法;
(6)、根据题目要求,运用所学知识,完成设计和实现工作,并按要求撰写课题设计报告。
1.5系统的数据结构分析
本系统使用链表将文件信息存储在内存上,运用文件输入输出流对文件进行读入和写入。
在系统运行时,系统自动将文件存储到链表中,供用户根据系统菜单提示进行操作;系统关闭时,系统将链表中的信息自动写入文件,且再次打开文件不会消失。
2概要设计
2.1界面设计
(1)、主界面设计:
用户只需根据屏幕提示输入数字键,系统就会执行相应的命令并实现功能,界面效果如图2-1。
图2-1主界面功能图
(2)、追加记录界面设计:
用户在主界面选取“追加记录“功能后,系统将显示”请输入书名“进行提示,当输入书名后系统判断是否已存在输入的图书信息,没有则提示输入其他信息,如图2-2。
如果已有输入的记录,则提示已有记录,不能添加。
图2-2追加记录界面图
(3)、删除记录界面设计:
删除界面要求用户选择删除的类型(如图2-3)并进行相应操作,输入信息后跟追加记录一样自动判断是有已有记录,如有则提示“删除成功“,没有则提示不能删除。
图2-3删除界面图
(4)、修改记录界面设计:
根据用户选择的操作按钮进行操作,自动检测是否有输入的记录,如图2-4.
图2-4修改记录界面图
(5)记录排序界面设计:
当用户选择记录排序功能按钮后,界面(如图2-5)所示,运用8个数字按钮提示用户操作,系统根据用户选择的数字按钮对书名、作者、出版社、出版日期、字数、价格、数量进行排序。
图2-5记录排序界面图
(6)显示文件信息界面:
当用户要查看文件中的所有信息时,在主界面选择显示信息后,系统自动显示输出存储在链表中的信息,如图2-6.
图2-6显示文件信息图
2.2数据结构的设计
(1)、系统中使用了自定义结构体和结构体指针,如:
typedefstructBNode
{
charname[30];//书名
charwritter[10];//作者
charpublish[30];//出版社
intdate;//出版日期
longword;//字数
doubleprice;//价格
intnumber;//数量
structBNode*next;//指针
}BNode,*LinkList;
用于对链表操作,文件的读写。
在程序中还使用了exit()、strcmp()、strcpy()、fprintf()、fclose()等库函数。
(2)、程序中使用的头文件
#include“Mydefine.h”
#include“LinkLise.h”
#include
#include
#include
其中:
“Mydfine.h”、“LinkList.h>为自定义头文件。
(3)、自定义函数
voidmenu();//显示界面
StatusInitList(LinkList&L);//初始化链表
StatusReadList(LinkList&L);//读取文件数据
voidInsertList(LinkList&L);//插入新纪录
voidSearchList(LinkList&L);//查找图书信息
voidDeleteList(LinkList&L);//删除记录
voidReviseList(LinkList&L);//修改记录
voidSortList(LinkList&L);//记录排序
voidBubbleSort(LinkList&L,intm);//冒泡排序
voidSelectSort(LinkList&L);//选择排序
voidInsertSort(LinkList&L,intm);//直接插入排序
voidShow(LinkListL);//将链表的数据域输出到屏幕
voidSwap(LinkList&a,LinkList&b);//交换链表结点
voidOutToFile(LinkList&L);//更新文件
voidDestoryList(LinkList&L);//销毁链表
(4)、界面分析
本系统中采用的是文件的标准输入输出流,只需将字符显示到屏幕上即可,具体代码如图所示:
voidmenu()
{
printf("*******************\n");
printf("*欢迎使用图书检索系统*\n");
printf(**\n");
printf("*菜单选项*\n");
printf("**\n");
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、显示信息*\n");
printf("**\n");
printf("*0、退出系统*\n");
printf("**\n");
printf("*******************\n");
}
(5)、文件保存方法
本系统中运用的是C语言中的文件输入输出流,打开文件运用的是fopen函数,其中fopen函数中的参数为文件路径名和文件打开方式,其中需注意的是系统中运用了较多类型的输入输出流,如:
fscanf()、fprintf()、fclose(),其中代表的意思如下:
fscanf():
读入文件。
fprintf():
写入文件。
fclose():
关闭文件。
2.3总体功能设计分析
根据对系统的功能分析,在此系统中必须要有以下功能:
追加图书、修改图书、删除图书、查找图书、排序功能(其中包括价格排序、书名排序、字数排序、出版日期排序、出版社排序)、显示书库、退出功能。
其此功能分析有以下总功能图2-7和主程序流程图2-8:
退出
图2-7系统总体功能
选取功能按钮
主程序流程图:
yes
输入choice
yes
2-8主程序流程图
主函数程序设计:
调用初始化函数InitList()对结构体指针typedefstructBNode进行链表的初始化。
然后调用主界面函数menu()提示用户选取服务功能,最后根据用户输入的选项进行调用函数来实现其需要的功能。
3功能模块流程图
3.1追加记录InsertList()函数模块
yes
图3-1追加记录模块流程图
追加记录InsertList()函数设计:
追加记录函数通过查找链表判断链表中是否有输入的记录,有则提示不能插入,没有则提示用户输入图书的其他信息,并将信息存储到链尾;最后将输入的信息保存到磁盘上。
3.2删除记录DeleteList( )函数模块
开始
输入删除类型并判断类型
P->next!
=NULL
yes
P=p->next
比较输入类型
是否存在
no
yes
no
删除节点
no
flag==1
yes
不能删除
写入文件
结束
图3-2删除模块流程图
删除模块DeleteList()函数设计:
当用户在功能选项中选择删除时,主函数调用DeleteList()函数,系统提示输入要删除的图书,然后查找图书信息,当发现时,删除图书;最后调用OutToFlie()函数更新文件。
没有则提示不能删除并提示是否继续或者返回。
3.3查询图书模块SearchList()函数模块
开始
输入查询类型
P!
=NULL
no
yes
no
判断是否有记录
yes
在频幕上输出查询的信息
yes
p=p->next
结束
图3-3查询图书模块流程图
查询图书模块SearchList()函数设计:
根据用户选取的功能,主函数调用
SearchList()函数,系统自动判断链表中是否有输入的记录,有则函数依次输出跟输入信息相关的所有记录;没有则提示用户没有查找到图书信息。
3.4修改图书模块ReviseList()函数模块
开始
输入要修改的图书名
no
no
判断是否有记录
P!
=NULL
yes
结束
flag=1;beak;
break;
没有记录
修改成功
更新文件
图3-4修改模块流程图
修改图书模块ReviseList()函数设计:
根据用户选择的功能查找链表中是否有输入的书名,有则提示修改类型,并根据选择的数字提示用户输入要更改的新的内容;没有则提示用户是否继续还是返回,继续的话进行上一步操作,返回则返回主界面。
3.5冒泡排序BubbleSort()函数模块
结束
no
no
no
图3-5冒泡排序函数流程图
冒泡排序BubbleSort()函数设计:
本函数是在选择记录排序功能后,函数运用指针来比较前后两个数据的大小,把大的放倒后面,进行一次排序后,数据最大的将被调到最后,当指针指向链表最后一个节点时,排序完成。
3.6选择排序SeleteList()函数模块模块
开始
p=L->next;
P!
=NULL
no
yes
yes
no
q=p->next;min=p
q=p->next;min=p
q=p->next;min=p
比较大小
q!
=NULL
no
yes
交换min,p的数据域
p=p->next;
Show(L);
结束
图3-6选择排序函数流程图
选择排序SeleteList()函数设计:
本函数是在选择记录排序功能后,函数运用指针来找到链表中某关键字的最小的数据,并把数据调到未排完序记录最前,这样一直循环,当指针指向链表最后一个节点时,排序完成。
3.7直接插入排序InsertSort()函数模块
no
yes
图3-7直接插入排序函数图
直接插入排序InsertSort()函数设计:
本函数是通过运用指针,将指针指向的第一个结点看做有序,其后的看做无序,通过指针从无序序列中找出最小的插入到有序序列中,当指针指向第链表最后一个时,排序完成。
4系统代码分析与测试
本程序的主要核心模块是追加记录、删除记录、修改记录、记录排序、查找图书、显示信息六个功能模块。
核心模块为InsertList()函数、DeleteList()函数、ReviseList()函数、SortList()函数、SearchList()函数和Show()函数。
4.1追加记录模块
voidInsertList(LinkList&L){
p=L;
while(p->next!
=NULL)
{
p=p->next;
}
s=(BNode*)malloc(sizeof(BNode));
if(s==NULL)
{
printf("动态申请失败!
");
}
printf("请输入书名:
");scanf("%s",&s->name);
q=L;
while(q!
=NULL)
{
if(strcmp(s->name,q->name)==0)
{
flag=1;break;
}
q=q->next;
}
if(flag==0)
{
printf("请输入作者:
");scanf("%s",&s->writter);
printf("请输入出版社:
");scanf("%s",&s->publish);
printf("请输入出版日期:
");scanf("%d",&s->date);
while(s->date<100001||s->date>201407)
{
printf("输入不合法,请重新输入(100001≤日期≤201407:
");
fflush(stdin);scanf("%d",&s->date);
}
printf("请输入字数:
");scanf("%ld",&s->word);
while(s->word<10000||s->word>1000000)
{
printf("输入不合法,请重新输入(10000≤数量≤1000000:
");
fflush(stdin);scanf("%d",&s->word);
}
printf("请输入价格:
");scanf("%lf",&s->price);
while(s->price<=0||s->price>='a'&&s->price<='z')
{
printf("输入不合法,请重新输入(价格>0):
");
fflush(stdin);scanf("%d",&s->price);
}
printf("请输入数量:
");scanf("%d",&s->number);
while(s->number<=0)
{
printf("输入不合法,请重新输入(数量>0):
");
fflush(stdin);
scanf("%d",&s->number);
}
s->next=p->next;p->next=s;
OutToFile(L);//写入文件
system("cls");
}
}
本函数模块运用动态申请存储空间,当用户输入图书名时系统自行判断链表中是否已有该记录,没有则提示输入作者、出版社、出版日期、字数、价格、数量六个关键字信息,并将信息写入到数据库,有则提示不能添加信息。
4.2删除记录模块
voidDeleteList(LinkList&L){
p=L;
while(p->next!
=NULL)
{
if(strcmp(p->next->name,a)==0||strcmp(p->next->writter,a)==0,||strcmp(p->next->publish,a)==0)
{
flag=1;s=p->next;
if(s!
=NULL)
{
p->next=s->next;free(s);
}
else
{
p->next=s;
}
}
elseif(p->next==NULL)
{
break;
}
else
{
p=p->next;
}
}
if(flag==1)
{
OutToFile(L);
system("cls");
}
}
删除记录模块跟追加记录的基本代码一样,所以上面的代码只列出了主要代码。
删除模块首先提示输入要删除的类型,系统根据输入的数字键提示输入要删除的信息,然后自动判断链表中是否有该记录,没有则提示不能删除,有则自动删除并输出删除成功;最后提示用户选择继续或返回。
4.3修改记录模块
voidReviseList(LinkList&L){
LinkListp;
chara[30];
intm,n,flag=0;
printf("请输入要修改记录的图书书名:
");
scanf("%s",&a);
system("cls");
p=L->next;
while(p!
=NULL)
{
if(strcmp(p->name,a)==0)
{
flag=1;//用于标记是否查找到记录
break;
}
p=p->next;
}
if(flag==1)
{
//提示输入新的书名、作者等其他关键字信息
}
}
本函数模块首先要求用户输入一个要修改的图书名,系统检索链表中是否有该图书,有则提示选择修改类型,然后屏幕输出选择的关键字提示,用户输入关键字,系统将原
有的关键字值改为新输入的关键字值;没有则屏幕显示不能修改。
4.4记录排序模块
记录排序模块是记录排序函数SortList()函数调用三个不同的排序算法完成的,下面将分别对三个排序核心算法进行分析。
(1)、冒泡排序算法分析
voidBubbleSort(LinkList&L,intm)
{
LinkListp=NULL,q=NULL,s=NULL,p1=NULL;
p=L->next;
while(p!
=NULL)
{
q=L;
s=L->next;
while(s->next!
=NULL)
{//作者排序
if(m==2&&strcmp(q->next->writter,s->next->writter)==1)
{
//交换指针,以达到排序目地
q->next=s->next;
p1=s->next;
s->next=s->n