实验四 图的遍历
一、实验目的
掌握图的概念和结构特征,以及各种存储结构的特点及适用范围; 掌握图的建立、图的深度优先搜索和广度优先搜索。
二、实验环境
1、PC微机;
2、Windows 操作系统;
3、VC6.0或以上
三、实验内容
利用邻接矩阵作存储结构,编写图的深度优先搜索和广度优先搜索。
测试数据:
6 9 //顶点数 边数
ABCDEF //顶点
0,1 0,2 0,4 1,2 1,3 2,3 2,5 3,4 3,5
输出该图深度优先搜索和广度优先搜索访问顺序。
四、实验步骤、测试及结果
1.代码

#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXVEX 100 /* 最大顶点数,应由用户定义 */
#define INFINITY 65535 /* 无穷大 */typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char VertexType; /* 顶点类型应由用户定义  */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */
typedef struct
{VertexType vexs[MAXVEX]; /* 顶点表 */EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */int numNodes, numEdges; /* 图中当前的顶点数和边数  */
}MGraph;/* 建立无向网图的邻接矩阵表示 */
void CreateMGraph(MGraph *G)
{int i,j,k,w;printf("输入顶点数和边数(英文输入):\n");scanf("%d,%d",&G->numNodes,&G->numEdges); /* 输入顶点数和边数 */for(i = 0;i <G->numNodes;i++) /* 读入顶点信息,建立顶点表 */scanf(&G->vexs[i]);for(i = 0;i <G->numNodes;i++)for(j = 0;j <G->numNodes;j++)G->arc[i][j]=INFINITY;  /* 邻接矩阵初始化 */for(k = 0;k <G->numEdges;k++) /* 读入numEdges条边,建立邻接矩阵 */{printf("输入边(vi,vj)上的下标i,下标j和权w:\n");scanf("%d,%d,%d",&i,&j,&w); /* 输入边(vi,vj)上的权w */G->arc[i][j]=w; G->arc[j][i]= G->arc[i][j]; /* 因为是无向图,矩阵对称 */}
}int main(void)
{    MGraph G;    CreateMGraph(&G);for(int i=0; i<G.numNodes; i++){for(int j=0; j<G.numNodes;j++){printf("%8d", G.arc[i][j]);}printf("\n");}return 0;
}

运行结果

二、

#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0typedef int Status;  /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */typedef char VertexType; /* 顶点类型应由用户定义 */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */#define MAXSIZE 6 /* 存储空间初始分配量 */
#define MAXEDGE 9
#define MAXVEX 9
#define INFINITY 65535typedef struct
{VertexType vexs[MAXVEX]; /* 顶点表 */EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */int numVertexes, numEdges; /* 图中当前的顶点数和边数 */
}MGraph;/* 用到的队列结构与函数********************************** *//* 循环队列的顺序存储结构 */
typedef struct
{int data[MAXSIZE];int front;       /* 头指针 */int rear;      /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
}Queue;/* 初始化一个空队列Q */
Status InitQueue(Queue *Q)
{Q->front=0;Q->rear=0;return  OK;
}/* 若队列Q为空队列,则返回TRUE,否则返回FALSE */
Status QueueEmpty(Queue Q)
{ if(Q.front==Q.rear) /* 队列空的标志 */return TRUE;elsereturn FALSE;
}/* 若队列未满,则插入元素e为Q新的队尾元素 */
Status EnQueue(Queue *Q,int e)
{if ((Q->rear+1)%MAXSIZE == Q->front)  /* 队列满的判断 */return ERROR;Q->data[Q->rear]=e;         /* 将元素e赋值给队尾 */Q->rear=(Q->rear+1)%MAXSIZE;/* rear指针向后移一位置, *//* 若到最后则转到数组头部 */return  OK;
}/* 若队列不空,则删除Q中队头元素,用e返回其值 */
Status DeQueue(Queue *Q,int *e)
{if (Q->front == Q->rear)           /* 队列空的判断 */return ERROR;*e=Q->data[Q->front];               /* 将队头元素赋值给e */Q->front=(Q->front+1)%MAXSIZE;   /* front指针向后移一位置, *//* 若到最后则转到数组头部 */return  OK;
}void CreateMGraph(MGraph *G)
{int i, j;G->numEdges=9;G->numVertexes=6;/* 读入顶点信息,建立顶点表 */G->vexs[0]='A';G->vexs[1]='B';G->vexs[2]='C';G->vexs[3]='D';G->vexs[4]='E';G->vexs[5]='F';for (i = 0; i < G->numVertexes; i++)/* 初始化图 */{for ( j = 0; j < G->numVertexes; j++){G->arc[i][j]=0;}}G->arc[0][1]=1;G->arc[0][2]=1;G->arc[0][4]=1; G->arc[1][2]=1; G->arc[1][3]=1; G->arc[2][3]=1; G->arc[2][5]=1; G->arc[3][4]=1;G->arc[3][5]=1;for(i = 0; i < G->numVertexes; i++){for(j = i; j < G->numVertexes; j++){G->arc[j][i] =G->arc[i][j];}}}Boolean visited[MAXVEX]; /* 访问标志的数组 *//* 邻接矩阵的深度优先递归算法 */
void DFS(MGraph G, int i)
{int j;visited[i] = TRUE;printf("%c ", G.vexs[i]);/* 打印顶点,也可以其它操作 */for(j = 0; j < G.numVertexes; j++)if(G.arc[i][j] == 1 && !visited[j])DFS(G, j);/* 对为访问的邻接顶点递归调用 */
}/* 邻接矩阵的深度遍历操作 */
void DFSTraverse(MGraph G)
{int i;for(i = 0; i < G.numVertexes; i++)visited[i] = FALSE; /* 初始所有顶点状态都是未访问过状态 */for(i = 0; i < G.numVertexes; i++)if(!visited[i]) /* 对未访问过的顶点调用DFS,若是连通图,只会执行一次 */ DFS(G, i);
}/* 邻接矩阵的广度遍历算法 */
void BFSTraverse(MGraph G)
{int i, j;Queue Q;for(i = 0; i < G.numVertexes; i++)visited[i] = FALSE;InitQueue(&Q);        /* 初始化一辅助用的队列 */for(i = 0; i < G.numVertexes; i++)  /* 对每一个顶点做循环 */{if (!visited[i])  /* 若是未访问过就处理 */{visited[i]=TRUE;       /* 设置当前顶点访问过 */printf("%c ", G.vexs[i]);/* 打印顶点,也可以其它操作 */EnQueue(&Q,i);       /* 将此顶点入队列 */while(!QueueEmpty(Q))  /* 若当前队列不为空 */{DeQueue(&Q,&i);  /* 将队对元素出队列,赋值给i */for(j=0;j<G.numVertexes;j++) { /* 判断其它顶点若与当前顶点存在边且未访问过  */if(G.arc[i][j] == 1 && !visited[j]) { visited[j]=TRUE;         /* 将找到的此顶点标记为已访问 */printf("%c ", G.vexs[j]);  /* 打印顶点 */EnQueue(&Q,j);                /* 将找到的此顶点入队列  */} } }}}
}int main(void)
{    MGraph G;CreateMGraph(&G);printf("\n深度遍历:");DFSTraverse(G);printf("\n广度遍历:");BFSTraverse(G);return 0;
}

运行结果:

五、实验小结

  1. 深度优先遍历其实就是一个递归的过程,而且就像一棵树的前序遍历。它从图中某个顶点 v 出发,访问此顶点,然后从 v 的未被访问的邻接点出发深度优先遍历图,直至图中所有和 v 有路径相通的顶点都被访问到。
  2. 广度优先遍历就类似于树的层序遍历。

数据结构:实验四 图的遍历相关推荐

  1. 图的遍历c语言数据结构实验报告,数据结构实验报告--图的遍历

    江 西 理 工 大 学 数据结构 实验报告 实验名称 图的遍历 日期 2014-12-01 专业班级 计算机(中加)131班 地点 信息学院621 实验人 王鹏伟 学号 同组人 单独完成 152013 ...

  2. 实验四 图的遍历算法设计与实现

    一.实验名称:图的遍历算法设计与实现 二.实验目的: 1.掌握图的深度优先遍历的算法. 2.掌握图的广度优先遍历的算法. 3.实验章节:算法设计与分析 第四章 三.实验内容.实验问题和程序运行结果 第 ...

  3. 数据结构实验:图遍历的演示

    数据结构实验四:图遍历的演示 实验题目描述 1.基本要求 2.参考 实验过程 1.开发环境描述 2.题目分析及解题思路 3.实验代码 4.文件 联系我 实验题目描述 1.基本要求 ① 很多涉及图上操作 ...

  4. 数据结构实验三 图的操作与实现

    系列文章: 数据结构实验一 线性表.堆栈和队列的操作与实现 数据结构实验二 二叉树的操作与实现 数据结构实验三 图的操作与实现 数据结构实验四 查找和排序算法实现 一.实验目的: 1.领会图的两种主要 ...

  5. 数据结构实验八 图及其应用

    数据结构实验八 图及其应用 实验内容 1.编写一个程序,完成如下功能: (1) 建立如下有向图G1的邻接矩阵输出,并由邻接矩阵产生邻接表输出之: (2) 输出图G1从顶点0开始的深度优先遍历序列: ( ...

  6. 数据结构实验六 图的操作实现

    数据结构实验六 图的操作实现 一.实验目的 1. 理解图的存储结构与基本操作: 2. 掌握图的创建过程 二.实验内容 1.根据下图,采用邻接矩阵的存储结构保存此图,并打印出邻接矩阵. 图的创建代码参考 ...

  7. 实验六 图的遍历操作及应用

    实验六 图的遍历操作及应用 一.实验实习目的及要求 掌握有向图和无向图的概念:掌握邻接矩阵和邻接链表建立图的存储结构:掌握DFS及BFS对图的遍历操作:了解图结构在人工智能.工程等领域的广泛应用. 二 ...

  8. 数据结构实验四 :字符串和多维数组

    数据结构实验四 :字符串和多维数组 本次实验内容: 1.从键盘输入一些文本,统计文本单词的个数. 2.写程序输出一个5阶幻方:每一行每一列每一个对角线和均相等. 3.自己设计一个字符加密算法,并设计程 ...

  9. 广州大学数据结构实验四

    实验四 查找和排序算法实现 开课实验室:计算机科学与工程实验(电子楼)       2020年12月31日 学院 计算机科学与网络工程学院 年级.专业.班 网络工程194 姓名 jwt 学号 实验课程 ...

  10. 数据结构实验四 排序算法的实现

    广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼416)     2019年6月4日 学院 计算机科学与教育软件学院 年级.专业.班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项 ...

最新文章

  1. System.Timers.Timer 多线程问题[转]
  2. echarts在.Net中使用实例(一) 简单的Demo
  3. 深度学习项目-人群密度估计
  4. Python对Protobuf进行序列化与反序列化
  5. c语言 手动实现sizeof,sizeof究竟是怎样实现的?
  6. fireFox IE刷新不提示
  7. 查询oracle表空间有什么数据,oracle查询表空间使用情况与查询有哪些数据库实例在运行...
  8. datatable的查询介绍
  9. ATT与intel汇编格式区分
  10. html写彩虹,HTML5 Canvas彩虹粒子组成的动画文本
  11. 如何根据动态SQL代码自动生成DTO
  12. 前端实现在线预览Word文件
  13. Fluent:如何用Custom Field Function Calculater替代UDMI提高收敛性
  14. 移动通讯技术--3G
  15. 虚拟机u盾怎么使用_Linux下如何使用网银
  16. Adobe reader update 无法将数值disableexceptionchainvaliddation写入键/sofeware...请验证您对该有足够
  17. jaeger,zipkin,datadog,skywalking等分布式追踪工具
  18. [个人笔记]origin学习 APP功能
  19. android app生涯
  20. python语法--循环语句(10)

热门文章

  1. 新安装的centos使用ifconfig无效或者无法使用的解决办法
  2. css按钮音效设置,带悬停音效(超低声波)的磁吸按钮
  3. linux7dhcpd服务命令,CentOS7系统架设DHCP服务
  4. java中是否可以覆盖over_”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?...
  5. 声音模仿_澳洲这种鸟堪称“超级声音模仿秀”,比八哥还牛,却正遭山火毁灭...
  6. Java编程:KMP算法
  7. python_open3d_Error: The DISPLAY environment variable is missing
  8. 算法笔记_面试题_11.正则表达式匹配
  9. python对文件的读取
  10. (CVPR2020 Oral)用于实时实例分割的Deep Snake方法