图的课程设计 1.docx
《图的课程设计 1.docx》由会员分享,可在线阅读,更多相关《图的课程设计 1.docx(13页珍藏版)》请在冰豆网上搜索。
图的课程设计1
目录
1设计题目1
1.1任务1
1.2输入1
1.3输出1
2.概要设计2
2.1数据需求分析2
2.2功能需求分析2
2.3数据结构设计2
2.3.1ADT描述2
2.3.2数据存储3
3.详细设计4
3.1模块设计4
3.1.1模块中函数功能说明4
3.1.2函数实现6
4.调试分析11
4.1主要算法的复杂度分析11
4.2集成测试11
4.3存在的问题及改进设想12
5.设计总结14
参考文献15
1.设计题目:
图的建立与输出
1.1任务
建立图的存储结构图,的类型可以是有向图、无向图、有向网、无向网,可以任选种类型。
1.2输入
输入图的顶点和边的信息,并存储到相应存储结构中。
1.3输出
而后输出图的邻接矩阵。
2.概要设计
2.1数据需求分析
建立图的存储结构,图的类型是有向图无向图,能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。
2.2功能需求分析
输入需要建立的图的边,顶点,权值的信息,源程序采用数组存储图的基本信息,通过输入数据,建立好图,然后通过写好的算法,输出与该图相对应的图的邻接矩阵。
2.3数据结构设计
1.建立存储图的基本信息的数组
2.输入图的基本信息
3.按照写好的算法行进
4.输出邻接矩阵
2.3.1ADT描述
ADTGraph{
数据对象V:
v是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={v,w|v,w∈V且P(v,w),表示从v到w的弧,
谓词P(v,w)定义了弧的意义或信息}
基本操作P:
creagraph(int*n);
操作结果:
按定义创建图G。
dispgraph(adjmaxadj,intn);
操作结果:
定义无向图邻接矩阵。
dis(adjmaxadj,intn);
操作结果:
定义有向图邻接矩阵。
}ADTGraph
2.3.2数据存储
采用了数组的存储方式,属于数组存储结构。
以下是用于存储结构:
structcertex
{
intnum;
VertexTypedata;
};
Typedefstructgraph
{
structvertexvex[MAXVEX];
intedges[MAXVEX][MAXVEX];
};
3.详细设计
3.1模块设计
3.1.1模块中函数功能说明
三个主功能模块如下:
1.创建图
adjmaxcreagraph(int*n)
{
inti,j,k,w,e;
charb,t;
adjmaxadj;
printf("顶点数(n),边数(e):
");
scanf("%d,%d",n,&e);
for(i=1;i<=*n;i++)
{
getchar();
printf("\t第%d个顶点的信息:
",i);
scanf("%c",&adj.vexs[i].data);
adj.vexs[i].num=i;
}
for(i=1;i<=*n;i++)
for(j=1;j<=*n;j++)
adj.edges[i][j]=0;
for(k=1;k<=e;k++)
{
getchar();
printf("第%d条边->",k);
printf("起点:
");
b=getche();
i=1;
while(i<=*n&&adj.vexs[i].data!
=b)i++;
if(i>*n)
{
printf("输入的起点不存在!
\n");exit(0);
}
printf("终点:
");
t=getche();
j=1;
while(j<=*n&&adj.vexs[j].data!
=t)j++;
if(j>*n)
{
printf("输入的终点不存在!
\n");exit
(1);
}
printf("权值:
");
scanf("%d",&w);
adj.edges[i][j]=w;
}
return(adj);
}
2.无向图邻接矩阵
voiddispgraph(adjmaxadj,intn)
{
inti,j;
printf("\n显示无向图邻接矩阵表示的图:
\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(adj.edges[i][j]!
=0)
{
adj.edges[i][j]=1;
adj.edges[j][i]=1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d",adj.edges[i][j]);
printf("\n");
}
}
3.有向图邻接矩阵
voiddis(adjmaxadj,intn)
{
inti,j;
printf("\n显示有向图邻接矩阵表示的图:
\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(adj.edges[i][j]!
=0)
adj.edges[i][j]=1;
printf("%d",adj.edges[i][j]);
}
printf("\n");
}
}
3.1.2函数实现
(1)函数算法描述
1.建立存储图的基本信息的数组
2.输入图的基本信息
3.按照写好的算法行进
4.输出邻接矩阵
(2)源程序如下:
#include"stdio.h"
#include"stdlib.h"
#defineMAXVEX100
#include"string.h"
#include"math.h"
#include"conio.h"
typedefcharVertexType;
structvertex
{
intnum;
VertexTypedata;
};
typedefstructgraph
{
structvertexvexs[MAXVEX];
intedges[MAXVEX][MAXVEX];
}adjmax;
adjmaxcreagraph(int*n)//创建图
{
inti,j,k,w,e;
charb,t;
adjmaxadj;
printf("顶点数(n),边数(e):
");
scanf("%d,%d",n,&e);
for(i=1;i<=*n;i++)
{
getchar();
printf("\t第%d个顶点的信息:
",i);
scanf("%c",&adj.vexs[i].data);
adj.vexs[i].num=i;
}
for(i=1;i<=*n;i++)
for(j=1;j<=*n;j++)
adj.edges[i][j]=0;
for(k=1;k<=e;k++)
{
getchar();
printf("第%d条边->",k);
printf("起点:
");
b=getche();
i=1;
while(i<=*n&&adj.vexs[i].data!
=b)i++;
if(i>*n)
{
printf("输入的起点不存在!
\n");exit(0);
}
printf("终点:
");
t=getche();
j=1;
while(j<=*n&&adj.vexs[j].data!
=t)j++;
if(j>*n)
{
printf("输入的终点不存在!
\n");exit
(1);
}
printf("权值:
");
scanf("%d",&w);
adj.edges[i][j]=w;
}
return(adj);
}
voiddispgraph(adjmaxadj,intn)//无向图邻接矩阵
{
inti,j;
printf("\n显示无向图邻接矩阵表示的图:
\n");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(adj.edges[i][j]!
=0)
{
adj.edges[i][j]=1;
adj.edges[j][i]=1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d",adj.edges[i][j]);
printf("\n");
}
}
voiddis(adjmaxadj,intn)//有向图邻接矩阵
{
inti,j;
printf("\n显示有向图邻接矩阵表示的图:
\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(adj.edges[i][j]!
=0)
adj.edges[i][j]=1;
printf("%d",adj.edges[i][j]);
}
printf("\n");
}
}
main()
{
intchoice;
printf("**************请选择*************\n");
printf("1:
有向图\n");
printf("2:
无向图\n");
printf("0:
退出\n");
printf("*********************************\n");
scanf("%d",&choice);
for(;;)
{
if(choice==1)
{
adjmaxadj;
intn;
adj=creagraph(&n);
dis(adj,n);
printf("**************请继续选择*************\n");
printf("1:
有向图\n");
printf("2:
无向图\n");
printf("0:
退出\n");
printf("*************************************\n");
scanf("%d",&choice);
}
elseif(choice==2)
{
adjmaxadj;
intn;
adj=creagraph(&n);
dispgraph(adj,n);
printf("**************请继续选择*************\n");
printf("1:
有向图\n");
printf("2:
无向图\n");
printf("0:
退出\n");
printf("*************************************\n");
scanf("%d",&chioce);
}
else
{
exit(0);
}
}
return0;
}
4.调试分析
4.1主要算法的复杂度分析
复杂度为:
O(n4)
4.2集成测试
调试代码得到设计结果如下:
1.选择界面:
2.有向图的输入与输出:
3.无向图的输出与输入:
4.退出程序:
4.3存在的问题及改进设想
这个程序主要是运用定义创建出图,然后对有向图和无向图进行定义,该程序还可以改进成为带有有向网和无向网功能的程序。
5.设计总结
总的来说,在整个设计的过程中,对图的知识有了相当程度的了解掌握,基本上学会了对图的创建和对图的基本操作等。
在对图的自学过程中也认识,在学习的过程中要灵活的把所学的知识运用到实践当中,并且还要巩固练习和运用,这样才可以牢牢的记住。
试验也对数据结构的知识进行了复习,尤其是结构体的定义、地址与引用的合理使用以及数组的使用也认识到数据结构在实践运用中的重要性,在对程序不断的修改和逐步改进提升的过程中,积累了不少经验,为在以后的学习和实践应用奠定了一定的基础。
这次课程设计受益非浅,学到了不少知识,同时也认识到自身的不足,需要加强自身训练,学以致用,学会自我总结,吸取教训,积累经验,在学习和实践中来不断的提升自己。
参考文献
[1]严蔚敏《数据结构(C语言版)》北京清华大学出版社2009.156-170
[2]谭浩强《C程序设计》(第三版)北京清华大学出版社2009.155-202