图 无向网 采用邻接矩阵存储结构 按深度优先搜索和广度优先搜索遍历图 (DFS,BFS)实验报告 数据结构

简介: 图 无向网 采用邻接矩阵存储结构 按深度优先搜索和广度优先搜索遍历图 (DFS,BFS)实验报告 数据结构

基本内容:

输入图的类型、顶点数、弧(边)数、顶点信息、弧(边)信息,建立相应的图(具体类型可以是无向图、有向图、无向网、有向网,采用邻接矩阵存储结构);分别按深度优先搜索和广度优先搜索遍历图;按某种形式输出图及遍历结果。

代码:

#include<stdio.h>
#include<stdlib.h>
#define MAXQSIZE 100//循环队列最大值 
#define OVERFLOW -2
#define FALSE 0
#define OK 1
#define MAX_VEX_NUM 20//图中最多20个顶点 
#define INFINITY 0 
typedef int Status;
typedef char ElemType;
typedef struct//图结构 
{
  ElemType vertex[MAX_VEX_NUM];//存顶点 
  Status arcs[MAX_VEX_NUM][MAX_VEX_NUM];//存边 
  Status vex_num,arc_num;// vex_num顶点数,arc_num边数 
}Mgraph;
typedef struct//循环队列结构 
{
  ElemType *base;
  int front;
  int rear;
}SqQueue;
//分配数组,将数组中的元素赋值为0 
bool visited[MAX_VEX_NUM];//深度优先搜索的辅助数组 
bool Qvisited[MAX_VEX_NUM];//广度优先搜索的辅助数组 
//定位边的节点 
Status LocateVex(Mgraph g,ElemType v)
// 从键盘中输入结点值,定位的作用是找到结点在 vertex数组中的下标 
{
  Status i;
  for(i=0;i<g.vex_num;++i)//把所有的顶点循环一次 
  {
    if(g.vertex[i]==v)
    {
      return i;//返回下标位置 
    }
  }
}
//创建图
void create_UDG(Mgraph &g)
{
  Status i,j,k;
  ElemType v1,v2;//顶点 
  Status cost;//权值 
  printf("请输入顶点数,边数:\n");
  scanf("%d,%d",&g.vex_num,&g.arc_num);
  getchar();//作用是将回车键吃掉 
  printf("请输入顶点信息:\n"); //读入顶点 
  for(i=0;i<g.vex_num;++i)
  {
    scanf("%c",&g.vertex[i]);
    getchar();
  } 
//初始化邻接矩阵(将二维邻接矩阵全部置为正无穷) 
  for(i=0;i<g.vex_num;++i)
  {
    for(j=0;j<g.vex_num;++j)
    {
      g.arcs[i][j]=INFINITY;
    }
  }
  //构造邻接矩阵
  printf("请输入边信息:\n");
  for(k=0;k<g.arc_num;++k)
  {
    //输入依附于两个顶点的边
    scanf("%c,%c,%d",&v1,&v2,&cost);
    getchar();
    i=LocateVex(g,v1);//找到v1顶点所在 vertex数组的位置 
    j=LocateVex(g,v2);//找到v2顶点所在vertex数组的位置 
    g.arcs[i][j]=cost;//在二维数组中将权值替换
    g.arcs[j][i]=g.arcs[i][j];  //无向网,对称矩阵
  } 
 }
  //输出图,检查图是否创建成功 
 void out_UDG(Mgraph g)
 {
  Status i,j;
  printf("图的顶点是:\n");
  for(i=0;i<g.vex_num;i++)//遍历 vertex数组 
  {
    printf("%8c",g.vertex[i]);
  }
  printf("\n");
  printf("图的邻接矩阵是:\n");
  for(i=0;i<g.vex_num;i++)//遍历 arcs数组 
  {
    for(j=0;j<g.vex_num;j++)
    {
      printf("%8d",g.arcs[i][j]);
    }
    printf("\n");
  }
  }
 //深度搜索 (递归)
void DFS(Mgraph g, Status v)
{
  printf("%8c",g.vertex[v]);//从数组下标为0的结点搜索 
  visited[v] = 1;//搜索过的标记为1 
  for(int w = 0; w < g.vex_num; w ++ )
    if( (g.arcs[v][w] != 0 ) && (!visited[w]))//权值不为0代表有边,visited为0代表没有扫过 
      DFS(g, w);
}
//创建空队列 
Status InitQueue (SqQueue &Q)
{
  Q.base=(ElemType*)malloc(MAXQSIZE * sizeof(ElemType));
  if(!Q.base)
  {
    exit(OVERFLOW);
  }
  Q.front=Q.rear=0;
  return OK;
}
//入队 
Status EnQueue(SqQueue &Q,ElemType e)
{
  if((Q.rear+1)%MAXQSIZE==Q.front)
  {
    return FALSE;
  }
  Q.base[Q.rear]=e;
    Q.rear=(Q.rear+1)%MAXQSIZE;
    return OK;
}
//出队 
Status DeQueue(SqQueue &Q)
{
  if(Q.front==Q.rear)
  {
    return FALSE;
  }
  Q.front=(Q.front+1)%MAXQSIZE;
  return Q.front-1;
} 
//广度搜索 
void BFS(Mgraph g,Status v)
{
  printf("广度优先搜索结果为:\n"); 
  Status w;
    printf("%8c",g.vertex[v]);//先将第一个顶点输出 
  Qvisited[v]=1;//将第一个顶点标记为1 
  SqQueue Q;
  InitQueue(Q);//创建队列 
  EnQueue(Q,g.vertex[v]);//将第一个顶点入队 
  while(!(Q.rear+1==Q.front))//循环条件是队列不为空 
  {
    v=DeQueue(Q);//出队,并将顶点的下标返回给v 
    for(w=0;w<g.vex_num;w++)//搜索二维数组中的每一行 
    {
      if(g.arcs[v][w]!=0&&Qvisited[w]==0)
      {
        Qvisited[w]=1;//将节点的每一个相邻结点标记为1 
        printf("%8c",g.vertex[w]);//将节点的每一个相邻结点输出 
        EnQueue(Q,g.vertex[w]);//将子节点入队列 
      }
    }
  }
}
int main()
{
  Mgraph g;
  create_UDG(g);//建图 
  out_UDG(g);//检验图 
  printf("深度优先搜索结果:\n"); 
  DFS(g,0);//深搜 
  printf("\n");
  BFS(g,0);//广搜 
  return 0;
}

运行结果:

微信图片_20220927111355.png微信图片_20220927111400.jpg

相关文章
|
10月前
|
算法 安全 网络安全
数据结构之网络攻击路径(深度优先搜索)
本文介绍了如何使用深度优先搜索(DFS)算法分析网络攻击路径。在网络安全领域,DFS用于检测网络中潜在的攻击路径,帮助安全人员及时发现并阻止威胁。文中详细描述了网络图的构建、节点间的连接关系以及DFS的实现过程。通过一个具体的例子,展示了如何检测从一个普通节点到关键节点的攻击路径,并讨论了DFS算法的优缺点。提供的C++代码实现了网络图的构建和攻击路径的检测功能。
218 24
|
10月前
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
265 0
|
8月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
264 10
|
8月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
259 3
|
10月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
390 23
|
10月前
|
传感器 算法
数据结构之环境监测系统(深度优先搜索)
环境监测系统采用深度优先搜索(DFS)算法,实现实时监测和分析环境参数,如温度、湿度等。系统通过构建传感器网络图结构,利用DFS遍历网络,检测异常数据。当温度超过预设阈值时,系统将发出警告。此系统适用于工业生产、室内空调控制、农业温室管理等多种场景,提供高效的环境监测解决方案。
164 12
|
8月前
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
316 0
|
10月前
|
算法
数据结构之旅行商问题(深度优先搜索)
旅行商问题(TSP)是寻找访问多个城市并返回起点的最短路径的经典问题。本文介绍了TSP的背景、应用、复杂性和解决方法,重点讲解了使用深度优先搜索(DFS)算法求解TSP的过程。通过邻接矩阵表示城市间的距离,利用访问数组和栈结构辅助DFS遍历,最终找到最优路径。此方法虽然能保证找到最优解,但时间复杂度高,适用于城市数量较少的情况。示例代码展示了算法的具体实现及结果分析。
281 2
|
10月前
|
算法
数据结构之农业作物管理(深度优先搜索)
本文探讨了农业作物管理系统的背景、发展动因及其在现代农业中的重要性,特别是在应对气候变化、资源减少等挑战时的作用。文中介绍了作物关系建模与深度优先搜索(DFS)的应用,展示了如何通过邻接矩阵和DFS算法实现作物的智能管理和优化。通过具体的数据结构设计和核心代码实现,说明了DFS在农业作物管理中的应用效果及优缺点。
85 1
|
10月前
|
算法
数据结构之卫星通信网络(BFS)
本文介绍了卫星通信网络及其重要性,并探讨了广度优先搜索(BFS)算法在其中的应用。卫星通信网络通过在轨卫星提供全球覆盖的通信服务,尤其在偏远地区和紧急救援中发挥关键作用。BFS算法用于网络拓扑分析、路径规划和故障排除,确保通信网络的高效运行。文章还包括BFS算法的工作原理、特点、优缺点及其实现代码示例。
257 1