数据结构C语言课程设计任务书完整版图的算法.docx
- 文档编号:5900079
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:14
- 大小:362.94KB
数据结构C语言课程设计任务书完整版图的算法.docx
《数据结构C语言课程设计任务书完整版图的算法.docx》由会员分享,可在线阅读,更多相关《数据结构C语言课程设计任务书完整版图的算法.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构C语言课程设计任务书完整版图的算法
目录
1需求分析2
1.1目的2
1.2功能2
1.3结果展示2
2详细设计2
2.1数据类型3
2.2总体功能流程图4
2.3伪码算法5
3调试分析13
3.1遇到的问题13
3.2算法的时空分析13
3.3改进设想13
3.4经验体会13
4测试结果14
5参考文献15
1、需求分析
1.1、目的
图的存储结构的建立、Prim、Kruskal、Dijkstra和拓扑排序算法。
1熟练图数据结构算法
2熟练掌握数据结构
3复习C语言的各个知识点
1.2、功能
(1)将图的信息建立文件;
(2)从文件读入图的信息,建立邻接矩阵和邻接表;
(3)实现Prim、Kruskal、Dijkstra和拓扑排序算法。
2、详细设计
2.1、数据类型
2.1.1、图的抽象数据类型
ADTGraph{
数据对象:
V:
v是具有相同特性的数据元素的集合,称为顶点集。
数据关系:
R={VR}
VR={v,w}|v,w∈V且P(v,w),
谓词P{v,w}定义了弧
基本操作:
intlocateALG(ALGraphg,charv)
操作结果:
得到某元素的位置
intconvert(char*str)
操作结果:
将字符转化为数字
intReadFileBiao(ALGraph&g,FILE*fp)
操作结果:
从文件中读取信息到邻接表
voidReadFilejuzhen(MGraph&G,FILE*fp)
操作结果:
从文件中读取信息到邻接矩阵
voidMiniSpanTree_PRIM(MGraphG,charu)
操作结果:
普里姆算法的实现
voidSortEdge(MGraphG,EdgeE[])
操作结果:
对图中的权值进行递增排序
voidMiniSpanTree_Kruskal(EdgeE[],MGraphG,intn)
操作结果:
克鲁斯卡尔算法的实现
voidppath(MGraphG,charpath[],inti,charv)
操作结果:
求图中某点最短距离所经过的顶点
voidDisPath(MGraphG,intdist[],charpath[],ints[],intn,charv)操作结果:
计算最短路径
voidShortestPath_DIJ(MGraphG,charv)
操作结果:
迪杰斯克拉算法的实现
intFindInDegree(ALGraphG,intindegree[])
操作结果:
求各顶点的入度
voidTopologicalSort(ALGraphG)
操作结果:
拓扑排序算法的实现
}ADTGraph
2.1.2、栈的抽象数据类型
ADTStack{
数据对象:
D={ai|ai∈ElemSet,i=1,2,………,n,n>=0}
数据关系:
R1={
约定an端为栈顶,ai端为栈底。
基本操作:
InitStack(&S)
操作结果:
构造一个空栈S
DSestroyStack(&Ss)
操作结果:
销毁栈
Push(&S,e)
操作结果:
插入元素e为新的栈顶元素
Pop(&S,&e)
操作结果:
删除S的栈顶元素,并用e返回其值
StackEmpty(S)
操作结果:
判断栈是否为空
}
2.2、总体功能流程图
1、功能模块
2、主界面流程图
2.3、伪码算法
1、普里姆算法伪代码及流程图
voidMiniSpanTree_PRIM(MGraphG,charu){
intM[50][50];
intv,i,j,k;
v=locateMG(G,u);
for(i=0;i for(j=0;j M[i][j]=G.arcs[i][j].adj; for(i=0;i for(j=0;j { if(M[i][j]==0) { G.arcs[i][j].adj=999; } } intlowcost[50],min; for(i=0;i { lowcost[i]=G.arcs[v][i].adj; } lowcost[v]=0; for(i=1;i { min=999; for(j=0;j if(lowcost[j]! =0&&lowcost[j] { min=lowcost[j]; k=j; } printf("边(%c,%c)权为: %d\n",closest[k],G.vexs[k],min); lowcost[k]=0; for(j=0;j if(G.arcs[k][j].adj! =0&&G.arcs[k][j].adj lowcost[j]=G.arcs[k][j].adj;离 closest[j]=G.vexs[k]; } } } } 2、克鲁斯卡尔的伪代码及流程图 voidMiniSpanTree_Kruskal(EdgeE[],MGraphG,intn) {inti,j,m1,m2,sn1,sn2,k,vset[100];charu,v;for(i=0;i while(k {u=E[j].u;v=E[j].v;m1=locateMG(G,u);m2=locateMG(G,v); sn1=vset[m1];sn2=vset[m2]; if(sn1! =sn2){printf("边(%c,%c)权为: %d\n",u,v,E[j].w);k++; for(i=0;i 3、迪杰斯特拉算法的伪代码及流程图 voidShortestPath_DIJ(MGraphG,charv) {intM[50][50]; intv0=locateMG(G,v); for(inti=0;i for(intj=0;j M[i][j]=G.arcs[i][j].adj;} for(inti=0;i for(intj=0;j if(M[i][j]==0){ G.arcs[i][j].adj=999;} else{ M[i][j]=G.arcs[i][j].adj}} intdist[20]; charpath[20]; ints[20]; intmindis,i,j,u,n=G.vexnum; for(i=0;i { dist[i]=G.arcs[i][j].adj; s[i]=0; if(G.arcs[v0][i].adj<999) path[i]=G.vexs[v0]; else path[i]=-1; } s[v0]=1;path[v0]='a'; for(i=0;i {mindis=999; u=-1; for(j=0;j if(s[j]==0&&dist[j] {u=j; mindis=dist[j]; } s[u]=1; for(j=0;j if(s[j]==0) if(G.arcs[u][j].adj<999&&dist[u]+G.arcs[u][j].adj {dist[j]=dist[u]+G.arcs[u][j].adj; path[j]=G.vexs[u]; } }DisPath(G,dist,path,s,n,v);} 4、拓扑排序的伪代码及流程图 voidTopologicalSort(ALGraphG){ SqStackS; ArcNode*p; intindegree[G.vexnum]; chartuopoxulie[G.vexnum]; inti,k,count; FindInDegree(G,indegree); InitStack(S); for(i=1;i<=G.vexnum;++i) if(! indegree[i])Push(S,i); count=0; while(! StackEmpty(S)){ Pop(S,i); tuopoxulie[count++]=G.vertices[i].data; for(p=G.vertices[i].firstarc;p;p=p->nextarc){ k=p->adjvex; if(! (--indegree[k]))Push(S,k); } } printf("\n"); if(count>0){ printf("你所给的有向图的拓扑序列为: \n("); for(i=1;i printf("%c,",G.vertices[i].data); printf("%c)\n",G.vertices[count].data); if(count printf(",但该有向图中存在回路! \n"); } else printf("你所给的有向图不存在拓扑序列\n"); } 3、调试设计 3.1、遇到的问题 1、不晓得怎么去从文件里面读中文。 2、在迪杰斯特拉算法还不是很了解其逻辑思路。 3.2、算法的时空分析 T(n)=O(n2) 3.3、改进设想 在进入某个功能模块时,或者某个功能的某个步骤时,可以允许出现输入错误,因此,要实现进入某个步骤时实现撤销操作….. 3.4、经验体会 虽说此次是任选题,实质上是必选题,此次的题目比较难。 我前面的一位同学的题目是我7大小题中的一个小题。 表示鸭梨很大。 由于第一次接触到C语言的操作文件,在探索过程中有点枯燥繁琐。 弄好了文件,接下来的就更难了。 什么普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、拓扑排序。 不是数据结构书就可以搞定的。 这些算法需要的辅助很多。 因此要狠清楚的了解她们的逻辑关系。 不过,虽然有点难。 但在编程上有了很大的飞跃 4、测试结果 4.1输出有向图邻接矩阵信息 4.2输出有向图邻接表信息 4.3输出普里姆算法的结果 4.4输出克鲁斯卡尔算法的结果 4.6输出拓扑排序算法的结果 5、参考文献 1、数据结构(C语言版)——严蔚敏、吴伟民 2、C程序设计(第三版)——谭浩强
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言 课程设计 任务书 完整 版图 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)