数据结构——图-有向带权图的邻接表

图 - Java实现有向带权图的邻接表表示法 阅读详情
AI摘要

博客围绕C语言和数据结构展开,虽未给出具体内容,但可知涉及信息技术领域中用C语言实现数据结构相关知识。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#define VertexType char //顶点的数据类型(char) 
#define VertexMax 20 //最大顶点个数 

typedef struct ArcNode//边表 
{
	int adjvex;//存储的是该顶点在顶点数组即AdjList[]中的位置
	int weight; 
	struct ArcNode *next;
}ArcNode;

typedef struct VNode //单个顶点 
{
	VertexType vertex;
	struct ArcNode *firstarc;
}VNode;

typedef struct //顶点表 
{
	VNode AdjList[VertexMax];//由顶点构成的结构体数组 
	int vexnum,arcnum; //顶点数和边数 
	
}ALGraph;

int LocateVex(ALGraph *G,VertexType v)
{    
    int i;
	for(i=0;i<G->vexnum;i++)
	{
		if(v==G->AdjList[i].vertex)
		{
			return i;
		}
	}
	
	printf("No Such Vertex!\n");
	return -1;
}


void CreateDG(ALGraph *G)
{
	int i,j;
	//1.输入顶点数和边数 
	printf("有向带权图\n"); 
	printf("输入顶点个数和边数:\n");
	printf("顶点数 n="); 
	scanf("%d",&G->vexnum);
	printf("边  数 e="); 
	scanf("%d",&G->arcnum);
	printf("\n\n"); 

	//2.顶点表数据域填值初始化顶点表指针域 
	printf("输入顶点元素(需要用空格隔开):");
	for(i=0;i<G->vexnum;i++)
	{
		scanf(" %c",&G->AdjList[i].vertex);
		G->AdjList[i].firstarc=NULL;
	} 
	printf("\n");
	
	//3.输入边信息构造邻接表 
	int n,m;
	VertexType v1,v2;
	ArcNode *p1; 
	int value;
	printf("请输入边的信息(需要用空格隔开)包含边的两端和权值:\n\n"); 
	for(i=0;i<G->arcnum;i++)
	{   //输入边信息,并确定v1和v2在G中的位置,即顶点在AdjList[]数组中的位置(下标)  
		printf("输入第%d条边信息:",i+1); 
		getchar();
		scanf(" %c %c %d",&v1,&v2,&value);
		n=LocateVex(G,v1);
		m=LocateVex(G,v2);
		
		if(n==-1||m==-1)
		 {
		 	printf("NO This Vertex!\n");
		 	return;
		 } 
		
		p1=(ArcNode *)malloc(sizeof(ArcNode));
		p1->adjvex=m;//填上坐标 
		p1->weight=value;
		p1->next=G->AdjList[n].firstarc;//改链(头插法)  
		G->AdjList[n].firstarc=p1;
	}

} 
void print(ALGraph G)
{
	int i;
	ArcNode *p;
	printf("\n-------------------------------");
	printf("\n图的邻接表表示:\n");
	
	for(i=0;i<G.vexnum;i++)
	{
		
		printf("\n   AdjList[%d]%4c",i,G.AdjList[i].vertex);
		p=G.AdjList[i].firstarc;
		
		while(p!=NULL)
		{
			printf("-->%d权值[%d]",p->adjvex,p->weight);
			p=p->next;
		}
		
	 } 
	 printf("\n");
} 

void InsertVex(ALGraph *G,VertexType v)
{
	//向邻接表中添加一个新顶点
		
		G->AdjList[G->vexnum].vertex=v;
	
		G->AdjList[G->vexnum].firstarc=NULL;
		
		G->vexnum=G->vexnum+1;
}

void InsertArc(ALGraph *G,VertexType v,VertexType w)
{
	//添加一条新边到邻接表 
	int value;
	printf("输入这条边的权值:");
	scanf("%d",&value);
	ArcNode *p1; 
		int n,m;
	n=LocateVex(G,v);
	m=LocateVex(G,w);
		
	p1=(ArcNode *)malloc(sizeof(ArcNode));
		p1->adjvex=m;//填上坐标 
		p1->weight=value;
		p1->next=G->AdjList[n].firstarc;//改链(头插法)  
		G->AdjList[n].firstarc=p1;
		
	G->arcnum++;
 } 

void DeleteArc(ALGraph *G,VertexType v,VertexType w)
{
	//删除一条指定的边 
		int n,m;
	n=LocateVex(G,v);
	m=LocateVex(G,w);
		ArcNode *pre,*p;
		
		
	pre=G->AdjList[n].firstarc;
	p=pre->next;
	while(p!=NULL)
	{
		if(pre->next->adjvex==p->adjvex)
		{
			pre->next=p->next;
			free(p);
			break;
		}
		p=p->next;
		pre=pre->next;
	}
	G->arcnum--; 

}

void DeleteVex(ALGraph *G,VertexType v)
{
	int n;
	n=LocateVex(G,v);

	int arcn=0;
	ArcNode *p;
	p=G->AdjList[n].firstarc;
	while(p!=NULL)
	{
		p=p->next;
		arcn++;
	}
	
	
		G->AdjList[n].firstarc=NULL;
		
		
		
 	for(int i=n;i<G->vexnum-1;i++)
 	{
 		G->AdjList[i].firstarc=G->AdjList[i+1].firstarc;
 		G->AdjList[i].vertex=G->AdjList[i+1].vertex;
	 }
	 G->vexnum--;
	 G->arcnum=G->arcnum-arcn;
 } 

void choice(ALGraph *G)
{
	int i=0;
	int j=1;
	VertexType v,w;
	printf("[1]:添加的新顶点\n");
	printf("[2]:添加新边的两端结点\n");
	printf("[3]:删除边的两端结点\n");
	printf("[4]:删除的顶点(及其相关联的边)\n");
	printf("[5]:退出\n");
	while(j)
	{
		scanf("%d",&i);
	switch(i)
	{
		case 1:
				printf("输入要添加的新顶点:");
				getchar();
				scanf("%c",&v); 
				InsertVex(G,v);
				print(*G);
				break;
				
		case 2:
				printf("输入要添加新边的两端结点:");
				getchar();	
				scanf("%c %c",&v,&w); 
				InsertArc(G,v, w);
				print(*G);
				break;
		case 3:
				printf("输入要删除边的两端结点:");
				getchar();
				scanf("%c %c",&v,&w); 
				DeleteArc(G,v, w);
				print(*G);
				break;
		case 4:
				printf("输入要删除的顶点(及其相关联的边):");
				getchar();
				scanf("%c",&v); 
				DeleteVex(G,v);
				print(*G);
				break;
		case 5:
				j=0;
				break;
	
	}	
	}
	
	
	
 } 
int main() 
{
	ALGraph G;
	CreateDG(&G);
	print(G);
	

	

	choice(&G);

	
	
	
	
	
	return 0;
}
数据结构学习——图的邻接表(无向图,带权值有向图) 邻接表是数组与链表相结合的存储方法,相比于顺序存储结构(邻接矩阵),节省空间。 来个小例子(无向图): 图1 上图邻接表的结构: 邻接表用链表来存储邻接点(分两个域,一个存顶点下标,一个存下一个邻接点的引用),通过一个类(我用了内部类,所以是private)定义邻接点: private class AdgvexType { int verNum = -1;//存储顶点... 阅读详情

相关推荐

邻接表实现的有向带权图 及 图算法(C++)

邻接表(Adjacency List): 我实现的方法相当于加 邻接表是一个 Vertex类型的数组( adj = new Vertex[ ] )数组元素Vertex中有一个指向Edge对象的指针(相当于链表的头节点),用来存放与对应Vertex相连的边 前面 public 的结构体是后面一些成员函数的返回值(因为有的要返回多个值有点要用特定的方式处理返回值)和一些后面的算法会用到的(并查集)。没有边的 从输入流获取边的 2. 析构函数 就删除边和顶点对象 3. 深度优先遍历 接受一个参数为Verte

m0_52313753的博客 3729

数据结构与算法-图的存储结构

图的存储结构分为邻接矩阵和邻接表两种。 邻接矩阵 1.图的邻接矩阵 图的邻接矩阵为表示图的各顶点之间关系的矩阵。 设G=(V,E)是n个顶点的图,则G的邻接矩阵用n阶方阵G表示,若(Vi ,Vj )或< Vi ,Vj >属于E(G),则G[i][j]为1,否则为0。 通过观察图与邻接矩阵的关系,我们可以得出以下结论。 1.无向图的邻接矩阵是对称的。因为(Vi ,Vj )属于E(G),则 (Vj ,Vi)亦属于E(G)。 2.从邻接矩阵容易判断任意两顶点间是否有边相联,容....

分享前端工程化、AI 应用、Agent 开发与大模型实践! 2523

数据结构 图(Graph)

在数据结构中,是一种非常重要的数据结构,用于表示不同的对象之间的关系。

Johnny-He的博客 3652

数据结构——图

每种数据结构都有不同的用武之地,同样的图也不例外,下面我们就开始对图的研究吧。在线性表中,每个元素之间只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间是层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关。但这仅仅都只是一对一,一对多的简单模型,如果要描述多对多的复杂关系就需要图数据结构了!图的遍历方式包括深度优先搜索(DFS)和广度优先搜索(BFS),其中 DFS 使用递归或栈进行实现,而BFS则采用队列进行实现。

caoxuan666的博客 2612

【自己动手写数据结构】 -- 有向带权图的邻接矩阵存储的简单实现

/* * 带权图的邻接矩阵存储实现 * * 当G = 是一个带权图时,G的邻接矩阵中若顶点Vi到顶点Vj * 之间存在边,则将[i,j]赋值为此边的权值;若不存在边,则将[i,j] * 赋值为无穷大;而[i,i]的值为0 */ #include //定义10000为无穷大 #define MAXSIZE 10000 //定义最大的顶点数为30 #define vertexNum 30

"程序猿“的专栏 8422

邻接矩阵与邻接表互转详解:C语言实现有向带权图存储结构

图作为数据结构中的核心模型,广泛用于社交网络、路径规划等场景,而图的存储方式直接决定算法效率与内存开销。邻接矩阵以二维数组实现O(1)的邻接查询,但空间复杂度固定为O(n²);邻接表仅存储真实存在的边,在稀疏图中大幅节省内存,却牺牲了查询速度。工程实践中,两种结构常需按场景互相转换,以兼顾存储与操作需求。本文以C语言实现有向带权图的邻接矩阵与邻接表互转为例,从结构体定义、转换函数到头插法细节、哨兵值统一等关键问题逐一拆解,并针对自环、零权值等边界场景给出健壮性测试思路,帮助开发者透彻理解图存储结构的设计取舍

weixin_30402231的博客 329

数据结构——图-有向带权图的邻接表基础

#include <stdio.h> #include <stdlib.h> #define VertexType char //顶点的数据类型(char) #define VertexMax 20 //最大顶点个数 typedef struct ArcNode//边表 { int adjvex;//存储的是该顶点在顶点数组即AdjList[]中的位置 int weight; struct ArcNode *next; }ArcNode; typedef str..

qq_50675813的博客 1632

deepseek本地部署及应用部署指南

如果你找到的日志是[send] via NET/IB/0,则表示网络通信是通过IB网络的,但是没有开启GDRDMA技术,则会有大致5%的性能损耗(网传,未实测)。新增的环境变量配置,主要用于启用IB网络通信,而非使用以太网进行通信,详细的每一个参数的具体含义,可以在英伟达NCCL的官方网站上找到说明。下一步,我会对已经完成部署的模型进行压测,来探索系统的性能极限在哪里,以及如何在生产环境中何如进行进一步的性能优化,期待你的关注。

weixin_39797121的博客 2623

图的十字链表存储法:高效表示有向图与有向带权图

十字链表的概念及定义

m0_68805093的博客 947

经典脉冲激光测距原理&雷达方程

脉冲激光测距机的工作过程如下:首先用瞄准光学系统瞄准目标,然后接通激光电源,储能电容器充电,产生触发闪光灯的触发脉冲,闪光灯点亮,激光器受激辐射,从输出反射镜发射出一个前沿陡峭、峰值功率高的激光脉冲,通过发射光学系统压缩光束发射角后射向目标。通过计算激光发射功率经介质传输的衰减,目标表面截获和反射的光功率,到达接收视场的光功率,以及接收光学系统接收到的光功率,就可以得到到达光电探测器的光功率,即接收功率。⑤光東路程上的折射率变化;),测量光脉冲到达目标并由目标返回到接收机的时间,由此计算出目标的距离。

weixin_46153372的博客 2521

嵌入式系统(一):鸿蒙系统

本文为期末复习笔记,内容仅供参考???? 鸿蒙系统是一款面向万物互联时代的、全新的分布式操作系统 鸿蒙提出了基于同一套系统能力、适配多种终端形态的分布式理念 提供全场景(移动办公、运动健康、社交通信、指挥出行、媒体娱乐等)业务能力 华为是OpenHarmony开源项目的共建者、也是共享者之一 鸿蒙技术特性 分布式设计 一次开发,多端部署 系统与硬件解耦,弹性部署 三大分布式能力 分布式软总线 设备间互联互通提供分布式通信能力 从手动发现,进化成自发现 传输高带宽关键技术-极简协议 分布式数据管

weixin_45608532的博客 4306

数据结构之链表、邻接表

写在前面的话: 本菜鸟还是个c++的初学者(上手的是Java),数据结构还没有正式开始学,这些只是我平时闲着无聊自学一些新东西。有高手愿意指出错误,就很感激了。估计没有了,代码写的贼乱,自己都不想看。 链表 动态分配内存、指针实现。 #include<iostream> #include<string> #include<vector> using name...

SongyangJi 832

Openharmony 命令行工具hdc的获取与安装

OpenHarmony实战:命令行工具hdc安装应用指南_hdc工具-优快云博客t=N7T8。

Devlin_的博客 1万+

C语言实现图的邻接表

笔者通过纯C语言实现图的邻接表表示法 (单向有权图) 涉及操作有: 图顶点的 增 删 改 查 图边的 增 删 改 查 打印邻接表 迪杰斯特拉算法 求最短路径(包括中转节点的记录) 部分原理限于篇幅会做介绍,但关键在于自己搜寻资料学习 此博客目的在于分享心得 图的原理构造(篇末源代码也是复现如此结构)如下: 注意:此结构进行过改动,会与部分图书有出入。 因为涉及图顶点(节点)的增删改查,故对顶点的...

M_H_T__的博客 3038

Vue3 - 实现用户上传本地视频文件到服务器+上传进度条+暂停续传+中断取消上传等,视频上传后可在线播放预览已上传的视频,视频文件上传视频回显示例代码(支持Element、Antd等upload组件

实现视频上传和视频预览,vue3实现视频上传功能,上传视频回显,视频流上传播放功能,vue与axios上传视频并显示上传进度,upload组件实现视频文件上传视频回显,upload组件实现视频上传及进度条展示,视频上传及实时进度条显示,视频上传过程中如何中断上传,VUE3+element 上传视频,大文件分片上传+断点续传,axios大文件切片上传,Vue3上传视频后如何播放预览,上传本地视频到后端服务器及在线预览播放视频+移除视频+进度条上传,将已选视频上传服务端并可预览视频,详细实现选择视频并上传到服务

🏆 前端领域优质创作者 3113

100天精通Python(爬虫篇)——第118天:selenium自动化操作浏览器基础大总结

一、Selenium框架环境搭建 1. 下载模块 2. 安装浏览器驱动WebDriver 二、基础操作 1. 打开浏览器 2. 无界面模式 3. 元素定位 4. 元素操作 5. 前进后退 6. 执行js 7.页面等待 隐式等待(常用) 显式等待(了解) 三、进阶操作 1. 使用代理ip 2. 修改请求头 3. 隐藏指纹特征.....................

努力让自己发光,对的人才能迎着光而来 10万+

java邻接图_Java数据结构 - 图(邻接表存储)

邻接表相比邻接矩阵,邻接表要更加节省空间。邻接表存储本文将介绍邻接表存储有向带权图。图的例子如下。图介绍一下邻接表上面的图对应的邻接表如下图所示:邻接表前面的数组存储的是所有的顶点,每一个顶点后面连接的块代表前面顶点所指向的顶点和路线的权值。如果该点还指向其他顶点,则继续在块后面添加。例如A指向了B权值是4,那么A后面就加上一块,之后发现A还指向D权值是5,那么就在块尾继续添加一块。其实也就是数组...

weixin_33273250的博客 741

半导体物理基础:载流子输运理论_(4).载流子浓度与费米能级

费米能级(Fermi Level)是描述半导体中电子和空穴能量分布的基准能级。在绝对零度下,费米能级以下的所有能级都被电子占据,费米能级以上的所有能级都是空的。随着温度的升高,电子会获得足够的能量跃迁到费米能级以上的能级,形成导带中的自由电子和价带中的空穴。费米能级在半导体中的位置取决于掺杂浓度和温度。对于本征半导体,费米能级位于禁带的中心;对于掺杂半导体,费米能级会偏移,具体位置取决于掺杂类型和浓度。载流子浓度(Carrier Concentration)是指半导体中自由电子和空穴的数量密度。

2401_87715305的博客 831

数据结构 - 图(邻接矩阵、邻接表)

目录 1、图的概念 2、图的表示方式 1)、邻接矩阵 2)、邻接表 图是除了树之外的另一大类非线性表数据结构,应对到现实生活中有大量的应用,比如微博、微信、QQ等怎么表示其好友关系,关注、被关注(粉丝),亲密度等;地图出行,怎么查询到一个地方的最近距离,这些问题抽象算法都依赖底层的数据结构图。现在除了非关系型数据库、关系型数据库,还有图数据库抽象存储更复杂的现实模型。上面都没有图来的直接,先上图吧. 1、图的概念 树种的节点类比到图中叫顶点(Vertex),如上图中的A;顶...

it_lihongmin的博客 4594

基于Scrapy+Playwright的学术会议信息智能爬取系统实战

本文详细介绍如何使用Python构建一个高效的学术会议信息爬取系统,结合Scrapy框架和Playwright无头浏览器技术,实现对全球学术会议数据的自动化采集、清洗和存储。文章包含完整的技术方案设计、代码实现细节以及性能优化策略,可帮助读者快速掌握现代网络爬虫开发的核心技术。关键词:Python爬虫、Scrapy、Playwright、学术会议、数据采集、反爬对抗python复制下载。

2201_76125261的博客 710

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数据结构篇十四:图和图的存储

图 如何理解图? 前面我们学习了线性表,链表,树等基础数据结构,图这种数据结构就是它们的综合利用。我们都知道,图有边和顶点组成,图的知识点比较多,我这里只是简单从数据结构简要分析。 1.图的种类 根据方向:无向图和有向图 根据权值:无权图和有权图 2.图的术语 度:度的概念是针对图的顶点而言的,在无向图中,度表示某个顶点周围有几个顶点与其相连接,在有向图中,分为入度和出度的概念,入度表示该顶点周围多少个点指向自己,出度表示该顶点指向几个点 带权图:就是图中边上面的数据,描述边的附加信息。 联

Dzp199903的博客 1039

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

蛮力法/邻接表 广度优先 有向带权图 无向带权图

代码】蛮力法/邻接表广度优先有向带权图无向带权图。

求道问术 379

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

基础数据结构--邻接矩阵和邻接表

邻接矩阵是数学和计算机科学中常用的一种表示方式,用来表述 有向图 或 无向图。一张图由一组顶点(或节点)和一组边组成,用邻接矩阵就能表示这些顶点间存在的边的关系。

E___V___E的博客 1439

数据结构-图

本文简单介绍了数据结构-图

欢迎大家来到我的频道,我是一名数据开发+数据分析方向小鼠鼠,每天都会和大家分享很多知识,希望大家能多多点赞加关注哦。 982

邻接表图,增加、删除、修改功能全,还有一个双权的

刚刚考完,纪念一下,虽说不是考试提交的最终代码,但是是我提前准备的考试源码,供给考试使用。 前面的是单权 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <malloc.h> /* * 有向带权图 */ // 弧的结点结构体定义 typedef struct arcnode { int adjvex; //

qq_43774943的博客 778

图的表示与基础操作:邻接矩阵与邻接表的C语言实现

图由顶点集和边集构成,边可以是有向或无向的,且可带有权重。根据图的特性选择合适的存储结构至关重要,这直接影响到图的各种操作(如遍历、查找最短路径等)的效率。本文只对于代码做简单分享,不对代码的逻辑做深层解释,如果读者想知道代码的实现逻辑,请详细阅读代码中的注释部分。

Mrluo386的博客 2547
上一篇: 数据结构——图-有向带权图的邻接表基础
下一篇: 数据结构——图-最短路径长度中最大的一个
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值