图 无向网 采用邻接矩阵存储结构 按深度优先搜索和广度优先搜索遍历图 (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

相关文章
|
3月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
87 4
|
3月前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
80 4
|
3月前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
75 4
|
3月前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
63 4
|
3月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
80 4
|
1月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
49 10
|
3月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
128 4
|
3月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
81 4
|
3月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
149 16
|
3月前
|
算法
数据结构之卫星通信网络(BFS)
本文介绍了卫星通信网络及其重要性,并探讨了广度优先搜索(BFS)算法在其中的应用。卫星通信网络通过在轨卫星提供全球覆盖的通信服务,尤其在偏远地区和紧急救援中发挥关键作用。BFS算法用于网络拓扑分析、路径规划和故障排除,确保通信网络的高效运行。文章还包括BFS算法的工作原理、特点、优缺点及其实现代码示例。
73 1

热门文章

最新文章