数构课程设计.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);}