数据结构旅游区导航图课程设计文档格式.docx

上传人:b****4 文档编号:15868873 上传时间:2022-11-16 格式:DOCX 页数:48 大小:694.92KB
下载 相关 举报
数据结构旅游区导航图课程设计文档格式.docx_第1页
第1页 / 共48页
数据结构旅游区导航图课程设计文档格式.docx_第2页
第2页 / 共48页
数据结构旅游区导航图课程设计文档格式.docx_第3页
第3页 / 共48页
数据结构旅游区导航图课程设计文档格式.docx_第4页
第4页 / 共48页
数据结构旅游区导航图课程设计文档格式.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

数据结构旅游区导航图课程设计文档格式.docx

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

数据结构旅游区导航图课程设计文档格式.docx

完成的工作:

首先是用邻接矩阵的存储形式建立无向带权图,然后将邻接矩阵转换为邻接链表,最后用狄克斯特拉函数求出后面的三道有关最短路径的小题,设计主函数。

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

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

当前位置:首页 > 高等教育 > 经济学

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

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