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

相关文章
|
2月前
|
算法 测试技术 定位技术
数据结构与算法——DFS(深度优先搜索)
数据结构与算法——DFS(深度优先搜索)
|
1月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
67 16
|
2月前
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
3月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
2月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
2月前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
|
2月前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
453 8
|
2月前
|
算法 Python
逆袭之路!用 Python 玩转图的 DFS 与 BFS,让数据结构难题无处遁形
在数据结构的广袤领域中,图是一种强大而复杂的结构,而深度优先搜索(DFS)和广度优先搜索(BFS)则是遍历图的两把利剑。Python 以其简洁和强大的特性,为我们提供了实现和运用这两种算法的便捷途径。
78 0
|
2月前
|
机器学习/深度学习 存储 算法
数据结构与算法——BFS(广度优先搜索)
数据结构与算法——BFS(广度优先搜索)