图的深度广度遍历算法与数据结构课程设计.docx
《图的深度广度遍历算法与数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《图的深度广度遍历算法与数据结构课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
![图的深度广度遍历算法与数据结构课程设计.docx](https://file1.bdocx.com/fileroot1/2022-10/24/3dd6b31e-7671-4144-b7e8-a0ae900ff68b/3dd6b31e-7671-4144-b7e8-a0ae900ff68b1.gif)
图的深度广度遍历算法与数据结构课程设计
图的操作
一、问题描述
图是一种较线性表和树更为复杂的数据结构。
在图形结构中,节点间的关系可以是任意的,图中任意两个数据元素之间都可以相关。
由此,图的应用极为广泛。
现在邻接矩阵和邻接表的存储结构下,完成图的深度、广度遍历。
二、基本要求
1、选择合适的存储结构完成图的建立;
2、建立图的邻接矩阵,能按矩阵方式输出图,并在此基础上,完成图的深度和广度遍历,输出遍历序列;
3、建立图的邻接表,并在此基础上,完成图的深度和广度遍历,输出遍历序列;
三、测试数据
四、算法思想
1、邻接矩阵
顶点向量的存储。
用两个数组分别存储数据(定点)的信息和数据元素之间的关系(边或弧)的信息。
2、邻接表
邻接表是图的一种链式存储结构。
在邻接表中,对图中每个定点建立一个单链表,第i个单链表中的节点表示依附于定点vi的边。
每个节点由3个域组成,其中邻接点域(adjvex)指示与定点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的节点;数据域(info)存储和边或弧相关的信息,如权值等。
每个链表上附设一个头节点。
在表头节点中,除了设有链域(firstarc)指向链表中第一个节点之外,还设有存储定点vi的名或其他有关信息的数据域(data)。
3、图的深度遍历
深度优先搜索遍历类似于树的先根遍历,是树的先跟遍历的推广。
假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,甚至图中所有和v相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
4、图的广度遍历
广度优先遍历类似于树的按层次遍历过程。
假设从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先与“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。
若此时图中尚有顶点未被访问,则另选图中一个曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
五、模块划分
一、基于邻接矩阵的深广度遍历
1.StatusInitQueue(LinkQueue*Q)
根据已知Q初始化队列
2.StatusQueueEmpty(LinkQueueQ)
判断队列是否为空
3.StatusEnQueue(LinkQueue*Q,QElemTypee)
将e压入队尾
4.StatusDeQueue(LinkQueue*Q,QElemType*e)
取队头元素e
5.intLocateVex(MGraphG,VertexTypev)
定位定点v
6.voidCreateGraph(MGraph*G)
建立无向图的邻接矩阵
7.voidPrintGraph(MGraphG)
输出邻接矩阵的无向图
8.intFirstAdjVex(MGraphG,intv)
第一个邻接点的定位
9.intNextAdjVex(MGraphG,intv,intw)
查找下一个邻接点
10.voidDfs(MGraphG,intv)
实现图的一次遍历
11.voidDfsTraverse(MGraphG)
实现图的深度遍历
12.voidBfsTraverse(MGraphG)
实现图的广度遍历
13.Main
主函数
二、基于邻接表实现图的深广度遍历
1.StatusInitQueue(LinkQueue*Q)
根据已知Q初始化队列
2.StatusQueueEmpty(LinkQueueQ)
判断队列是否为空
3.StatusEnQueue(LinkQueue*Q,QElemTypee)
将e压入队尾
4.StatusDeQueue(LinkQueue*Q,QElemType*e)
取队头元素e
5.voidcreateALGraph(ALGraph*G)
建立无向图的邻接矩阵
6.voidPrintGraph(MGraphG)
输出邻接矩阵的无向图
7.intFirstAdjVex(MGraphG,intv)
第一个邻接点的定位
8.intNextAdjVex(MGraphG,intv,intw)
查找下一个邻接点
9.voidDfs(MGraphG,intv)
实现图的一次深度遍历
10.voidDfsTraverse(MGraphG)
实现图的深度遍历
11.voidBFS(ALGraphG,intv)
实现图的一次广度遍历
12.voidBfsTraverse(MGraphG)
实现图的广度遍历
13.Void…………………………………Main
主函数
六、数据结构//(ADT)
1、基于邻接矩阵的图的类型定义
typedefstructArcCell
{VRTypeadj;/*图中有1/0表示是否有边,网中表示边上的权值*/
/*InfoType*info;与边相关的信息*/
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
{VertexTypevexs[MAX_VERTEX_NUM];/*顶点向量*/
AdjMatrixarcs;/*邻接矩阵*/
intvexnum,arcnum;/*图中当前顶点数和边数*/
}MGraph;
2、基于邻接表的图的类型定义
typedefstructArcNode
{
intadjvex;
structArcNode*nextarc;
}ArcNode;/*表节点*/
typedefstruct
{
TElemTypedata;
ArcNode*firstarc;
}VNode,AdjList[MAXVER];/*表节点*/
typedefstruct
{
AdjListvertices;
intvexnum,arcnum;/*图中当前顶点数和边数*/
}ALGraph;
七、源程序
一、基于邻接矩阵的图的深度、广度遍历
#include"stdlib.h"
#include"stdio.h"
#include"string.h"
#defineTRUE1
#defineFALSE0
#defineOVERFLOW-2
#defineOK1
#defineERROR0
typedefintStatus;
#defineINFINITYINT_MAX/*最大值“无穷”*/
#defineMAX_VERTEX_NUM20/*最大顶点个数*/
typedefintBoolean;
typedefcharVertexType[20];
typedefintVRType;
/**************以下为队列的操作************/
/****队列的类型定义****/
typedefintQElemType;
typedefstructQNode
{QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
/****初始化队列****/
StatusInitQueue(LinkQueue*Q)
{(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
if(!
(*Q).front)exit(OVERFLOW);
(*Q).front->next=NULL;
returnOK;}
/****判断队列是否为空****/
StatusQueueEmpty(LinkQueueQ)
{if(Q.front==Q.rear)
returnTRUE;
else
returnFALSE;}
/****入队列****/
StatusEnQueue(LinkQueue*Q,QElemTypee)
{QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)exit(OVERFLOW);
p->data=e;p->next=NULL;
(*Q).rear->next=p;
(*Q).rear=p;
returnOK;}
/****出队列****/
StatusDeQueue(LinkQueue*Q,QElemType*e)
{QueuePtrp;
if((*Q).front==(*Q).rear)returnERROR;
p=(*Q).front->next;
*e=p->data;
(*Q).front->next=p->next;
if((*Q).rear==p)(*Q).rear=(*Q).front;
free(p);
returnOK;}
/**************以下为图的操作************/
/*图的类型定义*/
typedefstructArcCell
{VRTypeadj;/*图中有1/0表示是否有边,网中表示边上的权值*/
/*InfoType*info;与边相关的信息*/
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
{VertexTypevexs[MAX_VERTEX_NUM];/*顶点向量*/
AdjMatrixarcs;/*邻接矩阵*/
intvexnum,arcnum;/*图中当前顶点数和边数*/
}MGraph;
/*顶点在顶点向量中的定位*/
intLocateVex(MGraphG,VertexTypev)
{inti;
for(i=0;iif(strcmp(v,G.vexs[i])==0)break;
returni;
}
/*建立无向图的邻接矩阵*/
voidCreateGraph(MGraph*G)
{inti,j,k;VertexTypev1,v2;
printf("\nInputMGvexnum,arcnum:
");
scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);
printf("Input%dvexs:
",(*G).vexnum);
for(i=0;i<(*G).vexnum;i++)/*输入顶点向量*/
{scanf("%s",(*G).vexs[i]);}
printf("vexslist\n");
for(i=0;ivexnum;i++)/*输出顶点向量*/
puts(G->vexs[i]);
for(i=0;i<(*G).vexnum;i++)/*邻接矩阵初始化*/
for(j=0;j<(*G).vexn