东华大学数据结构课程设计Word文档格式.docx

上传人:b****8 文档编号:22335460 上传时间:2023-02-03 格式:DOCX 页数:62 大小:381.81KB
下载 相关 举报
东华大学数据结构课程设计Word文档格式.docx_第1页
第1页 / 共62页
东华大学数据结构课程设计Word文档格式.docx_第2页
第2页 / 共62页
东华大学数据结构课程设计Word文档格式.docx_第3页
第3页 / 共62页
东华大学数据结构课程设计Word文档格式.docx_第4页
第4页 / 共62页
东华大学数据结构课程设计Word文档格式.docx_第5页
第5页 / 共62页
点击查看更多>>
下载资源
资源描述

东华大学数据结构课程设计Word文档格式.docx

《东华大学数据结构课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《东华大学数据结构课程设计Word文档格式.docx(62页珍藏版)》请在冰豆网上搜索。

东华大学数据结构课程设计Word文档格式.docx

在每次选择菜单后,输出相应的结果,并且询问下次操作的项目。

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)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1