【数据结构】— —邻接矩阵和邻接表存储图结构

news2024/9/23 15:30:23

🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

🐳Java基础:Java基础_IT闫的博客-CSDN博客

🐋c语言:c语言_IT闫的博客-CSDN博客

🐟MySQL:数据结构_IT闫的博客-CSDN博客

🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

💎C++:C++_IT闫的博客-CSDN博客

🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

🥏python:python_IT闫的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

🎯目的:

🎯内容:

🎯环境:

🎯步骤:

内容1——邻接矩阵

 邻接矩阵存储图代码:

内容2——邻接表

邻接表存储图代码: 


 

  🎃Hello,大家好,今天我们要做的是 邻接矩阵和邻接表存储图结构。

🎯目的:

1、掌握图结构的静态及操作特点;

2、掌握图结构的静态存储和常见操作在C语言环境中的实现方法;

3、掌握图结构的遍历算法在C语言环境中的实现方法。

4、理解求最小生成树、最短路径、关键路径的算法实现。

🎯内容:

1、会使用邻接矩阵的方式存储图片,并实现相应操作。

2、会使用邻接表的方式存储图片,并实现相应操作。

🎯环境:

TC或VC++。

🎯步骤:

要求:

内容1——邻接矩阵

(1)使用邻接矩阵的方式存储上边无向图;

(2)以矩阵的形式输出无向图;

(3)在邻接矩阵的基础上实现深度优先遍历和广度优先遍历。

 邻接矩阵存储图代码:

#include "iostream"
using namespace std;
#define MaxInt 0
#define MVNum 100
#define OK 1
typedef char VerTexType;
typedef int ArcType;
typedef int Status;
typedef struct{
	VerTexType vexs[MVNum];//顶点 
	ArcType arcs[MVNum][MVNum];//邻接矩阵 
	int vexnum,arcnum;//当前的点数和边数 
}AMGraph;
Status CreateUDN(AMGraph &G){
	cout<<"请输入总顶点数和总边数:"<<endl; 
	cin>>G.vexnum>>G.arcnum;//输入总顶点数和总边数
	cout<<"请输入各点的信息:"<<endl;
	for(int i=0;i<G.vexnum;i++)//输入各点信息 
		cin>>G.vexs[i];
	for(int i=0;i<G.vexnum;i++) //初始化邻接矩阵
		for(int j=0;j<G.vexnum;j++)
			G.arcs[i][j]=MaxInt;
	for(int k=0;k<G.arcnum;k++){
		int i,j,v1,v2,w;
		cout<<"请输入两个点的信息及权值:"<<endl;
		cin>>v1>>v2>>w;
		i=v1-1;j=v2-1;
		G.arcs[i][j]=w;
		G.arcs[j][i]=G.arcs[i][j];
	} 
	return OK;
}
int main(){
	AMGraph g;
	CreateUDN(g);
	cout<<"无向图邻接矩阵如下:"<<endl;
	for(int i=0;i<g.vexnum;i++){
		for(int j=0;j<g.vexnum;j++)
			printf("%5d",g.arcs[i][j]);
		cout<<endl;
 }	
}

内容2——邻接表

(1)使用邻接表的方式存储图;

(2)以邻接表的形式输出该图;

(3)(选做)实现深度优先遍历和广度优先遍历。

邻接表存储图代码: 

#include "iostream"
using namespace std;
#define MVNum 100
#define OK 1
typedef int OtherInfo;
typedef int Status;
typedef int VerTexType;
typedef struct ArcNode{//边结点 
	int adjvex;//该边所指向的顶点位置
	struct ArcNode *nextarc;//指向下一条边的指针
	OtherInfo info;//和边相关的信息 
}ArcNode;
typedef struct VNode//顶点信息 
{
	VerTexType data; 
	ArcNode *firstarc;//指向第一条依附于带顶点的边和指针 
}VNode,AdjList[MVNum];
typedef struct{
	AdjList vertices;
	int vexnum,arcnum;//图的当前顶点数和边数 
}ALGraph;
Status CreateUDG(ALGraph &G){
	cout<<"输入顶点数和总边数"<<endl;
	cin>>G.vexnum>>G.arcnum;
	cout<<"输入各点"<<endl;
	for(int i=0;i<G.vexnum;i++){//输入各点,构建表头结点
		cin>>G.vertices[i].data;
 		G.vertices[i].firstarc=NULL;
	}  
	for(int k=0;k<G.arcnum;k++)//输入各边,构造边表 
	{	int v1,v2,i,j;
		cout<<"请输入一条边依附的两个顶点:"<<endl; 
		cin>>v1>>v2;
		i=v1-1;
		j=v2-1;
		ArcNode *p1;
		p1=new ArcNode;
		p1->adjvex=j;//邻接点的序号为j;
		p1->nextarc=G.vertices[i].firstarc;
		G.vertices[i].firstarc=p1;
		ArcNode* p2=new ArcNode;
		p2->adjvex=i;
		p2->nextarc=G.vertices[j].firstarc;
		G.vertices[j].firstarc=p2;
	}
	return OK;
}
	Status PrintUDG(ALGraph G) {    //邻接表输出图
    for(int i = 0; i < G.vexnum; i++){     //遍历图中每一个点
        cout << i+1 << "(" << G.vertices[i].data << "):";    //输出当前点的标号和值
        ArcNode *p = G.vertices[i].firstarc;    //指向当前点的第一条边
        while(p) {      //输出与当前点相连的所有点的标号和值
            cout << p->adjvex + 1 << "(" << G.vertices[p->adjvex].data << ")" << "->";
            p = p->nextarc;
        }
        cout << "NULL" << endl;
    }
    return OK;
}
int main(){
	ALGraph g;
	CreateUDG(g);
	PrintUDG(g);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1131750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四章 文件管理 四、文件的物理结构(文件分配方式)

目录 一、文件块&#xff0c;磁盘块 二、连续分配 1、定义&#xff1a; 2、计算方式&#xff1a; 3、注意&#xff1a; 4、优点&#xff1a; 5、缺点&#xff1a; 6、总结 三、链接分配----隐式链接 1、定义&#xff1a; 2、如何实现逻辑块号转物理块号 3、优点&…

深入浅出排序算法之直接插入排序(拓展:折半插入排序)

目录 1. 图示解析 2. 原理解析 3. 代码实现 4. 性能分析 5. 折半插入排序&#xff08;拓展&#xff09; 直接插入排序和选择排序的第一趟就是第一个关键字 &#xff01; 1. 图示解析 2. 原理解析 整个区间被分为&#xff1a;① 有序区间&#xff1b;② 无序区间 每次选…

ES(elasticsearch) - 三种姿势进行分页查询

1. from size 浅分页 "浅"分页可以理解为简单意义上的分页。它的原理很简单&#xff0c;就是查询前20条数据&#xff0c;然后截断前10条&#xff0c;只返回10-20的数据。这样其实白白浪费了前10条的查询。 GET test_dev/_search {"query": {"bool&…

大模型训练框架

一文搞定分布式训练&#xff1a;dataparallel、distirbuted、deepspeed、accelerate、transformers、horovod - 知乎代码地址&#xff1a;taishan1994/pytorch-distributed-NLP: pytorch分布式训练 (github.com)pytorch-distributed-NLPpytorch单机多卡分布式训练-中文文本分类…

【HarmonyOS】元服务卡片展示动态数据,并定点更新卡片数据

【关键字】 元服务卡片、卡片展示动态数据、更新卡片数据 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现卡片中动态显示数据功能&#xff0c;并实现定时数据刷新。本篇文章通过实现定时刷新卡片中日期数据为例&#xff0c;讲述展示动态数据与更新数据功…

SLAM从入门到精通(基于ros的反光柱定位)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们看论文或者看书的时候&#xff0c;讲的最多的一般就是基于自然环境的定位。不管是激光雷达&#xff0c;还是视觉&#xff0c;其实本身还有很多…

公司电脑屏幕录制软件有什么功能

电脑屏幕录制软件有很多&#xff0c;今天简单说说说它的基础功能和附属功能&#xff1a; 基础功能&#xff1a; 1、屏幕录像 支持对所选电脑的屏幕进行录制&#xff0c;并且支持调整截屏频度、画面质量、单个视频时长等。 2、实时屏幕 可以对对方电脑进行实时屏幕查看&…

哥斯拉Godzilla使用中基于PHP的加密流量分析

转载于&#xff1a;https://blog.csdn.net/zlloveyouforever/article/details/129189396 哥斯拉Godzilla简介 据说是护网期间&#xff0c;各大厂商的waf不断在静态查杀、流量通信等方面对webshell进行拦截&#xff0c;众红队急需一款优秀的权限管理工具 , 虽说冰蝎3.0也不错 , …

MessagePassing分析与说明

1 Motivation 在图神经网络中&#xff0c;如何像在欧式空间一样进行卷积操作&#xff0c;其重要的问题在于如何更新当前位置的信息。 其每个位置&#xff08;或者叫节点node&#xff09;的更新方式如下所示。 这一个式子既可以表达GCN&#xff0c;也可以表达Edge Conv。 2 函…

wangeditor 富文本编辑器使用

使用环境vue3 ts &#xff0c;添加了字数限制 尝试了两种&#xff0c;使用方法类似&#xff08;参考文档&#xff09;&#xff0c;工具栏图标有不同&#xff0c;最后选用了第一种。 一、wangeditor 安装 npm i wangeditor --save 使用 这里封装了个简单组件 <templat…

浅谈AcrelEMS-GYM文体建筑能效管理解决方案-安科瑞 蒋静

1 概述 AcrelEMS-CA 文体建筑能效管理聚焦建筑的能量和信息的流向搭建平台解决方案。该系统解决方案集变电站综合自动化、电力监控、电能质量分析及治理、电气安全、能耗分析、照明控制、设备运维于一体。打破子系统孤立&#xff0c;配置方便&#xff0c;运维便捷&#xff1b;…

vue3.0运行npm run dev 报错Cannot find module node:url

vue3.0运行npm run dev 报错Cannot find module 问题背景 近期用vue3.0写项目&#xff0c;npm init vuelatest —> npm install 都正常,npm run dev的时候报错如下&#xff1a; failed to load config from F:\code\testVue\vue-demo\vite.config.js error when starting…

golang搭建http服务

golang环境搭建好之后,搭建htto服务 1.创建目录 创建main文件 创建成功,里面改成package main 终端执行操作创建好go.mod go mod init golang package golangimport ("fmt""net/http" )func sayHello(w http.ResponseWriter, r *http.Request) {_, _ fm…

TP4057替代DP4057 500mA线性锂离子电池充电器芯片

描述 DP4057是一款完整的单节锂离子电池带电池正负极反接保护采用恒定电流/恒定电压线性充电器。其SOT封装与较少的外部元件数目使得DP4057成为便携式应用的理想选择。DP4057 可以适合USB电源和适配器电源工作。 由于采用了内部PMOSFET架构&#xff0c;加.上防倒充电路&#xf…

基于机器视觉的12306验证码识别 计算机竞赛

文章目录 0 简介1 数据收集2 识别过程3 网络构建4 数据读取5 模型训练6 加入Dropout层7 数据增强8 迁移学习9 结果9 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的12306验证码识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向…

ES6之Set集合(通俗易懂,含实践)

Set是什么&#xff1f;它的方法有哪些&#xff1f;它在实例开发中有什么作用&#xff1f; 让我为大家介绍一下吧&#xff01; ES6提供了新的数据结构 Set(集合) 。它类似于数组&#xff0c;但成员的值是唯一的。 创建方法&#xff1a; let s new Set()console.log(s)它属于什…

使用时间潜在瓶颈网络进行图像分类

介绍 简单的循环神经网络(RNN)对学习 时间压缩表示表现出强烈的归纳偏差。方程 1显示了递推公式,其中h_t是整个输入序列 的压缩表示(单个向量)x。 方程 1:递推方程。(来源:Aritra 和 Suvaditya)另一方面,Transformers(Vaswani 等人)对于学习时间压缩表示几乎没有归…

探索随机森林: 机器学习中的集成学习神器

机器学习 第七课 随机森林 概述机器学习机器学习的主要分类监督学习无监督学习强化学习 集成学习提高准确性增强稳定性提升泛化能力 集成学习的主要方法BaggingBoostingStacking 随机森林的理论基础决策树的基本原理随机森林的生成过程随机森林的优势与局限性 随机森林的实际应…

IDEA 构建web项目-详细教程

1、创建一个新项目 1、点击File,选择New,然后点击Project 2、选择Empty Project,然后点击Next 3、新建一个项目 4、在新建完项目后&#xff0c;点击Finish后会弹出Open Project这个窗口&#xff0c;建议选择New Window 5、在Project Structure中选择Project Settings --> M…

rosbag记录与回放数据以及通过GMapping算法创建地图与导航

1、引言 通过前面几章的介绍&#xff0c;明白了ROS的工作原理&#xff0c;并且我们也能遥控机器人了&#xff0c;那机器人如何在实际环境中自主导航呢&#xff1f;要做到这点&#xff0c;机器人必须知道它自己在哪以及需要到哪儿去。 意味着&#xff0c;机器人需要有一个周围环…