数据结构实验6图的存储和遍历.docx

上传人:b****4 文档编号:24405400 上传时间:2023-05-27 格式:DOCX 页数:9 大小:16.48KB
下载 相关 举报
数据结构实验6图的存储和遍历.docx_第1页
第1页 / 共9页
数据结构实验6图的存储和遍历.docx_第2页
第2页 / 共9页
数据结构实验6图的存储和遍历.docx_第3页
第3页 / 共9页
数据结构实验6图的存储和遍历.docx_第4页
第4页 / 共9页
数据结构实验6图的存储和遍历.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

数据结构实验6图的存储和遍历.docx

《数据结构实验6图的存储和遍历.docx》由会员分享,可在线阅读,更多相关《数据结构实验6图的存储和遍历.docx(9页珍藏版)》请在冰豆网上搜索。

数据结构实验6图的存储和遍历.docx

数据结构实验6图的存储和遍历

实验6.1实现图的存储和遍历

一,实验目的

掌握图的邻接矩阵和邻接表存储以及图的邻接矩阵存储的递归遍历。

二,实验内容

6.1实现图的邻接矩阵和邻接表存储

编写一个程序,实现图的相关运算,并在此基础上设计一个主程序,完成如下功能:

(1)建立如教材图7.9所示的有向图G的邻接矩阵,并输出。

(2)由有向图G的邻接矩阵产生邻接表,并输出。

(3)再由

(2)的邻接表产生对应的邻接矩阵,并输出。

6.2实现图的遍历算法

(4)在图G的邻接矩阵存储表示基础上,输出从顶点V1开始的深度优先遍历序列(递归算法)。

(5)利用非递归算法重解任务(4)。

(6)在图G的邻接表存储表示基础上,输出从顶点V1开始的广度优先遍历序列。

三,源代码及结果截图

#include

#include

#include

#include

#include

#defineMAX_VERTEX_NUM20

typedefcharVRType;

typedefintInfoType;   //存放网的权值      

typedefcharVertexType;  //字符串类型

typedefenum{DG,DN,AG,AN}GraphKind;//{有向图,有向网,无向图,无向网}

/*建立有向图的邻接矩阵*/

typedefstructArcCell

{

VRTypeadj;//VRType是顶点关系类型,对无权图用1或0表示是否相邻;对带权图则为权值类型

InfoType*info; //该弧相关信息的指针(可无)

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedefstruct

{

VertexTypevexs[MAX_VERTEX_NUM];//顶点向量

AdjMatrixarcs;//邻接矩阵

intvexnum,arcnum;;//图的当前顶点数和弧数

GraphKindkind;//图的种类标志

}MGraph;

/*顶点在顶点向量中的定位*/

intLocateVex(MGraph&M,VRTypev1){

inti;

for(i=0;i

if(v1==M.vexs[i])returni;

return-1;

}

 

voidCreateGraph(MGraph&M)//建立有向图的邻接矩阵

{

inti,j,k,w;

VRTypev1,v2;

M.kind=DN;printf("构造有向网:

\n");

printf("\n输入图的顶点数和边数(以空格作为间隔):

");

scanf("%d%d",&M.vexnum,&M.arcnum);

printf("输入%d个顶点的值(字符):

",M.vexnum);

getchar();

for(i=0;i

{

scanf("%c",&M.vexs[i]);

}

printf("建立邻接矩阵:

\n");

for(i=0;i

for(j=0;j

{

M.arcs[i][j].adj=0;

M.arcs[i][j].info=NULL;

}

printf("请顺序输入每条弧(边)的权值、弧尾和弧头(以空格作为间隔):

\n");

for(k=0;k

{

cin>>w>>v1>>v2;   

i=LocateVex(M,v1);

j=LocateVex(M,v2);

M.arcs[i][j].adj=w;

}

}

//按邻接矩阵方式输出有向图

voidPrintGraph(MGraphM)

{

inti,j;

printf("\n输出邻接矩阵:

\n");

for(i=0;i

{

printf("%10c",M.vexs[i]);

for(j=0;j

printf("%2d",M.arcs[i][j].adj);

printf("\n");

}

}

//图的邻接表存储表示

typedefstructArcNode

{

intadjvex;          //该弧所指向的顶点的位置

structArcNode*nextarc;  //指向下一条弧的指针

InfoType*info;        //网的权值指针)

}ArcNode;  //表结点

typedefstructVNode

{

VertexTypedata;      //顶点信息

ArcNode*firstarc;      //第一个表结点的地址,指向第一条依附该顶点的弧的指针

}VNode,AdjList[MAX_VERTEX_NUM];//头结点

typedefstruct

{

AdjListvertices;

intvexnum,arcnum;  //图的当前顶点数和弧数

intkind;      //图的种类标志

}ALGraph;

voidCreateMGtoDN(ALGraph&G,MGraph&M){

//由有向图M的邻接矩阵产生邻接表

inti,j;

ArcNode*p;

G.kind=M.kind;

G.vexnum=M.vexnum;

G.arcnum=M.arcnum;

for(i=0;i

G.vertices[i].data=M.vexs[i];

G.vertices[i].firstarc=NULL;//初始化指针

}

for(i=0;i

for(j=0;j

if(M.arcs[i][j].adj){

p=(ArcNode*)malloc(sizeof(ArcNode));

p->adjvex=j;

p->nextarc=G.vertices[i].firstarc;

p->info=M.arcs[i][j].info;

G.vertices[i].firstarc=p;

}

}

voidCreateDNtoMG(MGraph&M,ALGraph&G){

//由邻接表产生对应的邻接矩阵

inti,j;

ArcNode*p;

M.kind=GraphKind(G.kind);

M.vexnum=G.vexnum;

M.arcnum=G.arcnum;

for(i=0;i

M.vexs[i]=G.vertices[i].data;

for(i=0;i

p=G.vertices[i].firstarc;

while(p){

M.arcs[i][p->adjvex].adj=1;

p=p->nextarc;

}//while

for(j=0;j

if(M.arcs[i][j].adj!

=1)

M.arcs[i][j].adj=0;

}//for

}

//输出邻接表

voidPrintDN(ALGraphG){

inti;

ArcNode*p;

printf("\n输出邻接表:

\n");

printf("顶点:

\n");

for(i=0;i

printf("%2c",G.vertices[i].data);

printf("\n弧:

\n");

for(i=0;i

p=G.vertices[i].firstarc;

while(p){

printf("%c→%c(%d)\t",G.vertices[i].data,G.vertices[p->adjvex].data,p->info);

p=p->nextarc;

}

printf("\n");

}//for

}

intvisited[MAX_VERTEX_NUM];  //访问标志数组(全局量)

void(*VisitFunc)(char*v);    //函数变量(全局量)

//  从第v个顶点出发递归地深度优先遍历图G。

/*查找第1个邻接点*/

intFirstAdjVex(MGraph&M,intv)

{

intm;

for(m=0;m

if(M.arcs[v][m].adj)

returnm;

return-1;

}

/*查找下一个邻接点*/

intNextAdjVex(MGraph&M,intv,intw)

{

intj;

for(j=w+1;j

if(M.arcs[v][j].adj)

returnj;

return-1;

}        

voidDFS(MGraph&M,intv)

{

intw;

printf("%c",M.vexs[v]);

visited[v]=1;

for(w=FirstAdjVex(M,v);w>=0;w=NextAdjVex(M,v,w)) //访问第W个顶点

if(!

visited[w])//对v的尚未访问的邻接点w递归调用DFS

DFS(M,w);

}

voidvisits(MGraph&M,int&v)

{

v=-1;

for(inti=0;i

if(!

visited[i])

v=i;

}

voidDFSTraverse(MGraph&M,intv)

{//对图M作深度优先遍历。

inti;

for(i=0;i

visited[i]=0;//访问标志数组初始化

while(v>=0&&v

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

当前位置:首页 > 农林牧渔 > 林学

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

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