图的深度广度遍历(算法与数据结构课程设计)

更新时间:2023-07-23 23:00:56 阅读: 评论:0

图的操作
一、问题描述
    图是一种较线性表和树更为复杂的数据结构。在图形结构中,节点间的关系可以是任意的,图中任意两个数据元素之间都可以相关。由此,图的应用极为广泛。现在邻接矩阵和邻接表的存储结构下,完成图的深度、广度遍历。
二、基本要求
    1、选择合适的存储结构完成图的建立;
    2、建立图的邻接矩阵,能按矩阵方式输出图,并在此基础上,完成图的深度和广度遍历,输出遍历序列;
    3、建立图的邻接表,并在此基础上,完成图的深度和广度遍历,输出遍历序列;
三、测试数据
四、算法思想
1、邻接矩阵
    顶点向量的存储。用两个数组分别存储数据(定点)的信息和数据元素之间的关系(边或弧)的信息。
2、邻接表
    邻接表是图的一种链式存储结构。在邻接表中,对图中每个定点建立一个单链表,第i个
单链表中的节点表示依附于定点vi的边。每个节点由3个域组成,其中邻接点域(adjvex)指示与定点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的节点;数据域(info)存储和边或弧相关的信息,如权值等。每个链表上附设一个头节点。在表头节点中,除了设有链域(firstarc)指向链表中第一个节点之外,还设有存储定点vi的名或其他有关信息的数据域(data)。
3、图的深度遍历
admittance    深度优先搜索遍历类似于树的先根遍历,是树的先跟遍历的推广。假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可从图中某个顶点v出发, 访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,甚至图中所有和v相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
4、图的广度遍历
    广度优先遍历类似于树的按层次遍历过程。假设从图中某顶点v出发,在访问了v之后依
次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先与“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止
五、模块划分
一、基于邻接矩阵的深广度遍历
    1.Status InitQueue(LinkQueue *Q)
根据已知Q初始化队列
2.Status QueueEmpty (LinkQueue Q)
dnb判断队列是否为空
3.Status EnQueue(LinkQueue *Q, QElemType e)
将e压入队尾
4.Status DeQueue(LinkQueue *Q, QElemType *e)
取队头元素eentrypoint
5.int LocateVex(MGraph G,VertexType v)
定位定点v
6.void CreateGraph(MGraph *G)
建立无向图的邻接矩阵
7.void PrintGraph(MGraph G)
输出邻接矩阵的无向图
8.int FirstAdjVex(MGraph G,int v)
第一个邻接点的定位
9.int NextAdjVex(MGraph G,int v,int w)
查找下一个邻接点
10.void Dfs(MGraph G, int v)
实现图的一次遍历
11.void DfsTraver(MGraph G)
实现图的深度遍历
12.void BfsTraver(MGraph G)
实现图的广度遍历
13.Main
主函数
二、基于邻接表实现图的深广度遍历
1.Status InitQueue(LinkQueue *Q)
根据已知Q初始化队列
2.Status QueueEmpty (LinkQueue Q)
判断队列是否为空
3.Status EnQueue(LinkQueue *Q, QElemType e)
将e压入队尾
4.Status DeQueue(LinkQueue *Q, QElemType *e)
取队头元素e
5.void createALGraph(ALGraph *G)
建立无向图的邻接矩阵
悭吝6.void PrintGraph(MGraph G)
输出邻接矩阵的无向图
7.int FirstAdjVex(MGraph G,int v)
第一个邻接点的定位
8.int NextAdjVex(MGraph G,int v,int w)
查找下一个邻接点
9.void Dfs(MGraph G, int v)
实现图的一次深度遍历
10.void DfsTraver(MGraph G)
callmemaybe
实现图的深度遍历
11.void BFS(ALGraph G, int v)
实现图的一次广度遍历
12.void BfsTraver(MGraph G)
实现图的广度遍历
13.Void …………………………………Main
主函数
六、数据结构//(ADT)
1、基于邻接矩阵的图的类型定义
typedef struct ArcCell
    { VRType adj;  /*图中有1/0表示是否有边,网中表示边上的权值*/
      /* InfoType *info; 与边相关的信息*/
    } ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
    { VertexType vexs[MAX_VERTEX_NUM];  /*顶点向量*/
      AdjMatrix  arcs;                  /*邻接矩阵*/
      int vexnum,arcnum;          /*图中当前顶点数和边数*/
} MGraph;
capital cities2、基于邻接表的图的类型定义
typedef struct ArcNode     
{
  int adjvex;
  struct ArcNode  *nextarc; 
}ArcNode;                    /*表节点*/歧视英语   
           
typedef struct
  TElemType data;
ArcNode  *firstarc;
}VNode,AdjList[MAXVER];  /*表节点*/
typedef struct
{
  AdjList  vertices;
  int vexnum,arcnum;    /*图中当前顶点数和边数*/
} ALGraph;
七、源程序
一、基于邻接矩阵的图的深度、广度遍历
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
亮晶晶的拼音#define OK 1
#define ERROR 0
typedef int Status;
leslie cheung#define INFINITY INT_MAX    /*最大值“无穷”*/
#define MAX_VERTEX_NUM 20  /*最大顶点个数*/
typedef int Boolean;
typedef char VertexType[20];
typedef int  VRType;
rolling
/**************以下为队列的操作************/
/****队列的类型定义****/
typedef int QElemType;
typedef struct QNode
  {QElemType data;
    struct QNode *next;
  } QNode, *QueuePtr;
typedef struct
  {
    QueuePtr front;
    QueuePtr rear;
  } LinkQueue;
/****初始化队列****/
Status InitQueue(LinkQueue *Q)
{ (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
if(!(*Q).front) exit(OVERFLOW);

本文发布于:2023-07-23 23:00:56,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/186700.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:遍历   访问   邻接   顶点   节点   深度   队列
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图