数据结构Word格式.docx
- 文档编号:18328454
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:29
- 大小:361.54KB
数据结构Word格式.docx
《数据结构Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构Word格式.docx(29页珍藏版)》请在冰豆网上搜索。
基本操作P:
path(MGraphg,inti,intj,intk)
initpath(MGraphg,inti,intj)
minpath(MGraphg,intpath1[],inti,intv0)
dispath(MGraphg,intdist[],intpath1[],ints[],intn,intv0,inti)
Dijkstra(MGraphg,intv0,intp)
SearchNum(MGraphg)
Searchpath1(MGraphg)
Searchpath2(MGraphg)
}ADTGraph
●系统中的子程序和功能说明:
1.path(MGraphg,inti,intj,intk):
确定路径上第k+1个顶点的序号,k初始值为0
2.initpath(MGraphg,inti,intj):
初始化访问标志与路径条数,并调用path()函数
3.minpath(MGraphg,intpath1[],inti,intv0):
输出最短路径
4.dispath(MGraphg,intdist[],intpath1[],ints[],intn,intv0,inti):
由path1计算从v0到i的最短路径
5.Dijkstra(MGraphg,intv0,intp):
采用迪杰斯特拉算法求从顶点v0到顶点p的最短路径
6.SearchNum(MGraphg):
按编号查询景点的信息
7.Searchpath1(MGraphg):
查询两个景点间的所有路径
8.Searchpath2(MGraphg):
查询两个景点间的最短路径
9.addpath(MGraphg):
添加景点
●功能实现过程
voidinitpath(MGraphg)//初始化访问标志与路径条数,并调用path()函数
{
intk;
p[0]=i;
for(k=0;
k<
景点数;
k++)
初始化各顶点的访问标志位
初始化路径的条数
调用path()函数
}
voidminpath(MGraphg)/*输出最短路径*/
k=path1[i];
if(找到最短路径)
return;
minpath(g,path1,k,v0);
依次输出路径中的景点名称;
voidSearchpath1(MGraphg)//查询两个景点间的所有路径
while
(1)
{
(输入起点与终点);
(在网中找到其编号与输入的出发景点的编号相同的顶点);
(在网中找到其编号与输入的目地景点的编号相同的顶点);
initpath(g,i,j);
/*调用initpath函数,用来输出两个景点间的所有路径*/
}
voidSearchpath2(MGraphg)//查询两个景点间的最短路径
Dijkstra(g,i,j);
voidaddpath(MGraphg)
依次输入新增景点的名称和简介信息
将景点数加1
结点数加1
路径增加以前的路径数
for(intj=0;
j<
g->
length-1;
j++)
输入该景点到每个景点的距离
voidpath(MGraphg)
ints;
if(找到一条路径)
*路径的条数值加1
printf("
第%d条:
"
a);
for(s=0;
s<
=k-1;
s++)/*输出一条路径*/
printf("
路径名称);
s=0;
while(s<
景点数)
if(找到的是简单路径){
if(当vk与vs之间有边存在且vs未被访问过)
{
置访问标志位为1
将顶点s加入到p数组中,在以s为起点找下一个顶点
path(g,i,j,k+1);
visited[s]=0;
/*重置访问标志位为0,即未访问的,以便该顶点能被重新使用*/
}
}
s++;
●系统程序功能流程图
三详细设计
(1)顶点、边和图的类型:
typedefstruct
intnum;
charname[MAXSIZE];
chardiscription[MAXLEN];
}VertexType;
/*顶点的结构定义*/
intedges[MAXV][MAXV];
intvexnum,arcnum;
VertexTypevexs[MAXV];
/*顶点向量*/
}MGraph;
/*网的结构定义*/
intvisited[MAXV];
/*全局数组,用来记录各顶点被访问的情况*/
intp[MAXV];
/*全局数组,用来存放路径上的各顶点*/
(2)创建无向网:
inti,j;
intb[6]={1,2,3,4,5,6};
/*整型数组,用来给每个顶点的编号进行赋值*/
char*c[6]={/*各个景点名称*/};
/*字符串指针数组,用来给每个顶点的名称进行赋值*/
char*d[6]={/*字符串指针数组,用来给每个顶点的简介信息进行赋值*/};
MGraphg;
/*定义一个MGraph类型的变量g,用来创建一个无向网*/
intA[6][6]={/*用INF表示对应顶点间没有直达的道路,用其它整型变量表示对应顶点间有直达的道路,且路径的长度就是该整型变量的值*/};
g.vexnum=顶点个数;
g.arcnum=顶点边数;
/*建立无向网的邻接矩阵*/
for(i=0;
i<
图的顶点个数;
i++)
/*给每个顶点一个编号*/
/*通过字符串复制函数给每个顶点一个名称*/
/*通过字符串复制函数给每个顶点加上信息,即作为景点的简介信息*/
(3)初始化访问标志与路径条数,并调用path()函数
voidinitpath(MGraphg)
记录顶点的访问情况;
a=0;
path();
(4)查询景点的信息:
inti;
chars;
while
(1)
/*可提供循环查询,当输入为'
N'
或'
n'
时,结束循环*/
\t\t\t请输入你要查询的景点:
);
scanf("
%d"
&
i);
for(intj=0;
j<
j++)
/*在网中找到其编号与输入的顶点编号相同的顶点*/
/*输出信息*/
}
继续查询?
(y或n):
scanf("
%s"
s);
if(s=='
||s=='
)
break;
(5)查询景点间的游览路径:
voidSearchpath1(MGraphg)
inti,j;
chars;
/*输入起点与终点*/;
/*在网中找到其编号与输入的出发景点的编号相同的顶点*/
/*在网中找到其编号与输入的目地景点的编号相同的顶点*/
break;
(6)查询两个景点间的最短路径:
voidminpath(MGraphg)
/*输入起点与终点*/
/*在网中找到其编号与输入的出发景点的编号相同的顶点*/
调用迪杰斯特拉算法,求图的最短路径
printf("
scanf("
if(s=='
break;
(7)添加景点
voidaddpath(MGraph*g)//添加景点
inti=顶点数;
(*g).vexs[i].num=i+1;
printf("
请输入景点名称:
\n"
景点名称);
简介:
景点简介);
(*g).vexnum=i+1;
矩阵的行列各加1,用来储存新景点到其他地点的权值
(*g).edges[i][i]=INF;
(*g).vexnum-1;
到%s的距离:
输入权值);
(*g).edges[i][j]=(*g).edges[j][i];
------------\n"
添加完毕!
!
(8)path函数
voidpath(MGraphg)/*确定路径上第k+1个顶点的序号,k初始值为0*/
if(p[k]==j)/*找到一条路径,初始p[0]=i*/
a++;
/*路径的条数值加1*/
%s->
g.vexs[p[s]].name);
%s\n"
g.vexnum)
if(s!
=i)/*保证找到的是简单路径,保证没有回路*/
{
if(g.edges[p[k]][s]!
=INF&
&
visited[s]==0)
/*当vk与vs之间有边存在且vs未被访问过*/
visited[s]=1;
/*置访问标志位为1,即已访问的*/
p[k+1]=s;
/*将顶点s加入到p数组中,在以s为起点找下一个顶点*/
path(g,i,j,k+1);
/*递归调用之*/
四设计与调试分析
1、这个程序设计中要注意定义两个结构体:
邻接矩阵结构体、景点存放信息结构体。
其中定义数组存放权值信息。
2、程序中运用到邻接矩阵的添加和处理,由于邻接矩阵便于运算,并且有着良好的存储空间,使得程序简便了许多。
但应前期需求分析的准备工作不充分,导致程序运行功能不全,在添加景点时,出现忘记添加指针和地址符,从而导致程序运行不正确,这些都是需要改进的。
3、在程序中的函数调用是个非常重要的部分,在编写程序过程中,多次用到递归函数的调用,函数间的调用是解决问题的关键,指针的运用加深了函数调用的难度,但功能的实现离不开指针。
4、在执行导游程序时,需要根据用户的临时输入求最短路径。
迪杰斯特拉算法的时间复杂度比弗洛伊德算法低,但在每求一条最短路径时都必须重新搜索一遍,在频繁查询时会导致查询效率降低,两种算法各有优缺点,由此可见,在选用算法时不能单纯的只考虑算法的渐近时间复杂度,有时还必须综合考虑各种因素。
五用户手册
【使用说明】
1.进入连云港景点查询系统主页面
2.首先进入“查询景点信息”的命令后,即提示输入景点序号,接受输入后即显示该景点信息;
3.进入“查询景点间的浏览路径”的命令后,即提示输入出发点与终点,在接受用户的输入之后会显示出从这起点到达终点的所有路径;
4.进入“查询景点间的最短浏览路径”的命令后,即提示输入出发点及终点,在接受用户的输入之后会显示出从起点到达终点的最短路径流程。
5.进入“添加景点”的命令后,首先输入景点的名称,按下回车后输入景点的简介。
接下来输入该景点到其他景点的距离(即权值)。
如果两个景点间无通路,则距离为无穷大(用32767来表示),全部输入后显示添加成功。
【程序中的头文件】
#include<
stdio.h>
string.h>
#include<
stdlib.h>
#defineMAXV8
#defineMAXSIZE20
#defineMAXLEN500
#defineINF32767
inta=0;
六测试成果
1.查询景点信息
2.查询景点间的浏览路径
3.查询景点间的最短浏览路径
4.添加景点
七附录(源程序清单)
/*用来记录各顶点被访问的情况*/
/*用来存放路径上的各顶点*/
voidpath(MGraphg,inti,intj,intk)/*确定路径上第k+1个顶点的序号,k初始值为0*/
if(p[k]==j)
s++)
=i)
visited[s]==0)
voidinitpath(MGraphg,inti,intj)//初始化访问标志与路径条数,并调用path()函数
g.vexnum;
visited[i]=0;
path(g,i,j,0);
voidminpath(MGraphg,intpath1[],inti,intv0)/*输出最短路径*/
if(k==v0)
g.vexs[k].name);
voiddispath(MGraphg,intdist[],intpath1[],ints[],intn,intv0,inti)/*由path1计算从v0到i的最短路径*/
if(s[i]==1&
i!
=v0)
从%s到%s的最短游览路径是:
g.vexs[v0].name,g.vexs[i].name);
g.vexs[v0].name);
minpath(g,path1,i,v0);
/*输出路径中的顶点*/
%s"
g.vexs[i].name);
路径长度:
%d公里\n"
dist[i]);
voidDijkstra(MGraphg,intv0,intp)
intdist[MAXV],path1[MAXV];
ints[MAXV];
/*已求出最短路径的终点集合*/
intmindis,i,j,u,n=g.vexnum;
for(i=0;
n;
dist[i]=g.edges[v0][i];
s[i]=0;
if(g.edges[v0][i]<
INF)
path1[i]=v0;
else
path1[i]=-1;
s[v0]=1;
path1[v0]=0;
mindis=INF;
u=-1;
for(j=0;
if(s[j]==0&
dist[j]<
mindis)
u=j;
mindis=dist[j];
s[u]=1;
if(s[j]==0)
if(g.edges[u][j]<
INF&
dist[u]+g.edges[u][j]<
dist[j])/*修正dist[i],path1[i]*/
{
dist[j]=dist[u]+g.edges[u][j];
path1[j]=u;
}
dispath(g,dist,path1,s,n,v0,p);
/*输出最短路径*/
voidmenu1(MGraphg)
景点:
--------------------------------------------------------------------------------\n"
for(intj=0;
%d:
(j+1),g.vexs[j].name);
voidSearchNum(MGraphg)/*查询景点的信息*/
menu1(g);
inti;
if(i==g.vexs[j].num)
printf("
%s简介:
g.vexs[j].name);
g.vexs[j].discription);
voidSearchpath1(MGraphg)/*查询两个景点间的所有路径*/
\t\t\t选择出发景点:
fflush(stdin);
\t\t\t选择目地景点:
j);
for(intk=0;
if(i==g.vexs[k].num)i=k;
for(intl=0;
l<
l++)
if(j==g.vexs[l].num)j=l;
从%s到%s的所有游览路径有:
g.vexs[i].name,g.vexs[j].name);
initpath(g,i,j);
scanf("
if(s=='
break;
voidSearchpath2(MGraphg)/*查询两个景点间的最短路径*/
whil
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构