数据结构旅游区导航图课程设计文档格式.docx
《数据结构旅游区导航图课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构旅游区导航图课程设计文档格式.docx(48页珍藏版)》请在冰豆网上搜索。

完成的工作:
首先是用邻接矩阵的存储形式建立无向带权图,然后将邻接矩阵转换为邻接链表,最后用狄克斯特拉函数求出后面的三道有关最短路径的小题,设计主函数。
2所采用的数据结构
邻接矩阵的数据结构,包括(弧/边的结构定义、图的结构定义)
邻接链表的数据结构,包括(弧/边的结点定义、邻接表头结点定义、图的结构定义)
数据结构的定义
//邻接矩阵结构体
typedefstruct
{charvex1,vex2;
/*弧或边所依附的两个顶点*/
intArcVal;
/*弧或边的权值*/
}ArcType;
/*弧或边的结构定义*/
typedefstruct
{
intvexnum,arcnum;
/*图的当前顶点数和弧数*/
charvexs[MAXVEX];
/*顶点向量*/
intadj[MAXVEX][MAXVEX];
}MGraph;
/*图的结构定义*/
//邻接链表结构体
typedefstructANode//弧的结点结构类型
{intadjvex;
//该弧的终点位置
intinfo;
//该弧的相关信息,这里用于存放权值
structANode*nextarc;
//指向下一条弧的指针
}ArcNode;
typedefstructVnode//邻接表头结点的类型
{
chardata;
//顶点信息
ArcNode*firstarc;
//指向第一条弧
}VNode;
VNodeAdjList[MAXVEX];
intvexnum,arcnum;
//图中顶点数n和边数e
}ALGraph;
//图的邻接表类型
3所设计的函数
对于每个主要函数必须给出所采用的算法思想和程序框图;
邻接矩阵和邻接链表初始化函数
MGraph*Init_MGraph()
/*图的初始化*/
MGraph*G;
G=(MGraph*)malloc(sizeof(MGraph));
G->
vexnum=0;
arcnum=0;
/*初始化顶点数、边数*/
return(G);
}
ALGraph*Init_ALGraph()
ALGraph*G;
G=(ALGraph*)malloc(sizeof(ALGraph));
arcnum=0;
/*初始化顶点数*/
图中顶点定位的函数,判断顶点是否重复输入了
intLocateVex(MGraph*G,charvp)
/*图中顶点的定位,若图中有顶点vp,返回其在顶点数组的下标值*/
intk;
for(k=0;
k<
=G->
vexnum;
k++)
if(G->
vexs[k]==vp)return(k);
return(-1);
/*图中无此顶点*/
N
NY
Y
往图中增加顶点的函数
voidAddVertex(MGraph*G,charvp)
/*往图的顶点数组中增加顶点*/
intk,j;
if(G->
vexnum>
=MAXVEX)
printf("
图中顶点数已达到最多!
\n"
);
else
{
if(LocateVex(G,vp)==-1)
{
k=G->
vexnum;
vexs[G->
vexnum++]=vp;
for(j=0;
j<
G->
j++)
{
G->
adj[j][k]=INFINITY;
adj[k][j]=INFINITY;
/*是带权的有向图或无向图*/
}
}
}
N
Y
NY
往图的邻接矩阵中添加边(弧)
voidAddArc(MGraph*G,ArcType*arc)
/*往图的邻接矩阵中添加边(弧)*/
intk=0,j=0;
k=LocateVex(G,arc->
vex1);
j=LocateVex(G,arc->
vex2);
if(k==-1||j==-1)
边或弧的顶点不存在,错误!
);
else
{
G->
arcnum++;
adj[k][j]=arc->
ArcVal;
adj[j][k]=arc->
/*是无向图或带权的无向图,需对称赋值*/
输出图的顶点矩阵和邻接矩阵
voidoutput_graphic(MGraph*G)
/*输出图的顶点矩阵和邻接矩阵*/
printf("
图的顶点如下:
for(k=0;
%4c"
G->
vexs[k]);
\n\n"
图的邻接矩阵如下:
for(j=0;
if(G->
adj[k][j]==INFINITY)
%4s"
"
**"
else
%4d"
adj[k][j]);
}
YN
以邻接矩阵作为图的存储结构建立图
MGraph*create_graph()
/*以邻接矩阵作为图的存储结构建立图*/
charinchar[100],enchar[100],fvex,lvex;
intcount=0;
intweight;
MGraph*G;
ArcType*arc;
首先进行图的初始化!
!
G=(MGraph*)malloc(sizeof(MGraph));
G=Init_MGraph();
arc=(ArcType*)malloc(sizeof(ArcType));
printf("
\n请以(顶点,顶点,权值)的形式输入图的边(或弧),第一个顶点是?
表示结束:
while
(1)
scanf("
%s"
inchar);
fvex=inchar[0];
/*输入第一个顶点,?
结束*/
if(fvex=='
?
'
)break;
else
AddVertex(G,fvex);
enchar);
lvex=enchar[0];
AddVertex(G,lvex);
%d"
&
weight);
/*输入第二个顶点和权值*/
arc->
vex1=fvex;
arc->
vex2=lvex;
ArcVal=weight;
AddArc(G,arc);
\n请继续输入下一条边(或弧)!
return(G);
将邻接矩阵g转换成邻接表G
ALGraph*MGraphToALGraph(MGraph*g,ALGraph*G)
{
inti,j,n=g->
//n为顶点数
ArcNode*p;
G=(ALGraph*)malloc(sizeof(ALGraph));
arcnum=g->
arcnum;
vexnum=g->
for(i=0;
i<
i++)
AdjList[i].firstarc=NULL;
for(i=0;
n;
i++)//检查邻接矩阵中每个元素
for(j=n-1;
j>
=0;
j--)
if(g->
adj[i][j]!
=INFINITY)//邻接矩阵的当前元素不为
p=(ArcNode*)malloc(sizeof(ArcNode));
//创建一个结点*p
AdjList[j].data=g->
vexs[j];
p->
adjvex=g->
info=g->
adj[i][j];
nextarc=G->
AdjList[i].firstarc;
//将*p链到链表后
AdjList[i].firstarc=p;
returnG;
邻接链表的输出
voidoutput_graphic_c(MGraph*g,ALGraph*G)
inti;
g->
%c"
AdjList[i].data);
p=G->
while(p!
=NULL)
->
"
(%c,%d)"
p->
adjvex,p->
info);
p=p->
nextarc;
相邻景点查询并输出
voidoutput_Find_ALGraph(ALGraph*G)
{/*相邻景点查询并输出*/
intj;
请输入你要查询的景点(下标值):
scanf("
j);
AdjList[j].f