数据结构》课程设计。
数据结构演示系统。
一需求分析。
二概要设计。
三详细设计。
四调试分析。
五测试结果。
六设计总结。
七参考文献。
八附录程序。
一, 课程设计题目。
数据结构演示系统1
1)、顺序表的插入、删除和合并等基本操作。
2)、利用插入运算建立链表;实现链表的查找、删除、计数、输出等功能以及有序链表的合并。
3)、串的模式匹配(包括求next和nextval的值)。
2程序模块的功能要求。
1) 输入的形式和输入值的范围。
2) 顺序表和链表的输入形式是整形,输入值的范围是0---9999。
串的输入形式是字符型。
3) 输出的形式。
顺序表和链表的输出形式是整形;
串的输出形式是字符型。
4) 程序所能达到的功能;
实现顺序表的创建、插入、删除和合并。
实现链表的创建、查找、删除、插入、输出。
实现串的模式匹配(包括求next和nextval的值)
5) 测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
顺序表的输入:0|11|22|33|44|55|66|77|88|99|
链表输入: 2 3 4 5 6 7 8 9
二, 概要设计。
1, 定义。
定义顺序表的结构体。
typedef int elemtype;
typedef struct定义顺序表结构体。
elemtype data[maxsize];
int length;
sqlist;
定义链表的结点结构。
typedef struct node定义单链表结点结构类型*/
int data结点的数据域*/ struct node *next结点的指针域*/
linklist;
定义字符串的数组结构。
int indexbf(char s,char t,int pos)
int i,j,m,n;
i=pos-1;j=0;
m=strlen(s);
n=strlen(t);
2,主流程图。
3,各模块之间的层次关系。
1) 第一层为主界面函数,第二层为顺序表界面函数、链表界面函数、模式匹配界面函数。
第三层为顺序表子函数、链表子函数、模式匹配子函数。
2)主界面函数调用的函数有sqlistfuc()、linklistfuc()、indexfuc()
顺序表界面调用的函数有creatsq()、listinsert()、listdelete()、mergelist()
链表界面调用的函数有creat()、insert()、delete()、search()、mergelink()、
模式匹配界面调用的函数有creatstring()、kmp(),getnext(),getnextval
三,详细设计(见附录)
四、调试分析。
1、调试过程中遇到的问题是如何解决的以及对设计与实现的讨论和分析。
1)一开始在在调试程序时遇到了内存错误,最终通过网上查资料找到了出错的原因:在建立对头指针和队尾指针时没有对指针进行初始化,即没有为指针动态分配空间。
2指针变量没有初始化。定义一个指针变量,c编译系统即为它开辟了一个存储空间,如果不进行初始化,则存放的是一个随机地址,它指向的位置就不确定,这在c中是很危险的,如果让一个随机的指针去指向一个随机的地址的话,可能会指向系统的工作区域,破坏数据,从而破坏某种设置,结果可能会使系统运行失常、死机甚至瘫痪。
3)警告错误太多。忽略这些警告错误并不影响程序的执行,但有时会影响到程序的执行结果,所以一定要对“warning”错误引起足够重视,编程时尽量按照警告信息消除可能影响程序结果的隐患。 编译时当警告错误数目大于某一规定值时(缺省为100)便退出编译器, 这时应改变集成开发环境菜单options/compiler/errors中的有关警告错误检查开关为off。
4)循环语句中, 循环控制变量在每次循环未进行改变, 使循环成为死循环;或和在循环语句中,不能正确的给循环变量初始化,造成循环次数不合乎要求,得不到正确的结果。
2、算法的时间复杂性。
1)顺序表查找的时间复杂度为:o(1)、插入的时间复杂度为:o(n)、删除的时间复杂度为:o(n)、合并的时间复杂度为:o(n)
2)有序链表插入、查找、删除、合并的时间复杂度分别为为:o(n)、o(1)、o(1)、o(n)
3)kmp模式匹配的时间复杂度为:o(n*m)
三, 测试结果。
运行环境:c-free 4
1, 编译进入主界面。
2, 输入数字1进入顺序表界面。
输入1进行顺序表的创建。
输入10个元素,建立一个顺序表。
按y继续运行进入顺序表的主界面,按2输出刚建立顺序表。
按y继续运行进入顺序表的主界面,按3在顺序表中查找。
按y继续运行进入顺序表的主界面,按4在顺序表插入一个元素。
按y继续运行进入顺序表的主界面,按5在顺序表删除一个元素。
按y继续运行进入顺序表的主界面,按6进行顺序表的合并。
按y继续运行进入顺序表的主界面,按0返回主菜单。
3, 输入数字2进入链表的界面。
输入1进行单链表的建立。
输入2查找单链表,查找节点位置4
输入3插入节点,节点位置为4,插入的元素为100
输入4删除节点,节点位置为4
输入5输出单链表。
输入6返回主菜单。
4, 输入3进入字符串模式匹配界面。
输入1进行bf匹配,匹配的起始位置为4,主串为aaabaaaabaa
输入2进行kmp匹配,起始位置为3
输入3查看next[ ]
输入4查看nextval [
输入5显示字符串。
输入6退出字符串界面,进入主菜单。
5, 按数字4退出系统。
六、课程设计总结。
在开始的时候,很多人都会在编程语言上下苦功,本身并没有错,但是有些人就会产生程序设计的问题就是对编程语言的使用问题的观念,导致他们在进一步学习程序设计的过程中忽略了各种编程思想的吸收和运用,例如有些人很清楚指针的工作原理,却不懂得怎样去利用指针构造并操作完美的链表,他们设计出来的链表也许在删除节点的时候没有释放内存,或许在插入节点的时候因赋值顺序错误导致链表“断裂”,信息丢失,等等。随着要解决的问题复杂度越来越大,没有经过良好程序设计思想组织起来的**会出现各种各样的逻辑错误,这种漏洞百出的程序在运行时有时甚至会导致系统崩溃。
所以在对编程语言有了初步了解之后,应该开始重视编程思想的培养,语言很重要,但究竟只是工具,思想才是精髓。当初我得到《数据结构》一书后,就通过阅读书中的各种数据结构及相应算法的**来吸收书中的思想。我认为学习数据结构最能培养一个人对解决程序设计问题的敏感性,其建模思想对解决各种棘手问题有很大帮助,看书的时候要学会思考,例如循环队列的尾节点为何一定要是空的。
当你懂得程序设计问题是类似于数学建模的思想问题后,你才算是真正入门了。这时,面对程序设计,才不会无所适从。
再进一步提高自己,就要靠做题来验证各种算法思想,前期做题的时候要参考别人的**,学会从执行效率上分辨出**的优劣,其次再讨论其实现难度。之后就是形成自己的风格,有自己的一套解题方式和相应的算法,例如在快排和堆排的具体使用上,能有自己的一套运用方式。根据具体问题采取自己所熟悉的相应算法来解决,这样的话或许程序的运行效率不是最高效的,但解决问题的速度会比较快,而且这种根据自己风格设计的程序出错率通常会比较低。
七、参考文献。
数据结构》(c语言版)--清华大学出版社---严蔚敏+吴伟民编。
c语言程序设计》(第二版)--中国铁道出版社--李丽娟+马淑萍编。
八、附录程序。
#include<>
#include<>
#include<>
#include<>
#include<>
#include<>
#include<>
#include
#define maxsize 100
#define len sizeof(linklist)
typedef struct node定义单链表结点结构类型*/
int data结点的数据域*/
struct node *next结点的指针域*/
linklist;
linklist *linkcreat建立单链表函数*/
int x;
linklist *head,*p,*rearhead,rear分别为头指针和尾指针*/
printf("\t你选择的是尾插法建立链表功能:");
head=(struct node*)malloc(len);
head->data=-999头指针数据域初始为-999*/
rear=head尾指针的初始值为头结点head*/
printf("\t请输入一组正整数以0结束输入:\t");
scanf("%d",&x);
while(x!=0输入数据以0为结束标志*/
课程设计报告格式 课程设计
洛阳理工学院。课程设计说明书。课程名称。设计课题。专业。班级。学号。姓名。完成日期2014年12月26日。问题描述 小四宋体,行间距单倍行距,每段缩进两个字符。叙述一下设计的内容要求。基本要求 小四宋体,行间距单倍行距,每段缩进两个字符。叙述一下设计的基本要求。测试数据 小四宋体,行间距单倍行距,每...
课程设计总结,课程设计报告
课程设计总结,课程设计报告。3.尝试应用项目管理软件进行项目进程的规划管理 绘制甘特图,不作硬性要求 二 选题说明。人事管理是企业信息管理的重要部分,面对大量的人事工资信息,财务部门采用人力处理将浪费大量的时间 人力和物力,且数据的准确性低。因此,开发一个界面友好,易于操作的人事工资管理软件进行自动...
课程设计 课程设计报告格式
学校名。课程设计报告。课程名称 c语言程序设计 系别 专业班级 学号。姓名。课程题目 企业人事管理系统 完成日期 指导老师 年月日。附件。课程设计的内容。企业人事管理系统 本项目的目标是开发一个功能实用,操作简便,简单明了的人事管理系统。能够录入人事的基本资料,在操作上能够完成诸如添加 修改 删除 ...