(数据结构)1.实现图的邻接矩阵和邻接表的存储 2.实现图的遍历算法

2023-11-18

实验内容

1、编写一个程序graph.cpp,设计带权图的邻接矩阵与邻接表的创建和输出运算,并在此基础上设计一个主程序exp8-1.cpp完成以下功能。
(1)建立如图8.54所示的有向图G的邻接矩阵,并输出之。
(2)建立如图8.54所示的有向图G的邻接表,并输出之。
(3)销毁图G的邻接表。
2、编写一个程序travsal.cpp实现图的两种遍历运算,并在此基础上设计一个程序exp8-2.cpp完成以下功能。
(1)输出如图8.54的有向图G从顶点0开始的深度优先遍历序列(递归算法)。
(2)输出如图8.54的有向图G从顶点0开始的深度优先遍历序列(非递归算法)。
(3)输出如图8.54的有向图G从顶点0开始的广度优先遍历序列。

代码实现

1、

#include <iostream>
#include <malloc.h>
#define INF 32767	//定义无穷大 
#define MAXV 100	//最大顶点个数
typedef char InfoType;
 
//定义邻接矩阵类型 
typedef struct
{
	int no;
	InfoType info;
}VertexType;
typedef struct
{
	int edges[MAXV][MAXV];
	int n,e;
	VertexType vexs[MAXV]; 
}MatGraph;

//定义邻接表类型
typedef struct ANode
{
	int adjvex;
	struct ANode *nextarc;
	int weight;
 } ArcNode;
typedef struct Vnode
{
	InfoType info;
	int count;
	ArcNode *firstarc;
}VNode;
typedef struct
{
	VNode adjlist[MAXV];
	int n,e;
}AdjGraph;

//邻接矩阵的基本运算:
//创建邻接矩阵 
void CreateMat(MatGraph &g,int A[MAXV][MAXV],int n,int e)
{
	int i,j; 
	g.n=n;g.e=e;
	for(i=0;i<g.n;i++)
		for(j=0;j<g.n;j++)
			g.edges[i][j]=A[i][j];
}
//输出邻接矩阵
void DispMat(MatGraph g)
{
	int i,j;
	for(i=0;i<g.n;i++)
	{
		for(j=0;j<g.n;j++)
		{
			if(g.edges[i][j]!=INF)
				printf("%4d",g.edges[i][j]);
			else
				printf("%4s","-");
		}
		printf("\n");
	}
 } 
 
 //邻接表的基本运算:
 //创建邻接表 
 void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e) 
 {
 	int i,j;
	ArcNode *p;
	G=(AdjGraph *)malloc(sizeof(AdjGraph));
	for(i=0;i<n;i++)
		G->adjlist[i].firstarc=NULL;
	for(i=0;i<n;i++)
	{
		for(j=n-1;j>=0;j--)
		{
			if(A[i][j]!=0&&A[i][j]!=INF)
			{
				p=(ArcNode *)malloc(sizeof(ArcNode));
				p->adjvex=j;
				p->weight=A[i][j];
				p->nextarc=G->adjlist[i].firstarc;
				G->adjlist[i].firstarc=p;
			}
		}
	}
	G->n=n;G->e=n;
 } 
 //输出邻接表
 void DispAdj(AdjGraph *G)
 {
 	int i;
 	ArcNode *p;
 	for(i=0;i<G->n;i++)
 	{
 		p=G->adjlist[i].firstarc;
 		printf("%3d:",i);
 		while(p!=NULL)
 		{
 			printf("%3d[%d]->",p->adjvex,p->weight);
 			p=p->nextarc ;
		 }
		printf("^\n");
	 }
  } 
//销毁邻接表
void DestroyAdj(AdjGraph *&G)
{
	int i;
	ArcNode *pre,*p;
	for(i=0;i<G->n;i++)
	{
		pre=G->adjlist[i].firstarc;
		if(pre!=NULL)
		{
			p=pre->nextarc ;
			while(p!=NULL)
			{
				free(pre);
				pre=p;p=p->nextarc ;
			}
			free(pre);
		}
	 } 
	 free(G);
 } 
int main()
{
	MatGraph g;
	AdjGraph *G;
	int A[MAXV][MAXV]={{0,1,0,1,0,0},
						{0,0,1,0,0,0},
						{1,0,0,0,0,1},
						{0,0,1,0,0,1},
						{0,0,0,1,0,0},
						{1,0,0,0,1,0}};
	int n=6,e=10;
	CreateMat(g,A,n,e);
	printf("图G的邻接矩阵:\n");
	DispMat(g);
	CreateAdj(G,A,n,e);
	printf("图G的邻接表:\n");
	DispAdj(G);
	DestroyAdj(G);
	return 1; 
} 

结果截图:
在这里插入图片描述
2、

#include<stdio.h>
#include<malloc.h>
#define MAXV 100
//以下定义邻接矩阵类型
typedef struct
{
 int no;           //顶点编号
 int info;         //顶点其余的信息  
}VertexType;
typedef struct
{
 int edges[MAXV][MAXV];   //邻接矩阵
 int n,e;                 //顶点数,弧数
 VertexType vexs[MAXV];   //存放顶点信息
}MGraph;
//一下定义邻接表类型
typedef struct ANode      //弧的节点结构类型
{
 int adjvex;          //该弧的终点位置
 struct ANode *nextarc;
 int info;            //弧的相关信息
} ArcNode;
typedef struct Vnode       //邻接表头结点类型
{
 int data;            //顶点信息
 ArcNode *firstarc;   //指向第一条弧
}VNode;
typedef VNode  AdjList[MAXV];
typedef struct
{
 AdjList adjlist;
 int n,e;
}ALGraph;
int visited[MAXV];

//递归深度优先遍历
void DFS(ALGraph *G,int v)   
{
 ArcNode *p;
 visited[v]=1;
 printf("%3d",v);
 p=G->adjlist[v].firstarc;
 while(p)
 {
  if(visited[p->adjvex]==0)
     DFS(G,p->adjvex);
        p=p->nextarc;
 }
}
//非递归深度优先遍历
void DFS1(ALGraph *G,int v)
{
 ArcNode *p;
 ArcNode *St[MAXV];
 int top=-1,i,w;
 for(i=0;i<G->n;i++)
   visited[i]=0;
    printf("%3d",v);
    visited[v]=1;
    top++;
    St[top]=G->adjlist[v].firstarc;
    while(top>-1)
    {
     p=St[top];top--;
     while(p)
     {
      w=p->adjvex;
      if(visited[w]==0)
      {
       printf("%3d",w);
       visited[w]=1;
       top++;
       St[top]=G->adjlist[w].firstarc;
       break;
      }
      p=p->nextarc;
     }
    }
    printf("\n");
}

//广度优先遍历 
void BFS(ALGraph *G,int v)
{
 ArcNode *p;
 int queue[MAXV],front=0,rear=0;
 int w,i;
 for(i=0;i<G->n;i++)
    visited[i]=0;
    printf("%3d",v);
    visited[v]=1;
    rear=(rear+1)%MAXV;
    queue[rear]=v;
    while(front!=rear)
    {
     front=(front+1)%MAXV;
     w=queue[front];
     p=G->adjlist[w].firstarc;
     while(p)
     {
      if(visited[p->adjvex]==0)
      {
       printf("%3d",p->adjvex);
       visited[p->adjvex]=1;
       rear=(rear+1)%MAXV;
       queue[rear]=p->adjvex;
      }
      p=p->nextarc;
     }
    }
    printf("\n");
}
void DispAdj(ALGraph *G)       //输出邻接表
{
 int i;
 ArcNode *p;
 for(i=0;i<G->n;i++)
 {
  p=G->adjlist[i].firstarc;
  if(p)  printf("%3d:",i);
  while(p)
  {
   printf("%3d->",p->adjvex);
   p=p->nextarc;
  }
  printf("\n");
 }
}
void MatToList(MGraph g,ALGraph *&G)        //将邻接矩阵 g 转换为邻接表 G
{
 int i,j,n=g.n;
 ArcNode *p;
 G=(ALGraph *)malloc(sizeof(ALGraph));
 for(i=0;i<n;i++)
   G->adjlist[i].firstarc=NULL;
    for(i=0;i<n;i++)
      for(j=n-1;j>=0;j--)
        if(g.edges[i][j])
        {
         p=(ArcNode *)malloc(sizeof(ArcNode));
         p->adjvex=j;
         p->info=g.edges[i][j];
         p->nextarc=G->adjlist[i].firstarc;
         G->adjlist[i].firstarc=p;
        }
    G->n=n;
    G->e=g.e;
}
 
int main()
{
 int i,j;
 MGraph g;
 ALGraph *G;
 int A[MAXV][6]={
  {0,5,0,7,0,0},
  {0,0,4,0,0,0},
  {8,0,0,0,0,9},
  {0,0,5,0,0,6},
  {0,0,0,5,0,0},
  {3,0,0,0,1,0}
 };
 g.n=6;g.e=10;
 for(i=0;i<g.n;i++)
 for(j=0;j<g.n;j++)
     g.edges[i][j]=A[i][j];
    G=(ALGraph *)malloc(sizeof(ALGraph));
    MatToList(g,G);
    printf("从顶点0开始的DFS(递归算法):\n");
    DFS(G,0);  printf("\n");
    printf("从顶点0开始的DFS(非递归算法):\n");
    DFS1(G,0);  printf("\n");
    printf("从顶点0开始的BFS(递归算法):\n");
    BFS(G,0);  printf("\n");
}      

结果截图:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(数据结构)1.实现图的邻接矩阵和邻接表的存储 2.实现图的遍历算法 的相关文章

  • 最快实现一个自己的扫地机

    作者 良知犹存 转载授权以及围观 欢迎关注微信公众号 羽林君 或者添加作者个人微信 become me 扫地机介绍 扫地机器人行业本质是技术驱动型行业 产品围绕导航系统的升级成为行业发展的主旋律 按功能划分 扫地机器人分为四大系统 即导航系
  • 【视频解读】AutoGluon背后的技术

    1 资料来源 AutoGluon背后的技术 哔哩哔哩 bilibili 也是一种Automl框架 在尽量不需要人的帮助下 对输入进行特征提取 选取适合的机器学习模型对它进行训练 大部分基于超参数搜索技术 从数十或者数百个参数中选取一个合适的
  • 判断List、Map集合是否为空的方法

    在Java中 判断集合是否为空有几种方法 以下是其中的一些 1 使用List isEmpty 方法 例如 List
  • openGL之API学习(六十三)GL_RASTERIZER_DISCARD

    glEnable GL RASTERIZER DISCARD 使用GL RASTERIZER DISCARD标志作为参数调用glEnable 函数 告诉渲染管线在transform feedback可选阶段之后和到达光栅器前抛弃所有的图元
  • 与计算机信息技术有关的课题,信息技术课题研究报告.doc

    PAGE PAGE 1 信息技术环境下教学模式和教学方法的创新研究 课题研究报告 摘要 本课题由中央电教馆与有关专家在充分论证的基础上 于2006年12月被批准为中央电化教育馆全国教育技术 十一五 专项课题 在中央电教馆组织下 课题研究得到
  • 机器学习在交通标志检测与精细分类中的应用

    导读 数据对于地图来说十分重要 没有数据 就没有地图服务 用户在使用地图服务时 不太会想到数据就像冰山一样 用户可见只是最直接 最显性的产品功能部分 而支撑显性部分所需要的根基 往往更庞大 地图数据最先是从专业采集来的 采集工具就是车 自行
  • python学习笔记2

    if语法 if True print 条件成 执 的代码1 print 条件成 执 的代码2 下 的代码没有缩进到if语句块 所以和if条件 关 print 我是 论条件是否成 都要执 的代码 if else if 条件 条件成 执 的代码
  • linux查看用户登录时间以及命令历史

    1 查看当前登录用户信息 who命令 who缺省输出包括用户名 终端类型 登陆日期以及远程主机 who var log wtmp 可以查看自从wtmp文件创建以来的每一次登陆情况 1 b 查看系统最近一次启动时间 2 H 打印每列的标题 u
  • 转载-STM32片上FLASH内存映射、页面大小、寄存器映射

    原文地址 http blog chinaunix net uid 20617446 id 3847242 html 本文以STM32F103RBT6为例介绍了片上Flash Embedded Flash 若干问题 包括Flash大小 内存映
  • LAMP框架的架构与环境配置

    1 LAMP架构的相关知识 1 1 LAMP架构的概述 LAMP架构是目前成熟的企业网站应用模式之一 指的是协同工作的一整套系统和相关软件 能够提供动态Web站点服务及其应用开发环境 LAMP是一个缩写词 具体包括Linux操作系统 Apa
  • 神经网络训练中batch的作用(从更高角度理解)

    1 什么是batch batch 翻译成汉语为批 一批一批的批 在神经网络模型训练时 比如有1000个样本 把这些样本分为10批 就是10个batch 每个批 batch 的大小为100 就是batch size 100 每次模型训练 更新
  • CPU流水线与指令乱序执行

    青蛙见了蜈蚣 好奇地问 蜈蚣大哥 我很好奇 你那么多条腿 走路的时候先迈哪一条啊 蜈蚣听后说 青蛙老弟 我一直就这么走路 从没想过先迈哪一条腿 等我想一想再回答你 蜈蚣站立了几分钟 它一边思考一边向前 蹒跚了几步 终于趴下去了 它对青蛙说
  • Http通用短信接口开发经验及具体开发实现

    支持所有开发语言的调用 苹果IOS操作系统和WindowsPhone手机操作系统可参考执行 一 Webservice接口 1 webservice返回集合对照表 返回值 返回值说明 问题描述 2 帐号 密码不正确 1 序列号未注册2 密码加
  • 房价预测--利用Python进行数据分析

    原文链接 https www kaggle com pmarcelino comprehensive data exploration with python notebook 在这篇文章中 我对原文的结论翻译并加入自己的一些理解 如有不当
  • OCR算法综述与编程实现

    OCR算法综述与编程实现 OCR Optical Character Recognition 光学字符识别 是一种将图像中的文字转换为可编辑文本的技术 它在许多领域中发挥着重要作用 如文档扫描 自动化数据输入和图像搜索等 本文将对几种常见的
  • vue初识之自定义指令

    目录 一 简介 二 组成 三 分类 1 全局自定义指令 2 私有自定义指令 四 总结 一 简介 Vue中的自定义指令是一种扩展Vue功能的方式 可以用来封装常用的DOM操作或者添加一些特殊的行为 自定义指令可以在Vue实例中全局注册或者局部
  • Python 基础(一):入门必备知识

    目录 1 标识符 2 关键字 3 引号 4 编码 5 输入输出 6 缩进 7 多行 8 注释 9 数据类型 10 运算符 10 1 常用运算符 10 2 运算符优先级 基础 进阶 爬虫 自动化 数据分析 编写小游戏 趣味 Python 文档
  • Elasticsearch入门简单版

    文章目录 Elasticsearch 入门与深入 一 Elasticsearch介绍 1 主要功能 2 版本与升级 新特性 5 x 新特性 6 x 新特性 7 x 二 ELK 家族成员介绍 Logstash Kibana Elastic B
  • 电驴无限制 服务器,全球最大电驴服务器eDonkeyServer No2消失

    位于瑞典的电驴服务器eDonkeyServer No2是在比利时的Razorback 2 0服务器和德国DonkeyServer系列服务器之后全球最大的电驴服务器 然而目前已经不能访问 上个月底 10月底 包括eDonkeyServer N
  • SonarQube扫描代码规则设置

    Java自带的内嵌规则有400多条 太全了 导致扫描检测到的bug太多 可以根据公司项目需求自定义规则 创建质量配置 切换到质量配置右上角点击创建 取名并指定你要检测的开发语言 上级选择没有 可以在搜索配置分类选一下 可以快速定位 将我们新

随机推荐

  • Python 六大数据类型

    一 数字型 一 整型 1 整型 int 在数字中 正整数 0 负整数都称为整型 2 二进制整型 也可用二进制表示整型 print自动转换为十进制 二 浮点型 1 浮点型 float 含有小数点的数据都是浮点型 三 布尔型 布尔型 bool
  • SQL中去掉字符串中最后一个字符(小技巧)

    长度减一就可以了 select left 字段名 len 字段名 1 from 表名
  • 基于SpringBoot的爱心家园服装捐赠系统

    目录 1 项目介绍 2 项目技术 3 运行环境 4 项目介绍 5 项目代码 5 运行截图 6 源码获取 1 项目介绍 角色 管理员 用户 管理员 管理员登录系统后 可以对首页 个人中心 用户管理 捐赠记录管理 论坛管理 留言管理 心愿管理等
  • 软件全家桶-持续收录中(个人常用软件)

    下载网盘 下文附有官网地址 也可自行从官网下载 链接 https pan baidu com s 1YCOUyEozR6KLsNcG3W BtA 提取码 a4ni 01 截屏软件snipaste windows mac 版本 中文官网 ht
  • JavaScript基础详细思维导图(纯分享,不加水的那种)

    JavaScript比较基础重要知识的思维导图分享给大家 希望能给大家提供帮助 用到的工具是xmind 思维导图是小M 自己学习后总结出来的 比较适合新手 比较推荐UU们自己构造一个属于自己的思维导图 对知识的理解和记忆会更有帮助 这里还有
  • LINK : warning LNK4068: /MACHINE not specified; defaulting to IX86

    win32下汇编程序开发时 当连接时出现 LINK warning LNK4068 MACHINE not specified defaulting to IX86 这样的警告 解决方式 link subsystem windows mac
  • Linux下yum命令

    Yum 全称为 Yellow dog Updater Modified 是一个在Fedora中的Shell前端软件包管理器 基於RPM包管理 能够从指定的服务器自动下载RPM包并且安装 可以自动处理依赖性关系 并且一次安装所有依赖的软体包
  • 代码评审工具Phabricator安装和部署

    1 安装 1 1 安装要求 Phabricator是一个LAMP应用套件 因此最基本的要求就是LAMP环境 Linux Linux的不同发行版及变种是必需的 MacOS X是一个可接受的Linux变种 Windows不是 Phabricat
  • 第二篇 AlexNet——模型精讲

    文章目录 摘要 1 创新点 2 模型结构 3 模型特点 4 Pytorch官方实现 摘要 AlexNet是由Alex Krizhevsky 提出的首个应用于图像分类的深层卷积神经网络 该网络在2012年ILSVRC ImageNet Lar
  • 什么是模式识别

    什么是模式识别 当我们人眼看到一幅画时 我们能够很清晰的知道其中哪里是动物 哪里是山 水 人等等 但是人眼又是如何识别和分辨的呢 其实很简单 人类也是在先验知识和对以往多个此类事物的具体实例进行观察的基础上得到的对此类事物整体性质和特点的认
  • (二叉树)二叉搜索树的查找、插入和删除

    1 二叉搜索树简介 二叉搜索树或者是一棵空树 或者是具有下列性质的二叉树 若它的左子树不空 则左子树上所有结点的值均小于它的根结点的值 若它的右子树不空 则右子树上所有结点的值均大于它的根结点的值 它的左 右子树也分别为二叉搜索树 二叉搜索
  • 孙燕姿谈“AI孙燕姿”:她的反应让人意外,深入体验揭示其背后的真相与潜力!

    目录 前言 AI歌手简介 AI歌手的技术原理 孙燕姿对 AI孙燕姿 的看法 结论 个人感受 一 你听过AI歌手的音乐呈现吗 作为听众你的感受如何 二 你认为这种新型演艺模式能否获得广泛的市场认可 原因是什么 三 你认为AI歌手会取代流行歌手
  • 第十三届蓝桥杯省赛 JAVA A组 - 矩形拼接

    个人博客 https blog csdn net Newin2020 spm 1011 2415 3001 5343 专栏地址 蓝桥杯题解集合 专栏定位 为想参加蓝桥杯的小伙伴整理常考算法题解 祝大家都能取得理想成绩 如果有收获的话 欢迎点
  • 【ChatGPT炒菜攻略】如何做韭菜

    ChatGPT可以化身为一名厨师 不仅有着扎实的厨艺基础和丰富的经验 而且也对食材的选取十分讲究 时常会寻找新鲜和有潜力的材料进行尝试和创新 从而创造出更加优秀和惊艳的佳肴 同时 我注重菜品的色 香 味 形均衡 追求将自然与文化相融合 以满
  • ip最长匹配mysql实现

    ip最长匹配计算 mysql使用inet aton函数实现 mask是ip的 select from select inet aton 10 181 88 1 inet aton mask inet aton prefix as match
  • Java程序跨平台原理

    平台 指的是操作系统 Windows Linux Mac 跨平台 Java程序可以在任一操作系统上运行 一次编写到处运行 原理 实现跨平台需要依赖Java的虚拟机JVM Java Virtual Machine Java程序 可以在Wind
  • win10 的图标丢失了怎么办?

    情况说明 几分钟前 自己手贱 居然一不小心把那D盘的分区表给删了 虽然说是借助DiskGenius即使找了回来 但是一个尴尬的情况出现了 原来装在D盘的程序虽然可以用 但是图标却没了 这对于有强迫症的我来说 让我浑身不舒服 解决方案 首先
  • java读取Excel —— XSSFWorkbook 找不到该类

    做一个Excel表格的读取时导入 org apache poi 包后居然提示 XSSFWorkbook 找不到 原来是还需要下载一个jar包 poi ooxml 包 之后在引入相关类即可 import org apache poi xssf
  • Window XP驱动开发(二十四) 电源管理

    转载自 http blog csdn net xxxluozhen article details 5023703 一 电源管理 1 WDM电源管理模型 在Windows 2000和Windows 98中 操作系统接管了大部分电源管理工作
  • (数据结构)1.实现图的邻接矩阵和邻接表的存储 2.实现图的遍历算法

    实验内容 1 编写一个程序graph cpp 设计带权图的邻接矩阵与邻接表的创建和输出运算 并在此基础上设计一个主程序exp8 1 cpp完成以下功能 1 建立如图8 54所示的有向图G的邻接矩阵 并输出之 2 建立如图8 54所示的有向图