数构课程设计.docx
- 文档编号:7218288
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:14
- 大小:205.04KB
数构课程设计.docx
《数构课程设计.docx》由会员分享,可在线阅读,更多相关《数构课程设计.docx(14页珍藏版)》请在冰豆网上搜索。
数构课程设计
福建农林大学计算机与信息学院
计算机类
课程设计报告
课程名称:
算法与数据结构
课程设计题目:
网的存储结构及Prim算法
姓名:
王炳松
系:
信息与计算科学系
专业:
信息与计算科学
年级:
2010
学号:
102260003030
指导教师:
宁正元
职称:
教授
2011年1月20日
目录
1、数据结构课程设计任务书1
1.1、题目1
1.2、要求1
2、总体设计1
2.1、功能模块设计1
2.2、所有功能模块的流程图1
3、详细设计1
3.1、程序中所采用的数据结构及存储结构的说明1
3.2、算法的设计思想2
4、调试与测试:
2
4.1、调试方法与步骤:
2
4.2、测试结果的分析与讨论:
2
4.3、测试过程中遇到的主要问题及采取的解决措施:
3
5、源程序清单和执行结果3
6、C程序设计总结7
7、致谢7
8、参考文献7
网的存储结构及Prim算法
1、课程设计的目的
1.掌握网络的邻接表存储结构。
2.掌握优先队列的基本运算实现。
3.掌握网络的邻接表的算法实现。
4.掌握网络的最小生成树Prim算法实现。
2、课程设计的要求
对任意给定的网络(顶点数和边数自定),建立它的邻接矩阵、邻接表并输出,然后利用Prim算法或Kruskal算法生成它的最小生成树,并输出结果。
3、课程设计的内容
3.1需求分析
所谓邻接矩阵存储结构,就是用一维数组存储图或网的顶点信息,用二维数组表示顶点之间的邻接关系。
邻接表试图和网的一种链式存储结构。
在邻接表中,对图或网中的每个顶点建立一个单链表,第i个单链表中的结点是与vi相关联的边所连接的结点。
每个结点由3个域(adjvex,info,next)组成,其中邻接点域adjvex指示与顶点vi邻接的点在图中的位置,链域next指示下一条边或弧所连接的结点,数据域info存储和边或弧相关信息。
每个单链表都附设一个表头结点(由data域和next域组成),链域next指向链表中的第一个结点外,data域存放顶点vi的有关信息。
并将这些表头结点组织为一个单链表。
3.2概要设计
Prim算法是从连通网中的某顶点开始,以此作为生成树的初始状态,然后不断地将网中的其他顶点添加到生成树上,直到最后一个顶点添加到添加到生成树上时得到最小生成树。
具体方法:
(1)从网中任一顶点开始,先把该顶点包含在生成树中,此时生成树只有一个顶点。
(2)找出一个端点在生成树中另一个端点在生成树外的所有边,并把权值最小的边连同它所关联的另一个顶点添加到生成树中;当有两条以上具有相同最小权值的边可供选择时,选择其中任意一条都可以。
(3)反复执行
(1),直到所有顶点都包含在生成树中时为止。
主函数流程图如下:
Prim函数流程图如下:
3.3详细设计
#include"stdio.h"
#include"malloc.h"
#definemaxvernum100
#definemax99
typedefcharvertextype;/*顶点类型(可根据需要进行修改)*/
typedefstruct
{vertextypevex[maxvernum];/*定义顶点向量基类型为顶点类型*/
intadjmatrix[maxvernum][maxvernum];/*定义邻接矩阵为为整型,也可定义为权类型*/
intn,e;/*定义顶点数和边或弧数变量单元*/
}magraphtype;/*magraphtype为以邻接矩阵存储的网类型标识符*/
typedefstructnode/*定义表结点的结构*/
{intadjvex,info;/*邻接点域、数据域设为整型*/
structnode*next;/*链域,指向下一个结点的指针*/
}nodetype;
typedefstructfrontnode/*定义表头结点的结构*/
{vertextypedata;/*定义表头结点结构*/
structnode*next;/*数据域为顶点类型*/
}frontnodetype;
voidprim(magraphtypeg,intk,intn)/*prim算法的实现*/
{inti,j,min,p;
struct
{intadjvex,lowcost;
}closedge[maxvernum];
for(i=1;i<=n;i++)/*辅助数组初始化*/
if(i!
=k)
{closedge[i].adjvex=k;
closedge[i].lowcost=g.adjmatrix[k][i];/*填边的权值*/
}
closedge[k].lowcost=0;/*顶点vk已在生成树中,修改辅助数组*/
for(i=1;i {p=1; min=max; for(j=2;j<=n+1;j++)/*选最小权值及对应顶点*/ if(closedge[j].lowcost! =0&&closedge[j].lowcost {min=closedge[j].lowcost;/*最小权值记在min中*/ p=j;/*把于边关联的生成树外的顶点序号记在p中*/ } printf("%c__%c%d\n",g.vex[closedge[p].adjvex],g.vex[p],min); /*输出最小边及权值*/ closedge[p].lowcost=0;/*将顶点vp放入生成树中*/ for(j=2;j<=n+1;j++)/*修改辅助数组的相应值,以便下一次选最小权值的边*/ if(g.adjmatrix[p][j] {closedge[j].lowcost=g.adjmatrix[p][j];/*修改权值域*/ closedge[j].adjvex=p;/*记下边在生成树一端的顶点序号*/ } } } voidmain() {inti,j,k; charq; magraphtypemagraph; frontnodetypeadjlist[maxvernum];/*定义adjlist为邻接表类型*/ nodetype*head,*r,*p; printf("n: "); scanf("%d",&magraph.n); printf("e: "); scanf("%d",&magraph.e); printf("输入各顶点的数据: \n"); for(i=1;i<=magraph.n;i++) {fflush(stdin);/*清空内存中的键盘缓冲区,以免回车符被获取*/ scanf("%c",&magraph.vex[i]); adjlist[i].data=magraph.vex[i];} printf("输入各边权值(邻接矩阵的下三角即可)\n"); for(i=1;i<=magraph.n;i++) {for(j=1;j<=i;j++) {scanf("%d",&magraph.adjmatrix[i][j]); magraph.adjmatrix[j][i]=magraph.adjmatrix[i][j]; } } printf("vexs: ");/*输出顶点*/ for(i=1;i<=magraph.n;i++) printf("%c",magraph.vex[i]); printf("\n邻接矩阵: \n");/*输出邻接矩阵*/ for(i=1;i<=magraph.n;i++) {for(j=1;j<=magraph.n;j++) printf("%-4d",magraph.adjmatrix[i][j]); printf("\n");} printf("邻接表: \n");/*创建邻接表*/ for(i=1;i<=magraph.n;i++) {adjlist[i].next->next=NULL; r=adjlist[i].next; for(j=1;j<=magraph.n;j++) {if(magraph.adjmatrix[i][j]! =99) {p=(nodetype*)malloc(sizeof(nodetype)); p->adjvex=j;p->info=magraph.adjmatrix[i][j]; p->next=NULL; r->next=p; r=r->next;} else;} printf("[%d]%c",i,adjlist[i].data);/*输出邻接表*/ r=adjlist[i].next->next; if(r! =NULL) do{printf("-->[%d]%-2d",r->adjvex,r->info); r=r->next;} while(r! =NULL); printf("\n");} printf("pleasechoiceavex: ");/*选择最小生成树的出发结点*/ fflush(stdin);/*清空内存中的键盘缓冲区,以免回车符被获取*/ scanf("%c",&q); for(i=1;i<=magraph.n;i++) if(q==adjlist[i].data) {k=i;/*将所选结点所对应的序号赋给k*/ break;} printf("最小生成树: \n"); prim(magraph,k,magraph.n);/*建立最小生成树*/ } 3.4程序调试与测试结果。 3.5结果分析 由具体结果及分析知: 该系统的各项功能基本能够实现,各项功能的实现细节考虑还算周到,而且能够达到预期的效果,但是还有一些不足之处,比如实现的功能过于简单,还有一些问题仍无法解决,由于本人的能力有限,所以也只能达到这种程度,希望今后有更大的提升空间。 4、总结 这是一次很好的课程设计,通过这次的课程设计,学习了网络的邻接表存储结构、优先队列、网络的邻接表的算法实现,以及网络的最小生成树Prim算法实现;通过对这些算法的源代码的调试及运行,遇到了一些细节性的问题,比如: 多加了一个“}”,或者是少写了“;”等等。 通过这一次课程设计我的各方面能力得到了有效的检测,课程设计提高很多我意想不到的东西,那是在一般的学习中无法找到的,所以认真对待每一件事也是我学到的很重要的东西。 5、参考文献 [1]严蔚敏,陈文博编著.数据结构及应用算法教程.北京: 清华大学出版社 [2]宁正元.数据结构-用C语言描述.北京: 中国水利水电出版社,2000 [3]苏仕华主编.数据结构自学辅导.北京: 清华大学出版社,2002 [4]宁正元,王秀丽.算法与数据结构.北京: 清华大学出版社,2006. [5]唐浩强.C程序设计(第三版).北京: 清华大学出版社,2005. 6、附录 #include"stdio.h" #include"malloc.h" #definemaxvernum100 #definemax99 typedefcharvertextype; typedefstruct {vertextypevex[maxvernum]; intadjmatrix[maxvernum][maxvernum]; intn,e; }magraphtype; typedefstructnode {intadjvex,info; structnode*next; }nodetype; typedefstructfrontnode {vertextypedata; structnode*next; }frontnodetype; voidprim(magraphtypeg,intk,intn) {inti,j,min,p; struct {intadjvex,lowcost; }closedge[maxvernum]; for(i=1;i<=n;i++) if(i! =k) {closedge[i].adjvex=k; closedge[i].lowcost=g.adjmatrix[k][i]; } closedge[k].lowcost=0; for(i=1;i {p=1; min=max; for(j=2;j<=n+1;j++) if(closedge[j].lowcost! =0&&closedge[j].lowcost {min=closedge[j].lowcost; p=j; } printf("%c__%c%d\n",g.vex[closedge[p].adjvex],g.vex[p],min); closedge[p].lowcost=0; for(j=2;j<=n+1;j++) if(g.adjmatrix[p][j] {closedge[j].lowcost=g.adjmatrix[p][j]; closedge[j].adjvex=p; } } } voidmain() {inti,j,k; charq; magraphtypemagraph; frontnodetypeadjlist[maxvernum]; nodetype*head,*r,*p; printf("n: "); scanf("%d",&magraph.n); printf("e: "); scanf("%d",&magraph.e); printf("输入各顶点的数据: \n"); for(i=1;i<=magraph.n;i++) {fflush(stdin); scanf("%c",&magraph.vex[i]); adjlist[i].data=magraph.vex[i];} printf("输入各边权值(邻接矩阵的下三角即可)\n"); for(i=1;i<=magraph.n;i++) {for(j=1;j<=i;j++) {scanf("%d",&magraph.adjmatrix[i][j]); magraph.adjmatrix[j][i]=magraph.adjmatrix[i][j]; } } printf("vexs: ");for(i=1;i<=magraph.n;i++) printf("%c",magraph.vex[i]); printf("\n邻接矩阵: \n"); for(i=1;i<=magraph.n;i++) {for(j=1;j<=magraph.n;j++) printf("%-4d",magraph.adjmatrix[i][j]); printf("\n");} printf("邻接表: \n"); for(i=1;i<=magraph.n;i++) {adjlist[i].next->next=NULL; r=adjlist[i].next; for(j=1;j<=magraph.n;j++) {if(magraph.adjmatrix[i][j]! =99) {p=(nodetype*)malloc(sizeof(nodetype)); p->adjvex=j;p->info=magraph.adjmatrix[i][j]; p->next=NULL; r->next=p; r=r->next;} else;} printf("[%d]%c",i,adjlist[i].data); r=adjlist[i].next->next; if(r! =NULL) do{printf("-->[%d]%-2d",r->adjvex,r->info); r=r->next;} while(r! =NULL); printf("\n");} printf("pleasechoiceavex: "); fflush(stdin); scanf("%c",&q); for(i=1;i<=magraph.n;i++) if(q==adjlist[i].data) {k=i;break;} printf("最小生成树: \n"); prim(magraph,k,magraph.n);}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计