数据结构C语言课程设计任务书完整版图的算法.docx

上传人:b****6 文档编号:5900079 上传时间:2023-01-02 格式:DOCX 页数:14 大小:362.94KB
下载 相关 举报
数据结构C语言课程设计任务书完整版图的算法.docx_第1页
第1页 / 共14页
数据结构C语言课程设计任务书完整版图的算法.docx_第2页
第2页 / 共14页
数据结构C语言课程设计任务书完整版图的算法.docx_第3页
第3页 / 共14页
数据结构C语言课程设计任务书完整版图的算法.docx_第4页
第4页 / 共14页
数据结构C语言课程设计任务书完整版图的算法.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构C语言课程设计任务书完整版图的算法.docx

《数据结构C语言课程设计任务书完整版图的算法.docx》由会员分享,可在线阅读,更多相关《数据结构C语言课程设计任务书完整版图的算法.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构C语言课程设计任务书完整版图的算法.docx

数据结构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),表示从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={|ai-1,ai∈D,i=2,…n}

约定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程序设计(第三版)——谭浩强

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

当前位置:首页 > 农林牧渔 > 水产渔业

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

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