数据结构课程设计12440.doc

上传人:scccc 文档编号:11578250 上传时间:2021-08-24 格式:DOC 页数:21 大小:887.50KB
返回 下载 相关 举报
数据结构课程设计12440.doc_第1页
第1页 / 共21页
数据结构课程设计12440.doc_第2页
第2页 / 共21页
数据结构课程设计12440.doc_第3页
第3页 / 共21页
数据结构课程设计12440.doc_第4页
第4页 / 共21页
数据结构课程设计12440.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《数据结构课程设计12440.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计12440.doc(21页珍藏版)》请在三一文库上搜索。

1、成 绩 评 定 表学生姓名冯有礼班级学号1009010118专 业信息与计算科学课程设计题目1.最小生成树解决城市联络网建设问题2.线性表的插入,删除,添加。评语组长签字:成绩日期 20 年 月 日课程设计任务书学 院理学院专 业信息与计算科学学生姓名冯有礼班级学号1009010118课程设计题目1.最小生成树解决城市联络网建设问题2.线性表的插入,删除,添加。实践教学要求与任务:1、巩固和加深对数据结构基本知识的理解。2、初步掌握简单软件的分析方法和设计方法。3、了解与课程有关的工程技术规范,能正确解释和分析设计结果。4、具体任务(1)最小生成树解决城市联络网建设问题(2)线性表的插入,删除

2、,添加。工作计划与进度安排:第一天 查阅资相关料; 第二、三天 程序设计; 第四程序调试; 第五天天 答辩指导教师: 201 年 月 日专业负责人:201 年 月 日学院教学副院长:201 年 月 日摘 要“数据结构”是有关计算技术及信息管理技术专业的一门必修的核心课程。数据结构课程的任务实在讨论在应用问题求解时数据的逻辑组织、在计算机中的存储实现以及相关操作的算法设计。数据结构课程目的是使学生掌握在实际问题解决过程中组织数据、存储数据和处理数据的基本方法,为以后从事软件开发和应用,为进一步学习后续课程打下坚实的基础。本文第一个问题是针对随着现代网络的高速发展,从成本角度出发,要求所假设的光缆

3、长度最短,故而采用最小生成树来建模此问题。本文给出了一个城市间光缆假设的场景,采用Prim算法、Kruskal算法两种算法解决该城市间光缆假设问题,并通过实验仿真分别实现这两种算法,得到了城市联络网建设的最佳解决方案。本文第二个问题是根据本学期对数据结构中线性表的学习,编写了一个程序,完成线性表的插入,删除,和查找功能。关键词:最小生成树;Prim算法;Kruskal算法;线性表目 录1.最小生成树解决城市联络网建设问题11.1问题描述11.2问题分析11.3算法分析21.4算法实现及结果分析52.线性表的插入删除查找程序72.1问题描述72.2问题分析72.3算法分析82.4运行结果9总 结

4、10参考文献11附录源程序代码12171.最小生成树解决城市联络网建设问题1.1问题描述假设要在个城市之间建立通信联络网,其中顶点表示城市,边表示城市之间是否有通路,边上的权值表示在两者间建立通信链路的花费,要求使得任意两市之间都有通信链路,并且使得总的建设费用最少。显然,我们会想到连通个城市只需要条线路,在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。个城市之间,最多可以设置条线路,那么,如何在这些可能的线路中选择条,使得总的耗费最少呢?根据所学的知识,我们知道可以通过寻找最小生成树来解决这个问题。下面我们以图1为例,运用普利姆算法以及克鲁斯卡尔算法来解决城市间通信网建立问

5、题。 图11.2问题分析在一个具有几个顶点的连通图中,如果存在子图包含中所有顶点和一部分边,且不形成回路,则称为图的生成树,代价最小生成树则称为最小生成树。最小生成树有个重要的性质MST性质(最小生成树性质):设是一个连通网络,是顶点集的一个真子集。若是中一条“一个端点在中(例如:),另一个端点不在中的边,且具有最小权值,则一定存在的一棵最小生成树包括此边。多数算法利用这个性质来求解最小生成树,本文用到的普里姆算法和克鲁斯卡尔算法均利用了这个性质,同时它们也属于贪心算法。贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅

6、是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。本文中的城市通信网建设问题要求使得任意两市之间都有通信链路,并且使得总的建设费用最少,故而适合用贪心算法求解。1.3算法分析1)Prim 算法 假设是图中顶点的集合,为最小生成树中的边的集合,则算法通过以下步骤可以得到最小生成树:1:初始化:,。此步骤设立一个只有结点的结点集和一个空的边集作为最小生成树的初始形态,在随后的算法执行中,这个形态会不断的发生变化,直到得到最小生成树为止。2:在所有边中,找一条权最小的边,将此边加进集合中,并将此边的非中顶点加入

7、中。此步骤的功能是在边集中找一条边,要求这条边满足以下条件:首先边的两个顶点要分别在顶点集合和中,其次边的权要最小。找到这条边以后,把这条边放到边集中,并把这条边上不在中的那个顶点加入到中。这一步骤在算法中应执行多次,每执行一次,集合和都将发生变化,分别增加一条边和一个顶点,因此,和是两个动态的集合,这一点在理解算法时要密切注意。3:如果,则算法结束;否则重复步骤2。可以把本步骤看成循环终止条件。我们可以算出当时,步骤2共执行了次(设n为图中顶点的数目),中也增加了条边,这条边就是需要求出的最小生成树的边。Prim算法伪代码如下:void MiniSpanTree_PRIM(MGraph G,

8、VertexType u) /用普利姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。/记录从顶点集U到V-U的代价最小的边得辅助数组定义/ struct/ VertexType adjvex;/ VRType lowcost;/ closedgeMAX_VERTEX_NUM; k=LocateVex(G,u); for(j=0;jG.vexnum;+j) /辅助数组初始化 if(j!=k) closedgej=u,G.arcskj.adj; /adjvex,lowcost closedgek.loecost=0; /初始,U=u for(i-0;i0, Printf(closed

9、gek.adjvex,G.vexsk); /输出生成树的边 closedgek.lowcost=0; /第k顶点并入U集 for(j=0;jG.vexnum;+j) if(G.arcskj.adjnextarc)/对v0的每个邻接顶点检查w=p-adjvex; /w为v0的邻接顶点if(visitedw=0) /w未曾访问,是v0的孩子 DFSArticul(G,w); /返回前求得loww if(loww=visitedv0) printf(v0,G.verticesv0.data); /关节点else if(visitedwmin) min=visitedw; /w已访问,w是v0在生成树

10、上的祖先/forlowv0=min/DFSArticul。Kruskal算法的时间复杂度为(其中e为网中边得数目)。Kruskal算法构造最小生成树如下图所示: 图8 图9 图10 图11 图12 图131.4算法实现及结果分析输入(表1):城市或城镇点 A(0)点 B(1)点 C(2)点 D(3)点 E(4)点 A(0)点 B(1)1点 C(2)213点 D(3)384点 E(4)111456点 F(5)12101597 表1Prim算法输出(表2):从()城市到()城市权值A(0)B(1)1A(0)C(2)2A(0)D(3)3C(2)E(4)5E(4)F(5)7 表2运行结果如图14: 图

11、14Kruskal算法输出(表3):从()城市到()城市权值A(0)B(1) 1A(0)C(2) 2A(0)D(3) 3C(2)E(4) 5E(4)F(5) 7合计18 表3运行情况如图15: 图152.线性表的插入删除查找程序2.1问题描述线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。 本文针对首先建立顺序表,然后利用顺序表的查找、删除、输出等运算反复实现顺序表的这些操作(插入、删除、

12、查找、输出单独写成函数的形式),并能在屏幕上输出操作前后的结果。2.2问题分析 本文开始建立一个顺序表,根据要求,然后利用顺序表的查找、删除、输出等运算反复实现顺序表的这些操作(插入、删除、查找、输出单独写成函数的形式),并能在屏幕上输出操作前后的结果。2.3算法分析Status ListInsert_Sq(SqList *L, int i ,ElemType e) /顺序表的插入 ElemType *p,*q; if (iL-length+1) return ERROR; if (L-length =L-listsize) L-elem = (ElemType * )realloc(L-el

13、em,(L-listsize + LISTINCREMENT) * sizeof (ElemType); if (!L-elem )exit(OVERFLOW); L-listsize += LISTINCREMENT; q = & (L-elemi-1); for (p = & (L-elemL-length - 1);p=q;-p)*(p+1) = *p; *q = e ; +L-length ; return OK ;Status LocateElem_Sq(SqList L, ElemType e) /顺序表的查找 int i=1; ElemType *p; p =L.elem; wh

14、ile (i=L.length & !(*p+=e) +i; if (i=L.length) return i; else return 0; Status ListDelete_Sq(SqList *L,int i) /顺序表的删除ElemType e,*p,*q;if(iL-length) return ERROR;p=&(L-elemi-1);e=*p;q=L-elem+L-length-1;for(+p;plength;printf(%3dn,e);return OK;2.4运行结果总 结通过本次课程设计,使我对数据结构程序的设计方法、步骤、思路、有一定的了解与认识。在课程设计过程中按

15、照规定的程序进行,先针对题目收集、调查有关资料,然后进入程序调试阶段,其间与指导教师进行讨论、修改,再讨论、再修改,最后定案,进行写论文阶段。整个过程周密有序,按时高质完成全部课程设计。此次课程设计按照设计任务书、指导书、技术条件的要求进行顺利完成任务,加深了对数据结构这么课程的了解,在程序调试以及实现过程中,进一步了解数据结构中的原理,理论,对知识的理解进一步深化参考文献1吴伟民.数据结构(C语言版).北京:清华大学出版社,20092姚诗斌.数据结构基础.北京:北京大学出版社,19933严蔚敏.并行算法引论.天津:石油工业出版社,19924胡蕴超.算法与数据结构.北京:电子工业出版社,199

16、3附录源程序代码1最小生成树解决城市联络网建设问题源程序代码#includeusing namespace std;#include const int maxvertexnum=20;const int maxedgenum=40;typedef int adjmatrixmaxvertexnummaxvertexnum;struct edgenodeint frontvex;int rearvex;int weight;typedef edgenode adgesetmaxedgenum;/=void insitadj(adjmatrix &GA);void setadj(adjmatri

17、x &GA,int n);void fun(adjmatrix GA,adgeset >,int n);void display(adgeset GT,int n);void insit(adgeset >,int n,adjmatrix GA);/=void insit(adgeset>,int n,adjmatrix GA)for(int i=0;in-1;i+)GTi.frontvex=0;GTi.rearvex=i+1;GTi.weight=GA0i+1;void insitadj(adjmatrix &GA)for(int i=0;imaxvertexnum;i+)for

18、(int j=0;jmaxvertexnum;j+)GAij=20000;void setadj(adjmatrix &GA,int n)int i;for(i=0;i=n;i+)for(int j=i+1;jn;j+)cout请输入第i个城市到第jGAij;for(i=0;i=n;i+)for(int j=i+1;jn;j+)GAji=GAij;void fun(adjmatrix GA,adgeset>,int n) int i,j;for( i=0;in-1;i+)int min=10000,m=i;for(j=i;jn-1;j+)if(GTj.weightmin)min=GTj.w

19、eight;m=j;edgenode temp=GTi;GTi=GTm;GTm=temp;int k=GTm.rearvex;for( j=i;jn-1;j+)int t=GTj.rearvex;int w=GAkt;if(wGTj.weight)GTj.weight=w;GTj.frontvex=k;void display(adgeset GT,int n)for(int i=0;in-1;i+)cout第GTi.frontvex个城市到第GTi.rearvex城市修建一条电缆!GTi.weightendl;cout这样修建可以使距离最短!;int main()cout你要在几个城市间建设

20、网络?请输入:n;adgeset GT;adjmatrix GA;insitadj(GA);setadj(GA,n);insit(GT,n,GA);fun(GA,GT,n);display(GT,n); int x; cinx;return 0;2.线性表的插入,删除,添加的源程序:#include #include #define OK 1#define ERROR 0 #define OVERFLOW -1typedef int ElemType; typedef int Status;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10ty

21、pedef struct ElemType *elem; int length; int listsize; SqList;Status InitList_Sq(SqList *L) int i,n; L-elem = (ElemType * )malloc(LIST_INIT_SIZE*sizeof(ElemType); if (! L-elem) exit (OVERFLOW); printf(您希望您的线性表有几个元素: ); scanf(%d,&n); printf(n); printf(输入您的%d个元素,以构建顺序表: n,n); for(i=1;ielemi-1); L-leng

22、th = n; L-listsize = LIST_INIT_SIZE; return OK;/InitList_SqStatus PrintList_Sq(SqList L) int i; printf(顺序表中的元素为: ); for (i=1;i=L.length;i+) printf(%d ,L.elemi-1); printf(n); return OK;/PrintList_Sq Status ListInsert_Sq(SqList *L, int i ,ElemType e) ElemType *p,*q; if (iL-length+1) return ERROR; if (

23、L-length =L-listsize) L-elem = (ElemType * )realloc(L-elem,(L-listsize + LISTINCREMENT) * sizeof (ElemType); if (!L-elem )exit(OVERFLOW); L-listsize += LISTINCREMENT; q = & (L-elemi-1); for (p = & (L-elemL-length - 1);p=q;-p)*(p+1) = *p; *q = e ; +L-length ; return OK ;/ListInsert_SqStatus LocateEle

24、m_Sq(SqList L, ElemType e) int i=1; ElemType *p; p =L.elem; while (i=L.length & !(*p+=e) +i; if (i=L.length) return i; else return 0; Status ListDelete_Sq(SqList *L,int i)ElemType e,*p,*q;if(iL-length) return ERROR;p=&(L-elemi-1);e=*p;q=L-elem+L-length-1;for(+p;plength;printf(%3dn,e);return OK;void

25、main() SqList L; ElemType k,e; int i,j,m; if (InitList_Sq(&L)=OVERFLOW) printf(分配失败,退出程序!); printf(输出程序中的元素n); PrintList_Sq(L); printf(n请输入所需插入的位置和您要插入的元素:); printf(ninput i,e=); scanf(%d%d,&i,&e); if (ListInsert_Sq(&L,i,e)!=OK) printf(i值不合法或当前存储空间以满n); else PrintList_Sq(L); printf(n); printf(请输入您要查找的元素:); scanf(%d,&k); m=LocateElem_Sq ( L,k); if(m) printf(n您要查找的元素是这个线形表的第%d个元素n,m); else printf(对不起,该线形表中不存在这个元素n); printf(n请输入要删除的第几个元素:j=); scanf(%d,&j); printf(n); if (ListDelete_Sq(&L,j)!=OK) printf(删除失败!); else PrintList_Sq(L); printf(n);

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1