邻接表c++实现及其操作讲解

C++中邻接矩阵、邻接表、链式前向星具体用法及讲解 邻接矩阵基本没用有边的数量就用链式前向星,否则就邻接表。 阅读详情
AI摘要

本文详细介绍了图数据结构的邻接表存储方式,包括边表结点和顶点表结点的定义,以及如何使用C++实现邻接表。文章通过具体代码示例,解释了创建和打印邻接表的过程,适合初学者理解图的存储结构。

图的邻接表存储方式

其中,边表中结点是与其相连的顶点表中结点的邻接点

边表结点

//边表结点 
typedef struct ArcNode{
	int Adjvex;//注意:这个索引值是边表节点自己在数组中的索引值,而不是和它连接顶点的下标。
	ArcNode* nextarc;//指向下一个邻接点
	int weight;  //如果是有权图的话加这条语句,没有就不用加
}ArcNode;

在实现最短路径算法(Dijkstra)时,会用到权值。在实现深度优先遍历(DFS)和广度优先遍历(BFS)时,不需要权值。

注意:

Adjvex是该邻接点自己在顶点表中的位置(顶点表中的数组索引值),而不是与其相连的顶点在顶点表中的位置,更不是该节点保存的数据。

//顶点表结点 
typedef struct VNode{
	VertexType data;//顶点保存的数据
	ArcNode* firstarc;//指向第一条依附该顶点的边的指针 
}AdjList[MAX_VERTEX_NUM];
typedef struct {
	AdjList vertices;//顶点数组
	int vexnum,arcnum; //图中的顶点数和边数
}ALGraph;

c++实现代码

// AdjacencyList.cpp: 定义控制台应用程序的入口点。
//
//有向无权邻接表
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>//malloc函数在stdlib库中 
using namespace std;

#define MAX_VERTEX_NUM 20
#define VertexType int

//边表结点 
typedef struct ArcNode{
	int Adjvex;//注意:这个索引值是边表节点自己在数组中的索引值,而不是和它连接顶点的下标。
	ArcNode* nextarc;
	int weight;  //如果是有权图的话加这条语句,没有就不用加
}ArcNode;

//顶点表结点 
typedef struct VNode{
	VertexType data;
	ArcNode* firstarc;
}AdjList[MAX_VERTEX_NUM];

typedef struct {
	AdjList vertices;
	int vexnum,arcnum; 
}ALGraph;

void PrintLink(ALGraph* g, ArcNode* next);
void CreateAL(ALGraph* g);
void disp(ALGraph* g);

int main(void) {
	ALGraph* g = (ALGraph*)malloc(sizeof(ALGraph));//创建邻接表
	CreateAL(g);//屏幕打印邻接表
	disp(g);
	system("pause");
	return 0;
}
/*创建邻接表函数,参数为一个邻接表变量
该函数将提示用户输入创建一个邻接表所需要的关键信息,
包括图中节点个数,边的个数,每个节点存储的数据,每条边两边节点的索引值*/
void CreateAL(ALGraph* g){
	int end, start;
	cout << "请输入结点数和边数:"; 
	cin >>g->vexnum
		>>g->arcnum;
	cout << "请输入每个顶点保存的数据:" << endl;
	for (int i = 0; i < g->vexnum; i++) {
		cout << "vertex" << i << ":";
		cin >> g->vertices[i].data;
		g->vertices[i].firstarc = NULL;//初始化时一定要让每个顶点的指针域为NULL,否则不会默认为NULL
	}
	cout << "请输入每条边的两个顶点在数组中的下标(中间用空格分隔)" << endl;

	for (int j = 0; j < g->arcnum; j++) {
		cout << "请输入第" << j << "条边:" << endl;
		cin >> start >> end;
		ArcNode* node = (ArcNode*)malloc(sizeof(ArcNode));
		node->Adjvex = end;
		node->nextarc = g->vertices[start].firstarc;
		g->vertices[start].firstarc = node;
	}
	
} 
/*打印创建好的邻接表函数,接收一个邻接表指针变量
该函数将打印每个顶点以及与其相连的顶点中保存的数据*/
void disp(ALGraph* g) {
	cout << "邻接表为:" << endl;
	for (int i = 0; i < g->vexnum; i++) {
		cout << g->vertices[i].data << " " ;
		PrintLink(g, g->vertices[i].firstarc);
	}
}
/*打印链表函数,接收一个邻接表指针变量,和边表节点指针变量
该函数专门用于打印邻接表中链表的节点数据*/
void PrintLink(ALGraph* g ,ArcNode* next) {
	while (next != NULL) {
		cout << g->vertices[next->Adjvex].data<<" ";
		next = next->nextarc;
	}
	cout << endl;
}



运行结果

注意:

g->vertices[i].firstarc = NULL;//初始化时一定要让每个顶点的指针域为NULL,否则不会默认为NULL

问题

typedef 取别名为什么不在最开始起名的时候,就用别名。

基于邻接表的Prim算法与Kruskal算法实现(C++) 基于邻接表实现Prim算法与Kruskal算法(C++实现) 阅读详情

相关推荐

c++ 数据结构 图的应用(实现图的深度优先和广度优先遍历)——以邻接表为存储结构

数据结构实习——图及应用(图的遍历) 一、问题描述 很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示无向图的遍历操作。 二、基本要求 以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 三、实现提示 设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2...

Arana的博客 1万+

邻接表详解(C/C++)

一、概念 二、分类 1)无向图的邻接表 2)有向图的邻接表(出弧) 3)有向图的逆邻接表(入弧) 三.步骤 四、代码

莫浅子的博客 4万+

c++实现邻接表(附完整源码)

c++实现邻接表(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 519

c++数据结构:图(邻接表)

想更容易的找到入度的话,可以构建逆邻接表:(指向反转)邻接表是图的一种链式结构。

qq_45303986的博客 3184

C++实现邻接表数据结构与图算法实战

邻接表的核心思想是将图中的每个顶点与其相邻顶点通过链表或容器形式组织起来。与邻接矩阵不同,邻接表不存储所有顶点之间的连接关系,而是仅记录存在的边,因此在空间效率上具有显著优势。int dest;// 邻接点编号int weight;// 边的权重(可选)// 指向下一个邻接点int V;// 顶点数// 邻接表数组} Graph;int V = 5;// 顶点数邻接矩阵适合边数较多的图,操作简单,查询效率高。邻接表适合边数较少的图,空间效率高,适合动态图结构。

weixin_31749299的博客 1188

C++实现有向图的邻接表表示

本文实例为大家分享了C++有向图的邻接表表示,供大家参考,具体内容如下 一、思路: 有向图的插入有向边、删除边、删除顶点和无向图的有区别。其他的和无向图的类似。 1.插入有向边 只需要插入边就行,不需要插入对称边 2.删除边:  只需要删除边就行,不需要仔找对称边进行删除。 3.删除顶点v: 首先,要在邻接表中删除以v为头的边; 同时,也要在邻接表中删除以v为尾的边, 不能通过对称边来找,只能一个个顶点找,浪费时间。 二、实现程序: 1.DirectedGraph.h:有向图

C++中用邻接表模拟稀疏图

  C++中稠密图用邻接矩阵g[N][N],稀疏图用邻接表(如下) const int N = 1e6;//图结点数 const int M = 1e6;//图中边数 int head[N], e[M], ne[M], w[M], idx; //head[N]存储每个结点的单链表 //e[M]存储边a->b中的b //ne[M]存储a->b a->c中的c //w[M]存储边的权重 //idx当前用到了的链表结点下标 邻接表的加边模板为, //a->b,权重为c void add(

YMWM_的博客 486

避坑指南:Dify+Docker+Ollama离线部署实战与疑难解析

本文详细解析了在国产化系统(如银河麒麟V10)内网环境中,如何从零开始离线部署Dify、Docker与Ollama的全栈AI应用开发平台。文章重点拆解了Docker安装中的“没有Release文件”和“GPG密钥错误”等典型报错解决方案,并提供了Ollama离线模型导入与Dify连接配置的完整实战指南,旨在帮助开发者高效完成本地部署,避开常见陷阱。

dd012的博客 464

图的存储之邻接表

1、稀疏矩阵 有一个稀疏因子,这是节省空间的一种存储方式。2、邻接表 以邻接矩阵存储图结构的话,当实际边数远远小于图的最大边数时,将会存储很多0,势必造成存储空间的巨大浪费;这时,就必须将邻接矩阵该用为邻接表;将邻接矩阵各行组织为一个单链表,类哈希的存储结构。存储结构(控制头):intmaxVertices;//最大顶点数 intcurVertices;//当...

weixin_34311757的博客 143

Diffix3D+复现

上下载模型,将其放在一个目录中,并将目录名填在demo代码中from_pretrained的cache_dir参数里。目录结构应该是"<PATH>/nvidia/difix/…给的requirements文件中pytorch和xformers的版本没有指定,这里测试过以下版本,可以成功运行。将readme中的demo代码新建一个python脚本复制进去,然后将脚本放在src目录中运行。如果遇到网络问题无法加载huggingface上的预训练模型,可以手动从。如果出现,以下错误重新。

NeverMakeIt的博客 1085

图像去畸变(相机成像、畸变模型)

首先通过上一步相机标定得到畸变参数和相机内参,同时,由于图像去畸变都是在归一化相机坐标系下进行的,而图像都是像素坐标,所以需要先通过相机内参矩阵将图片上的像素点从像素坐标系转变到归一化坐标系,再通过畸变参数在归一化坐标上进行去畸变的操作。由于畸变是发生在世界点通过透镜投影到相机坐标系这个过程中的,所以去畸变操作是在相机坐标系下进行的。(如图,Pd即为畸变后成像点)3.读取图像和各个参数,调用去畸变函数(opencv自带的cv.undistort函数),就可以完成对图像的去畸变处理,进而得到去畸变的图像。

lm5688jjupm1n28的博客 1051

算法总结2——拓扑排序

将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列,就是拓扑排列。在C++语言中,我们可以使用邻接表来表示有向图。例如,一个项目包括A、B、C、D四个子部分来完成,并且A依赖于B和D,C依赖于D。现在要制定一个计划,写出A、B、C、D的执行顺序。这时,就可以利用到拓扑排序,它就是用来确定事物发生的顺序的。一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动(activity)。在整个工程。

xiaofu123456789_的博客 1890

串口调试神器诞生记:我是如何用Cursor+AI自动生成C#上位机的(含VSCode插件清单)

本文详细介绍了如何利用Cursor和AI技术快速开发C#上位机程序,实现高效的串口通讯调试。从开发环境搭建到代码自动生成,再到性能优化和功能增强,全面展示了AI辅助开发在串口调试中的实际应用和显著效率提升。

weixin_28340315的博客 300

图的建立和遍历

2.深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点,可以这样理解:每次都在访问完当前结点后首先访问当前结点的第一个邻接结点。顶点表实际上就是一个结构体数组,结构体中包含顶点的数据,指向边表的第一个元素的指针;对于图G中的每个 Vi,将所有邻接于Vi的顶点Vj链成一个单链表a,这个单链表就称为顶点Vi的邻接表,再将所有点的邻接表表头放到数组中,就构成了图的邻接表。

2302_79856408的博客 274

ipsec 加密流程(一):ipsec策略匹配

《openswan》专栏系列文章主要是记录openswan源码学习过程中的笔记。 Author: Toney Email: vip_13031075266@163.com Date: 2020.11.22 Copyright: 未经同意不得转载!!! Version:2.6.51.5 Reference:https://download.openswan.org/openswan/ 1. ipsec策略匹配流程(ipsec_tunnel_start_xmit) 注:open...

遇见你是我最美丽的意外 9121

ESP32S3接入讯飞在线语音识别教程及配套源代码

本文介绍了如何使用ESP32-S3开发板实现讯飞在线语音识别功能。首先,需要准备硬件设备,包括ESP32-S3开发板、麦克风模块、MicroSD卡模块和扬声器模块。接着,安装Arduino IDE并配置ESP32-S3开发环境,注册讯飞开放平台账号并获取API凭证。然后,通过I2S接口连接麦克风模块,并编写代码实现语音录制、Base64编码、API请求和识别结果处理。代码包括初始化WiFi、麦克风、系统时间,以及录制语音、发送请求、解析响应等功能。最后,通过按键触发录音,并将识别结果输出到串口。

2401_88800025的博客 746

STL(部分)

STL对个人常用进行整理学习

weixin_45662804的博客 519

OpenOCD入门到精通:第28章 综合实战:RISC-V 调试

RISC-V调试实战摘要 本文介绍了RISC-V调试规范及其在OpenOCD中的实现。主要内容包括: RISC-V Debug规范的两个版本(0.11和0.13)及其差异,OpenOCD通过自动检测DTMCS寄存器版本号选择对应驱动实现。 RISC-V调试架构的分层设计,包含DTM、Debug Module、Program Buffer等核心组件,以及三种内存访问方式(progbuf、sysbus、abstract)。 以GD32VF103为例的实战调试配置,包括硬件连接、OpenOCD配置文件编写和GDB

从事嵌入式linux android驱动开发,拥有全栈能力 282

数组模拟链表(链式前向星),存储单链表,树,图

算法——链表、树、图的存储

CegghnnoR的博客 1243

计算机组成原理(第三版)唐朔飞-第一章第二章-课后习题

计算机组成原理

weixin_45735391的博客 7万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数据结构书上算法

数据结构书上关键算法 顺序表的存储结构 #define MAXSIZE 100 //顺序表可能达到的最大长度 typedef struct { ElemType *elem; //存储空间的基地址 int length; //当前长度 }SqList; //顺序表的结构类型为SQList 顺序表的操作 顺序表的初始化 Status InitList(SqList &L){ //构造一个空的顺序表L L.elem = new ElemType[MAXSIZE]

爵主 的博客 724

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

❤️详解「 邻接表 」原理、算法实现及其深度优先遍历、广度优先遍历(C/C++描述)

图的表示:邻接表 邻接表结构原理 在邻接列表实现中,每一个顶点会存储一个从它这里开始的相邻边的列表。比如,如果顶点 B 有一条边到 A、C 和 E,那么 A 的列表中会有 3 条边。 邻接列表只描述指向外部的边。B 有一条边到 A,但是 A 没有边到 B,所以 B 没有出现在 A 的邻接列表中。 查找两个顶点之间的边或者权重会比较费时,因为遍历邻接列表直到找到为止。 邻接表的数据结构 typedef struct _EdgeNode//与结...

陈子青的博客 2万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【C++】邻接表

通常用vector其中maxn是节点数量的最大值,adj[v]表示节点v的所有邻居组成的列表。

Dust的博客 1295

C++ vector实现邻接表存图

C++ vector实现邻接表存图

Curz酥的博客 4779

采用邻接表表示法创建无向图

//采用邻接表表示法创建无向图 #include <iostream> using namespace std; #define MVNum 100 //最大顶点数 #define OK 1 typedef char VerTexType; //-==顶点信息 typedef int OtherInfo; //和边相关的信息 //- - - - -图的邻接表存储表示- - - - - typedef struct A

qq_47142993的博客 1万+

数据结构与算法一些笔记

笔记

weixin_48591705的博客 317
上一篇: matlab的polyfit,polyval,lsqcurvefit拟合函数
下一篇: DFS深度优先遍历算法详解与实现
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值