软件学院实验报告

姓名:              学号:              专业:               年级:

课程名称

数据结构

实验名称

实验9、图的遍历

实验的准备阶段

实验内容

(1)实验目的

通过该实验,使学生掌握图的几种存储结构,理解图的深度优先和广度优先遍历算法的思想和实现办法,

(2)实验内容

实现教材算法7.2利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。

(3)参考界面

(4)验收/测试用例

  1. 创建所示无向图

屏幕输出邻接矩阵

0  1  0  0  0  1

1

2

3

4

5

6

1  0  1  1  0  0

0  1  0  1  1  0

0  1  1  0  1  0

0  0  1  1  0  1

1  0  0  0  1  0

  1. 深度优先遍历

屏幕输出: 1 2 3 4 5 6

  1. 广度优先遍历

屏幕输出:1 2 6 3 4 5

  1. 另外:自己画出一个无向图,再测试一遍。

实验类型

验证性

实验的重点、难点

重点: 图遍历

难点: 图的深度优先遍历

实验环境

VC++6.0

实验的实施阶段

实验步骤及完成任务情况

一、设计思想

二、主要源代码

#include<iostream>

#include<stdlib.h>

#define MaxVertexNum 100

#define OK 1

#define ERROR 0

using namespace std;

typedef int status;

typedef int vertex;

typedef int weightType;

struct QNode;

typedef QNode* PtrtoQNode;

struct _Queue;

typedef struct _Queue* Queue;

struct QNode{

vertex v;

PtrtoQNode next;

};

struct _Queue{

PtrtoQNode front;

PtrtoQNode rear;

};

struct eNode;

typedef struct eNode* edge;

struct GNode;

typedef struct GNode* PtrToGNode;

typedef struct GNode* MGraph;

struct eNode{

vertex v;

vertex w;

weightType weight;

};

struct GNode{

int vn,en;

weightType G[MaxVertexNum][MaxVertexNum];

};

bool visited[MaxVertexNum];

MGraph create(){

MGraph G=(MGraph)malloc(sizeof(struct GNode));

return G;

}

status insert(edge e,MGraph G){

G->G[e->v][e->w]=e->weight;

G->G[e->w][e->v]=e->weight;

return OK;

}

MGraph build(MGraph G){

cout<<"输入vertexNum"<<endl;

cout<<"输入edgeNum"<<endl;

int vn;

cin>>G->vn;

cin>>G->en;

cout<<"输入edge"<<endl;

edge e=(edge)malloc(sizeof(struct eNode));

for(int i=0;i<G->en;i++){

cin>>e->v>>e->w>>e->weight;

insert(e,G);

}

return G;

}

status show(MGraph G){

for(int i=1;i<=G->vn;i++){

for(int j=1;j<=G->vn;j++){

cout<<G->G[i][j]<<' ';

}

cout<<endl;

}

return OK;

}

status DFS(MGraph G,vertex v){

visited[v]=true;

cout<<v<<' ';

for(int i=1;i<=G->vn;i++){

if(G->G[v][i]&&!visited[i])

DFS(G,i);

}

return OK;

}

Queue InitQueue(){

Queue Q=(Queue)malloc(sizeof(struct _Queue));

Q->front=Q->rear=(PtrtoQNode)malloc(sizeof(struct QNode));

Q->front->next=NULL;

return Q;

}

status EnQueue(vertex v,Queue Q){

PtrtoQNode p=(PtrtoQNode)malloc(sizeof(struct QNode));

p->v=v;

p->next=NULL;

Q->rear->next=p;

Q->rear=p;

return OK;

}

status DeQueue(Queue Q,vertex* v){

*v=Q->front->next->v;

PtrtoQNode p=Q->front->next;

if(p==Q->rear){

free(p);

Q->rear=Q->front;

return OK;

}

else{

Q->front->next=p->next;

free(p);

return OK;

}

}

status BFS(MGraph G,vertex v){

Queue Q=InitQueue();

EnQueue(v,Q);

visited[v]=true;

vertex w;

while(Q->front!=Q->rear){

DeQueue(Q,&w);

cout<<w<<' ';

for(int i=1;i<=G->vn;i++){

if(G->G[w][i]&&!visited[i]){

visited[i]=true;

EnQueue(i,Q);

}

}

}

}

void set(bool visited[]){

for(int i=0;i<MaxVertexNum;i++)

{

visited[i]=false;

}

}

int main(){

set(visited);

MGraph G=create();

int i;

do{

cout<<"***************\n"

<<"***无向网图****\n"

<<"1.构建网图\n"

<<"2.输出邻接矩阵\n"

<<"3.深度优先遍历\n"

<<"4.广度优先遍历\n"

<<"5.退出\n"

<< "***************\n"

<< "***************\n"

<<endl;

cin>>i;

system("cls");

switch(i){

case 1:

G=build(G);

cout<<"OK"<<endl;

break;

case 2:

show(G);

cout<<"OK"<<endl;

break;

case 3:

if(DFS(G,1))

cout<<endl<<"OK"<<endl;

set(visited);

break;

case 4:

if(BFS(G,1))

cout<<endl<<"OK"<<endl;

set(visited);

break;

default:

break;

}

system("pause");

system("cls");

}while(i!=5);

return 0;

}

实验结果的处理阶段

实验结果

(注意:请同学们看完要求,把本段红色文字删除!!!)粘贴运行结果的截图,并适当用文字描述运行结果。

实验结果总结

(注意:请同学们看完要求,把本段红色文字删除!!!)

写自己遇到的问题,以及解决的方法。至少写两个。

或者写遇到的一个问题,写一段自己的收获,自己学会了什么。

实现教材算法7.2利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。相关推荐

  1. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

  2. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  3. 数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)

    无向图创建邻接矩阵.深度优先遍历和广度优先遍历 一.概念解析: (1)无向图: (2)邻接矩阵: 二.创建邻接矩阵: 三.深度遍历.广度遍历 (1)深度遍历概念: (2)广度遍历概念: 四.实例展示 ...

  4. TF之TFSlim:利用经典VGG16模型(InceptionV3)在ImageNet数据集基础上训练自己的五个图像类别数据集的训练过程记录

    TF之TFSlim:利用经典VGG16模型(InceptionV3)在ImageNet数据集基础上训练自己的五个图像类别数据集的训练过程记录 目录 训练控制台显示 输出结果文件 训练控制台显示 输出结 ...

  5. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...

    图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...

  6. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法:三十张图弄懂「图的两种遍历方式」...

    原创: 进击的HelloWorld1 引言遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点 ...

  7. 算法:深度优先遍历和广度优先遍历

    什么是深度.广度优先遍历 图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历.遍历过程中得到的顶点序列 ...

  8. Java数据结构之图的基本概念和算法,深度优先遍历DFS,广度优先遍历BFS(图解)

    文章目录 前言 一.图的基本概念 1.图的定义 2.基本术语 二.图的基本算法 1.初始化图 2.插入顶点和边 3.矩阵打印 4.返回第一个邻接结点的下标 5.返回第一个邻接结点的下一个结点的下标 三 ...

  9. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法...

    数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...

最新文章

  1. Seam开发环境中的中文乱码问题
  2. AWS — AWS Local Zone
  3. CString 用法
  4. 爆点客源4.1.0活动营销应用56版 修复朋友圈不显示问题
  5. linux+模块与设备关系,linux内核设计与实现读书笔记——设备和模块
  6. Linux从初学到精通
  7. 谷歌Deep Dream解析(附源代码,可以直接运行)
  8. 【图像去噪】基于matlab GUI均值+中值+高通低通+巴特沃斯+PCA+小波+维纳滤波图像去噪【含Matlab源码 1705期】
  9. 第十届飞思卡尔杯智能车竞赛规则解读
  10. QML之gradient
  11. 真的有必要读研究生吗?
  12. Android 11.0 12.0修改搜狗为默认输入法,并且授予运行权限
  13. PPIO数据碎片化分散存储
  14. nyoj 月老的难题【最大匹配】
  15. Chrome 设置黑色模式
  16. 华为开发者大会主题演讲:3D建模服务让内容高效生产
  17. iOS:quartz2D绘图(绘制渐变图形)
  18. 联想台式计算机g50500i,联想台式电脑的价格及配置
  19. Numpy+Pandas+Matplotlib学习
  20. 企业网盘+超融合,联想云加速的双引擎

热门文章

  1. 10个最好的 JavaScript 动画库【值得收藏】
  2. GitHub怎么用 GitHub是什么 新手怎么用GitHub 图文并茂,不看都不行
  3. pip安装gunicorn_gunicorn安装报错
  4. 原生的 即时聊天前端 可插入图片,表情(没用html编辑器插件)
  5. Linux服务器启动tomcat(详细教程避免踩坑)
  6. CSRF攻击防御方法
  7. 好心情患者故事 | 抑郁时,我伪装出了一个积极健康的自己
  8. Linux命令:du+find分析目录大小,清理空间
  9. 思想调试:为什么4核CPU上只有一个核在工作?
  10. javascript中元素的scrollLeft和scrollTop属性说明