数构课程设计.docx

上传人:b****6 文档编号:7218288 上传时间:2023-01-22 格式:DOCX 页数:14 大小:205.04KB
下载 相关 举报
数构课程设计.docx_第1页
第1页 / 共14页
数构课程设计.docx_第2页
第2页 / 共14页
数构课程设计.docx_第3页
第3页 / 共14页
数构课程设计.docx_第4页
第4页 / 共14页
数构课程设计.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数构课程设计.docx

《数构课程设计.docx》由会员分享,可在线阅读,更多相关《数构课程设计.docx(14页珍藏版)》请在冰豆网上搜索。

数构课程设计.docx

数构课程设计

福建农林大学计算机与信息学院

计算机类

课程设计报告

课程名称:

算法与数据结构

课程设计题目:

网的存储结构及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、调试与测试:

4.1、调试方法与步骤:

4.2、测试结果的分析与讨论:

4.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);}

 

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

当前位置:首页 > 解决方案 > 学习计划

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

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