东华大学数据结构课程设计Word文档格式.docx
- 文档编号:22335460
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:62
- 大小:381.81KB
东华大学数据结构课程设计Word文档格式.docx
《东华大学数据结构课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《东华大学数据结构课程设计Word文档格式.docx(62页珍藏版)》请在冰豆网上搜索。
在每次选择菜单后,输出相应的结果,并且询问下次操作的项目。
3程序所能达到的功能:
完成5种排序和性能测试,删除线性表中所有值为item的数据元素。
每次操作结束后,都会有菜单方便用户进行下一步的操作。
4测试数据:
A.菜单显示为:
请输入您要测试的项目:
1.顺序存储的线性表5种排序算法
»
选择1
显示请输入元素个数
输入整数
输出5种排序方法排序后的元素
2.删除线性表中所有值为item的数据元素
选择2
显示依次输入元素,按空格分开
显示请输入item的值(整数)
输出剩下的元素
3.性能测试
选择3
输出5种排序(有序/随机元素)的时间
0.退出管理系统
选择0
退出当前程序
4.1.4概要设计
1)为了实现上述程序功能,需要定义顺序表的抽象数据类型:
typedefstructlist
{
intkey;
//关键字项
}RedType;
//记录类型
typedefstruct
RedTyper[MAXSIZE];
//r[0]闲置或用作哨兵单元
intlength;
//顺序表长度,参加排序元素的实际个数
}SqList;
//顺序表类型
2)本程序包含16个函数:
1voidInitialRandom(SqList*L)ContactList
2voidInitial(SqList*L)
3voidMerge(RedTypeSR[],RedTypeTR[],inti,intm,intn)
4voidMsort(RedTypeSR[],RedTypeTR1[],ints,intt)
5voidMergesort(SqList*L)
6voidchoice(SqList*L)
7voidbubble(SqList*L)
8voidquicksort(SqList*L,intstart,intend)
9voidHeapsort(SqList*L)
10voidHeapAdjust(SqList*L,ints,intm)
11voidout(SqList*L)
12intDelete(SqList*L,intitem)
13voidOrderInitial(SqList*L)
14voidInOrderInitial(SqList*L)
15voidPerformance()
16intmain()
4.1.5详细代码
见附录一
4.1.6使用说明
程序执行后出现如图4.1-2的菜单:
图4.1-2菜单
菜单共有四个选项,选择不同的选项会出现相应的提示进行下一步操作:
选择1:
顺序存储的线性表5种排序算法
选择2:
删除线性表中所有值为item的数据元素
选择3:
性能测试
选择0:
退出
4.1.7测试结果与分析
1.顺序存储的线性表5种排序算法,如图4.1-3:
图4.1-3
实验结果:
生成随机数,用5种方法从小到大排序
2.删除线性表中所有值为item的数据元素,如图4.1-4:
图4.1-4删除元素
分三类讨论,分别是删除第一个,最后一个,当中元素
3.性能测试,如图4.1-5:
如图4.1-5一万元素性能测试
如图4.1-6五十万元素性能测试
分别生成有序和无需的元素,用5种排序方法分别排序,并输出时间
注意:
VS6.0中10万元素以上就会溢出,特别是快速排序只能在1万元素时实现,否则栈会溢出,故在50万测试时把快速排序的函数用“//”注释掉,因此时间为0。
4.输入0退出
4.1.8参考文献
[1]严蔚敏等著,数据结构(C语言版),清华大学出版社
[2]高一凡著,数据结构算法解析,清华大学出版社
4.2链表的应用
4.2.1设计目的
熟悉链表的应用
4.2.2设计内容及要求
1)删除元素使两个链表相等。
2)猴子选大王。
3)非循环双向链表按频度排序。
4)稀疏矩阵的存储
4.2.3需求分析
本程序用C编写,完成4种链表功能,并且需要一个菜单让用户自主选择执行的功能。
5输出的形式:
6程序所能达到的功能:
完成4种链表功能。
7测试数据:
显示创建链表A/B,请将递增输入整数,用空格分开,输入-1结束
输入整数……..-1
显示删除元素后A,B链表为:
输出A,B中的元素
2.猴子选大王
显示请输入猴子总数n
显示请输入出局猴子报的数m(m<
n)
输出i号猴子为大王
3.非循环双向链表按频度排序
显示请输入元素值(1-10整数),用空格分开,-1表示结束
显示随机访问10次元素,令元素freq加1并,
使此链表中结点保持按访问频度递减的顺序排列,随机访问的元素为
输出按freq排序后的元素
4.稀疏矩阵的存储
选择4
显示请输入矩阵的总行数,总列数,用空格分开,行与列从0记起
输入ab(整数)
显示建立第一/二个矩阵
输入例如<
012>
<
103>
146>
-1-1-1>
输出输出第一/二个矩阵
输出输出相加后的矩阵
4.2.4概要设计
1)为了实现上述程序功能,需要定义链表的抽象数据类型:
//这是单链表
typedefstructLNode{
intdata;
structLNode*next;
}LNode,*LinkList;
//双向链表
typedefstructDuLNode{
intdata,freq;
//freq是频率
structDuLNode*prev,*next;
//前后两个指针
}DuLNode,*DuLinkList;
//矩阵结点
typedefstructMatrixNode{
introw,column,data;
//行列数值
structMatrixNode*next;
}MatrixNode,*MatrixList;
2)本程序包含17个函数:
voidInitial(LinkList&
L)
//建立链表
intnot_in_L(intm,LinkListL)
//判断元素是否在L中
voiddel(LinkListL1,LinkListL2)
//对L1操作,删除在L1中而不在L2中的元素
voidoutput(LinkListL)
//输出链表
voidfun1()
voidMonkey()
//猴子选大王
voidfun2()
voidInitDuList(DuLinkList&
//创建有表头结点的双向链表
DuLNode*Locate(DuLNode*L,intx)
//在L中找到值为x的节点,freq值加一,返回找到结点的地址,类型为指针型
//对p所指结点进行插入,使链表中结点保持按访问频度递减排列
voidOutputDuLink(DuLinkListL)
输出双向链表
voidfun3()
voidInitMatrix(MatrixList&
//创建稀疏矩阵
intFindData(MatrixListL,inta,intb)
//返回矩阵L的a行b列的值
voidAddMatrix(MatrixListA,MatrixListB,MatrixList&
C,inthang,intlie)
//矩阵C=A+B
voidMatrixOutput(MatrixListL,inthang,intlie)
//输出矩阵
voidfun4()
intmain()
4.2.5详细代码
见附录二
4.2.6使用说明
程序执行后出现如图4.2-2的菜单:
图4.2-2菜单
菜单共有五个选项,选择不同的选项会出现相应的提示进行下一步操作:
删除元素使两个链表相等
猴子选大王
非循环双向链表按频度排序
选择4:
稀疏矩阵的存储
4.2.7测试结果与分析
1.删除元素使两个链表相等,如图4.2-3:
图4.2-3
输出删除元素后的A,B链表,若有相同的元素则保留
2.猴子选大王,如图4.2-4:
图4.2-4删除元素
输出几号猴子是大王
3.非循环双向链表按频度排序,如图4.2-5:
图4.2-5
随机访问链表10次,按照频度由大到小排列输出
4.稀疏矩阵的存储,如图4.2-6
输入数据:
+
=
图4.2-6
输出相加后的矩阵
5.输入0退出
4.2.8参考文献
4.3树与二叉树
4.3.1设计目的
熟悉二叉树的应用
4.3.2设计内容及要求
1)输入字符序列,建立二叉链表,中序遍历二叉树输出。
2)二叉树的叶子结点按从左到右的顺序连成一个单链表
3)判断某二叉树是否是完全二叉树。
4)判断某二叉树是否是二叉排序树
4.3.3需求分析
本程序用C编写,完成4种二叉树功能,并且需要一个菜单让用户自主选择执行的功能。
输入的元素是整形,输入值的范围是一位整数,输入空格开标节点为空。
8输出的形式:
9程序所能达到的功能:
完成4种二叉树功能。
10测试数据:
1.输入字符序列,建立二叉链表,中序遍历二叉树输出
显示请依次先序输入,两个元素之间不需要空格,
结点为空输入空格,按回车结束
输入例如:
12345回车
输出中序遍历输出二叉树
2.二叉树的叶子结点按从左到右的顺序连成一个单链表
输出先序遍历叶子节点,链表输出叶子节点
3.判断某二叉树是否是完全二叉树
输出是否是完全二叉树
4.判断某二叉树是否是二叉排序树
显示请依次先序输入,两个元素之间需要空格,
结点为空输入0,按回车结束
12300400500回车
输出是否是二叉排序
4.3.4概要设计
//data是char类型的二叉树
typedefstructBiTNode{
chardata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
//data是int类型的二叉树
typedefstructBiTNode2{
structBiTNode2*lchild,*rchild;
}BiTNode2,*BiTree2;
2)本程序包含13个函数
//创建data是char类型的二叉树
voidCreateBiTree(BiTree&
T)
//创建data是int类型的二叉树
voidCreateBiTree2(BiTree2&
T)
//中序遍历
voidInOrder(BiTreeT)
//把二叉树的叶子结点按从左到右的顺序连成一个单链表,表头指针为head
voidLeafLinkList(BiTreeT)
//先序遍历叶子结点
voidPreOrderLeaf(BiTreeT)
//判断是否是完全二叉树层次遍历二叉树返回是true,否false
intCompleteBiTree(BiTreeT)
//int型中序遍历2
voidInOrder2(BiTree2T)
//判断是否是二叉排序树返回是true,否false
//二叉排序树的中序遍历是有序递增的
intSortTree()
voidfun2()
voidfun3()
voidfun4()
intmain()
4.3.5详细代码
见附录三
4.3.6使用说明
图4.32菜单
输入字符序列,建立二叉链表,中序遍历二叉树输出
二叉树的叶子结点按从左到右的顺序连成一个单链表
判断某二叉树是否是完全二叉树
判断某二叉树是否是二叉排序树
4.3.7测试结果与分析
1.输入字符序列,建立二叉链表,中序遍历二叉树输出,如图4.33:
测试数据为:
图4.33
中序遍历输出二叉树
2.二叉树的叶子结点按从左到右的顺序连成一个单链表,如图4.4:
图4.34
先序遍历叶子节点,链表输出叶子节点
3.判断某二叉树是否是完全二叉树,如图4.35:
测试数据:
图4.35
第一棵树是完全二叉树,第二棵不是。
4.判断某二叉树是否是二叉排序树,如图4.36
图4.36
第一棵树是二叉排序树,第二棵不是
4.3.8参考文献
5体会与感想
经过这次实验,我对数据结构中的顺序表,链表,二叉树有了进一步的认识。
对于实现算法我总结出以下几点:
1.问题是否是已经学过的数据结构,如果不是,就阅读相关参考书,并加以自己的思考。
2.在测试数据是要注意分类讨论,考虑问题必须全面。
例如:
删除链表节点时,要考虑删除的元素位于链表中的第一个,最后一个,中间,删除后链表为空,链表本来为空,这5中情况进行测试。
3.在实现代码编译正确的同时,要注重代码的质量,其中包括代码实际的模块化,代码的风格(上下括号要匹配),测试代码要全面,没有漏洞。
4.在实现线性表第三个函数:
“分别生成有序和无需的元素,用5种排序方法分别排序,并输出时间时”快速排序会出现一些问题。
VS6.0中10万元素以上就会报错,特别是快速排序只能在1万元素时实现,否则栈会溢出,故在50万测试时把快速排序的函数用“//”注释掉,因此时间为0。
因此本实验中就用1万元素进行实验。
5.碰到一道题目如果没有思路时,可以先在纸上画出流程图,写出算法的分析,把题目的结果推算出来(例如画出完全二叉树、二叉排序树,写出中序遍历和先序遍历),这样可以使自己的变成思路变得清晰、明了。
对于解决复杂的问题有帮助。
对于算法的实现,尽量保证程序执行的高效率,尽量做到程序代码结构清晰,可读性良好,针对输入的数据进行多方面的分类讨论,程序的适应性良好。
操作界面加入提示,做到人性化。
为了实现这几个算法,经过思考后,我参考了书上的算法,并参考了一些课外资料,并加以自己的算法优化。
今后争取提高编程的速度与正确率,并进一步思考更有难度的代码。
附录:
设计一的代码
#include<
stdio.h>
time.h>
stdlib.h>
iostream>
usingnamespacestd;
#defineMAXSIZE10000//50万(vs6.0中10万以上就会报错)
//结构体
//顺序表类型
voidInitialRandom(SqList*L)
{
inti;
cout<
<
"
请输入元素个数"
endl;
cin>
>
L->
length;
srand((unsigned)time(NULL));
随机生成数字"
for(i=0;
i<
i++)
{
L->
r[i].key=rand()%100;
cout<
r[i].key<
"
;
}
}
voidInitial(SqList*L)
依次输入元素,按空格分开"
cin>
r[i].key;
voidMerge(RedTypeSR[],RedTypeTR[],inti,intm,intn)
{//将有序的SR[i..m]和SR[m+1..n]由小到大合并成有序表TR[i..n]
//i开始。
m中间。
n结尾
intj,k,p,q;
k=i;
j=m+1;
p=i;
//将较小的放入TR中,i,j是指针,i指向开头,j指向中间
while(i<
=m&
&
j<
=n)
{
if(SR[i].key<
SR[j].key)
TR[k++].key=SR[i++].key;
else
TR[k++].key=SR[j++].key;
}
=m)
TR[k++]=SR[i++];
//将剩余的SR[i...m]复制到TR[]
while(j<
=n)
TR[k++].key=SR[j++].key;
//将剩余的SR[j...m]复制到TR[]
for(q=p;
q<
=n;
q++)//让SR与TR相等
SR[q].key=TR[q].key;
voidMsort(RedTypeSR[],RedTypeTR1[],ints,intt)
//将SR归并为SR,s开始。
t结尾
intm;
if(s==t)
TR1[s].key=SR[s].key;
else
{
m=(s+t)/2;
Msort(SR,TR1,s,m);
//对SR第一部分调用递归排序
Msort(SR,TR1,m+1,t);
//对SR第二部分调用递归排序
Merge(TR1,SR,s,m,t);
//将TR合并为SR
voidMergesort(SqList*L)
{intn;
n=L->
RedType*b=newRedType[n];
Msort(L->
r,b,0,n-1);
//a归并到b
//选择排序
voidchoice(SqList*L)
inti,j,k;
inttemp;
k=i;
for(j=i+1;
j<
j++)
if(L->
r[j].key<
r[k].key)
k=j;
if(i!
=k)//第i个元素与第k个元素交换
{
temp=L->
L->
r[i].key=L->
r[k].key;
r[k].key=temp;
}
//冒泡排序
voidbubble(SqList*L)
inti,j,temp;
for(j=L->
length-1;
j>
i;
j--)
r[i].key>
r[j].key)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东华 大学 数据结构 课程设计