16-数据结构-图的存储结构

news2024/11/26 18:33:48

简介:主要为图的顺序存储和链式存储。其中顺序存储即邻接矩阵的画法以及代码,邻接矩阵又分为有权图和无权图,区别就是有数据的地方填权值,无数据的地方可以填0或者∞,而有权图和无权图,又细分为有向图和无向图。无向图为对称矩阵,因为没有方向可言,出度入读一样。而有向图则有区分,对了,邻接矩阵横着看,是出度,竖着看是入读。链式存储中则包含邻接表、十字链表和邻接多重表,其中邻接表,有向图和无向图都可以,而十字链表是其邻接表有向图的优化,可以同时计算入读和出度,而邻接多重表,是邻接表无向图的优化,可以节约一半的边数空间,由原来的顶点数+2*总边数,变为了顶点数+总边数。

目录

一、顺序存储-邻接矩阵

1.1-简介

1.2-代码

1.3-运行结果

二、链式存储-邻接表

2.1邻接表

2.1.1.代码

2.2十字链表

2.2.1代码

2.3邻接多重表

2.3.1代码:


一、顺序存储-邻接矩阵

1.1-简介

图嘛,自然是包括了顶点和边。而邻接矩阵则是通过数组的形式,表示图。

其中需要一个一维数组,用来存储顶点的信息——顶点即一个单位像学生1,学生2之类的。

还需要一个二维数组,就是邻接矩阵,来存储顶点之间的关系;其次,则是记录,图中顶点数和边的总数。

我代码的思路,是自己想的,从创建到可以运行,如果遇到简单的,我后期再来改。

思路:

  1. 先初始化图,给图输入想要的顶点数和边数。其次初始化一维数组和二维数组。
  2. 创建以及输入数据,先给顶点的信息,输入顶点数组中。随后是进行判断,看是有向图还是无向图。(这里面默认是无权图)(有权图,只不过又多了一组需要手动输入的数字)。
  3. 无向图,是对称矩阵,输入想要的边的关系,即1与2,则邻接矩阵对应的直接改为1,表示两个点之间相连,同时更新对称位置也为1.
  4. 有向图。则是更新一个就行,另一个不更新。

1.2-代码

#include <stdio.h>
#define Max 10
#include <string.h>
//图的顺序存储_邻接矩阵
typedef struct
{
	char vertex[Max];    //存放顶点的一维数组 
	int  edge[Max][Max];	//表示顶点之间关系的二维数组; 
	
	int vertex_num;  //顶点数 
	int edge_num;    //边数 
	
}MGragh; 
//初始化邻接矩阵 
void InitMGragh(MGragh *a) 
{
	printf("添加几个顶点\n");
	int x;
	scanf("%d",&x); 
	//赋值	
	a->vertex_num=x;
	
	printf("有多少条边\n"); 
	int c; 
	scanf("%d",&c);
	//赋值 
	a->edge_num=c;
	//初始化邻接矩阵存储边信息的二维数组 
	a->edge[Max][Max];
	int p,q;
	for(p=0;p<a->vertex_num;p++)
	{
		for(q=0;q<a->vertex_num;q++)
		{
			a->edge[p][q]=0;
		}
	} 
	//初始化,顶点数组 
	a->vertex[a->vertex_num]='0'; 	
}
//打印邻接矩阵 
void PrintMGragh(MGragh *a)
{
	int p,q;
		for(p=0;p<a->vertex_num;p++)
		{
			for(q=0;q<a->vertex_num;q++)
			{
				
				printf("%d ",a->edge[p][q]);
			}
			printf("\n");
		} 
}
void Creat_MGragh(MGragh *a)
{
	printf("图的顶点数%d\n",a->vertex_num);
	int i=0;
	printf("请加顶点到顶点数组\n"); 
	for(i=0;i<a->vertex_num;i++)
	{	printf("i=%d\n",i);
		char x;
		x=getchar();
		char k;//由于单个字符输入,回车也在输入序列中,因此还需要一个变量,来吃掉回车 
		k=getchar();
		a->vertex[i]=x;
	}
	printf("您想弄成无向图还是有向图,1为无向图,2为有向图\n");
	int text;
	scanf("%d",&text);
	if(text == 1)
	{
		printf("请添加顶点间关系\n"); 
		
		int w=0;
		while(w!=2)
		{
			printf("哪个顶点和哪个顶点之间有联系\n");
			int d1,d2;
			scanf("%d %d",&d1,&d2);
			a->edge[d1-1][d2-1]=1;
			a->edge[d2-1][d1-1]=1;
			printf("是否还需要继续添加,是填1,否填2\n");
			scanf("%d",&w); 
		}		
	}
	else
	{
		printf("请添加顶点间关系\n"); 
		
		int w=0;
		while(w!=2)
		{
			int d1,d2;
			printf("从哪个顶点到哪个顶点\n");
			scanf("%d %d",&d1,&d2);
			a->edge[d1-1][d2-1]=1;
			printf("是否还需要继续添加,是填1,否填2\n");
			scanf("%d",&w); 
		}
	} 
}

int main()
{
	MGragh a;
	//初始化图 
	InitMGragh(&a);
	//创建邻接矩阵图 
	Creat_MGragh(&a); 
	//打印邻接矩阵 
	PrintMGragh(&a);
	return 0;
 } 

1.3-运行结果

二、链式存储-邻接表

2.1邻接表

        简介:邻接表,实际上主要为一个顶点表后面串着相应的边表。在记录总的边数和顶点数。

为链式存储。它适用于稀疏图,方便计算出度,只需要找到相应的顶点,然后通过该顶点的单链表,往后遍历串就行。但入读则需要遍历每个顶点单链表。

无向图,有向图都可以有向图,每个顶点传一个方向的,要么都弄出度,要么都能入读。所以它所需要的空间为O(顶点数+总边数);而无向图,则是与该顶点相连的,都穿起来,因此所需要的存储空间为O(顶点数+2*总边数)

2.1.1.代码

        边表ArcNode:包括该点下标和下一个指针域。

//边表 
typedef struct ArcNode
{
	int NodeName;
	struct ArcNode *next;
	
}ArcNode; 

         顶点表:存储图的各个顶点,每个顶点后面实际上是对应的从他出发的出度的单链表。

//顶点表
typedef struct
{
	int data;//顶点内容 
	ArcNode* first;	//顶点标的链的头指针 
	
}VNode;

        邻接表:最后才是邻接表,即只需要通过顶点表,就可访问其各个顶点的出度。

//创建邻接表,包含顶点表和边表,以及边数和顶点数的记录 
typedef struct
{
	VNode vertice[vertice_num];//顶点表,每个顶点标中的数据,串成一个对应的链 
	int vexnum;//顶点数 
	int edgenum;//边数	
}ALGragh; 

       由于实现的话,以我目前的水平,感觉有点麻烦,需要遍历每个顶点,每个顶点还需要创建边表结点,还需要给每个顶点单链表,形成,目前没思路,写到中间卡壳了,以后熟练了,再来补实现        

2.2十字链表

        简介:十字链表仅适用于有向图,为了弥补邻接表中有向图只能计算单向的度。

多了一些入读的信息。先给邻接表的形式,出度画出来。随后再找顶点表中各个顶点的入读,入0的入读,从0出发,看边表中,哪个终点为0,则连起来,没有则置为空。

        十字链表仍然是通过顶点表,即可遍历相应顶点的出度链和入读链,即可直到相应顶点的出度和入读。

2.2.1代码

//边表
typedef struct ArcNode
{
	int tailvex,headvex;//弧尾tail弧头head     弧尾(起点)->弧头(终点) 
	struct ArcNode *hlink,*tlink;//指针域,即出度指针域为弧头,入读指针域为弧尾,先连接弧头指针域,出度、再连接弧尾指针域 
	char info;//存储信息的指针 
}ArcNode; 
//顶点表
typedef struct VNode
{
	AreNode *firstin,*firstout;//出度入读头指针 
	int data;//顶点信息 
	
}VNode;
//十字链表
typedef struct GLGraph 
{
	VNode xlist[vertice_num];//顶点表 
	int vexnum,edgenum;//顶点数和边数 
	
}GLGraph;  

2.3邻接多重表

简介:邻接多重表仅适用于无向图,是邻接表中无向图,的优化,邻接表中无向图,会重复多连,2*总边数,而邻接多重表节约,为E。

画法:先画出顶点表和边表,边表中为与最左边顶点表中顶点相关的顶点,即边,为边的起点和边的终点,并有两个相关的指针域。第一步,先标记好相应的数值,自上而下画,下方顶点,若有重复的边,则不画。

//强连通机构的例题——不想自己画了,偷个懒

第二步,串链,由左边顶点表中的顶点出发,找右边边表中,与该顶点相同的指针域,连接上即可,如b的下标是2,从b出发,找右边边表中2的指针域。2的指针域第一行有一个,第二行有两个,给这三个串上即可。

2.3.1代码:

//邻接多重表-无向图
//边表
typedef struct AreNode
{
		int mark; //标记是否串过
		int ivex,jvex;//表示弧的两个顶点
		struct AreNode *ilink,*jlink;
		char info;//其他信息	
}AreNode;
//顶点表
typedef struct VNode
{
	int data;//顶点信息 
	AreNode *first;//指向边表中第一个挨着该顶点的结点 
	
}VNode;
//邻接多重表
typedef struct  AMLGraph
{
	VNode xlist[vertice_num];//顶点表 
	int vexnum,edgenum;//总边数和总结点数 
}AMLGraph; 

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

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

相关文章

阿里云服务器退款政策及退款流程解析

阿里云服务器如何退款&#xff1f;云服务器在哪申请退款&#xff1f;在用户中心订单管理中的退订管理中退款&#xff0c;阿里云百科分享阿里云服务器退款流程&#xff0c;包括申请退款入口、云服务器退款限制条件、退款多久到账等详细说明&#xff1a; 目录 阿里云服务器退款…

FPGA GTH 全网最细讲解,aurora 8b/10b协议,HDMI板对板视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTH 全网最细解读GTH 基本结构GTH 发送和接收处理流程GTH 的参考时钟GTH 发送接口GTH 接收接口GTH IP核调用和使用 4、设计思路框架视频源选择silicon9011解码芯片配置及采集动态彩条视频数据组包GTH aurora 8b/10…

【Java 基础篇】深入理解 Java 内部类:嵌套在嵌套中的编程奇妙世界

在 Java 编程中&#xff0c;内部类&#xff08;Inner Class&#xff09;是一个非常强大且灵活的概念&#xff0c;它允许在一个类的内部定义另一个类。内部类可以访问外部类的成员&#xff0c;包括私有成员&#xff0c;这使得内部类在许多编程场景中都非常有用。本篇博客将详细介…

js如何实现数组去重的常用方法

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Set&#xff08;ES6&#xff09;⭐ 使用 filter 和 indexOf⭐ 使用 reduce⭐ 使用对象属性⭐ 使用 includes 方法&#xff08;ES6&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方…

$ref属性的介绍与使用

在Vue.js中&#xff0c;$ref是一个特殊的属性&#xff0c;用于访问Vue组件中的DOM元素或子组件实例。它允许你直接访问组件内部的DOM元素或子组件&#xff0c;并且可以在需要时进行操作或修改。以下是有关$ref的详细介绍和示例演示&#xff0c;给大家做一个简单的介绍和概念区分…

库中是如何实现string类的?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

如何查看B站UP主数据?如何看懂B站数据?

bilibili是独特且稀缺的PUGC视频社区&#xff0c;拥有浓厚社区氛围的视频社区。有别于短视频&#xff0c;PUGC视频创作门槛高&#xff0c;视频内容更充实&#xff0c;bilibili是PUGC视频行业的领跑者&#xff0c;同时&#xff0c;bilibili拥有社区产品特有的高创作渗透率和高互…

SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server&#xff0c;Redis &#xff0c;Oracle ,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加微信号 l…

分类任务评价指标

分类任务评价指标 分类任务中&#xff0c;有以下几个常用指标&#xff1a; 混淆矩阵准确率&#xff08;Accuracy&#xff09;精确率&#xff08;查准率&#xff0c;Precision&#xff09;召回率&#xff08;查全率&#xff0c;Recall&#xff09;F-scorePR曲线ROC曲线 1. 混…

配置Jenkins

主要是配置Jenkins和jdk,maven的插件

Spring Cloud Alibaba Nacos配置导入问题解决方案

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

论文复现--lightweight-human-pose-estimation-3d-demo.pytorch(单视角多人3D实时动作捕捉DEMO)

分类&#xff1a;动作捕捉 github地址&#xff1a;https://github.com/Daniil-Osokin/lightweight-human-pose-estimation-3d-demo.pytorch 所需环境&#xff1a; Windows10&#xff0c;conda 4.13.0&#xff1b; 目录 conda环境配置安装Pytorch全家桶安装TensorRT&#xff08;…

[数据集][目标检测]裸土识别裸土未覆盖目标检测数据集VOC格式857张2类别

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;857 标注数量(xml文件个数)&#xff1a;857 标注类别数&#xff1a;2 标注类别名称:["luotu","n…

Python网络爬虫中这七个li标签下面的属性值,不是固定的,怎样才能拿到他们的值呢?...

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 愚以为宫中之事&#xff0c;事无大小&#xff0c;悉以咨之&#xff0c;然后施行&#xff0c;必能裨补阙漏&#xff0c;有所广益。 大家好&#xff0c;我…

Java8实战-总结21

Java8实战-总结21 使用流归约元素求和无初始值 最大值和最小值 使用流 归约 到目前为止&#xff0c;见到过的终端操作都是返回一个boolean(allMatch之类的)、void(forEach)或optional对象(findAny等)。也见过了使用collect来将流中的所有元素组合成一个List。 如何把一个流中…

r7 7840u和r7 7840hs差距 锐龙r77840u和r77840hs对比

锐龙7 7840U 采用Zen3架构、8核心16线程&#xff0c;基准频率疑似3.3GHz&#xff0c;同样集成RDNA3架构核显Radeon 780M&#xff0c;也是12个CU单元 r7 7840U 的处理器在 Cinebench R23 中多核跑分 14825 分 选r7 7840u还是 R7 7840HS这些点很重要 http://www.adiannao.cn/dy …

小红书笔记爬虫

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

codesys可视化

可视化有2种&#xff1a;本地和网页 触摸屏的话&#xff0c;属于网页。 1先配置IDE 如果有些控件&#xff0c;别人有&#xff0c;而你却没有&#xff0c;原因是&#xff1a;你库里没有引用。 比如缺少3D轨迹的控制面板&#xff0c;你需要库内引用 VisuStruct3DControl编译报错…

C 风格文件输入/输出 (std::fopen)(std::freopen)(std::fclose)

文件访问 打开文件 std::fopen std::FILE* fopen( const char* filename, const char* mode ); 打开 filename 所指示的文件并返回与该文件关联的流。用 mode 确定文件访问模式。 参数 filename-要关联文件流到的文件名mode-确定文件访问模式的空终止字符串 文件访问模式字…

sql:SQL优化知识点记录(十一)

&#xff08;1&#xff09;用Show Profile进行sql分析 新的一个优化的方式show Profile 运行一些查询sql&#xff1a; 查看一下我们执行过的sql 显示sql查询声明周期完整的过程&#xff1a; 当执行过程出现了下面这4个中的时&#xff0c;就会有问题导致效率慢 8这个sql创建…