数据结构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),表示从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;ifor(j=0;jM[i][j]=G.arcs[i][j].adj;
for(i=0;ifor(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;jif(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;jif(G.arcs[k][j].adj!
=0&&G.arcs[k][j].adjlowcost[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;iwhile(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;i3、迪杰斯特拉算法的伪代码及流程图
voidShortestPath_DIJ(MGraphG,charv)
{intM[50][50];
intv0=locateMG(G,v);
for(inti=0;ifor(intj=0;jM[i][j]=G.arcs[i][j].adj;}
for(inti=0;ifor(intj=0;jif(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;jif(s[j]==0&&dist[j]{u=j;
mindis=dist[j];
}
s[u]=1;
for(j=0;jif(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;iprintf("%c,",G.vertices[i].data);
printf("%c)\n",G.vertices[count].data);
if(countprintf(",但该有向图中存在回路!
\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程序设计(第三版)——谭浩强