图的相关种类

news2024/12/27 4:38:45

目录

数据类型

存储结构

邻接矩阵表示法

无向图

邻接矩阵表示

有向图

实现

邻接矩阵表示

存储结构

创建无向图

优点

缺点

邻接表法表示

表示无向图

表示有向图

存储结构

无向网

特点

十字链表与多重表

十字链表

存储结构

多重表

存储结构


数据类型

存储结构

邻接矩阵表示法

无向图

无向图的度=矩阵中非0元素个数和的一半 

邻接矩阵表示

有向图

因此,有向图的度为矩阵中非0元素个数总和

实现

邻接矩阵表示

存储结构

创建无向图

优点

缺点

邻接表法表示

表示无向图

表示有向图

示例

存储结构

先表示出所有边结点,再将边结点组成链表连接到各个对应顶点上。

示例

无向网

特点

十字链表与多重表

十字链表

为解决有向图求度不方便的问题

存储结构

firstin表示以data为弧头(终点,即指向data顶点-入)的边,firstout表示以data为弧尾(起点-出)的边。

tailvex表示弧的弧尾(起点)顶点序号,headvex表示弧的弧头(终点)顶点序号,

hlink指向下一个弧头相同的弧,tlink指向下一个弧尾相同的弧。

先列出所有弧,再连接到顶点。

多重表

存储结构

相关代码

#include <iostream>
using namespace std;
//图的存储

//1.邻接矩阵存储:边数+顶点数+顶点表-一维+边表-二维
#define maxn 20
#define infi 33333333 
//类型定义 
typedef struct {
	char vexs[maxn];//顶点表 
	int arc[maxn][maxn];//边表 
	int vexnum,arcnum;//顶点数与边数 
}adjgraph;
//创建无向图
//1.输入边数与顶点数,初始边表-无穷 
//2.输入顶点,为顶点表赋值 
//3.输入边的顶点及权值,为边表赋值:需要先确定顶点的下标才能确定边 
int getvex(adjgraph *g,char v){
	for(int i=1;i<=g->vexnum;i++)
		if(g->vexs[i]==v) return i;
	return 0;
}
//后期实现!!!! 
//void print(adjgraph *g){
//	for(int i=1;i<=g->vexnum;i++)
//		if(g->vexs[i]==v) return i;
//} 
void create(adjgraph *g){
	char vex1,vex2;//存储边的顶点 
	int weigh;//存储边的权值 
	int  v1,v2;//存储边的下标 
	cout<<"输入顶点数及边数:"<<endl;
	cin>>g->vexnum>>g->arcnum;
	for(int i=1;i<=g->vexnum;i++){//初始边表 
		for(int j=1;j<=g->arcnum;j++){
			g->arc[i][j]=infi;
    	} 
	}
    for(int i=1;i<=g->vexnum;i++){//存储顶点信息 
    	cout<<"请输入第"<<i<<"个顶点信息:\n";
    	cin>>g->vexs[i];
    }
    for(int j=1;j<=g->arcnum;j++){//存储边表信息 
    	cout<<"请输入第"<<j<<"条边的顶点信息:\n";
    	cin>>vex1>>vex2;
    	cout<<"请输入第"<<j<<"条边的权值:\n";
    	cin>>weigh;
    	v1=getvex(g,vex1);
    	v2=getvex(g,vex2);
    	g->arc[v1][v2]=weigh;//单向
		g->arc[v2][v1]=weigh;//双向-无向图 
	}
}

//2.邻接表表示:顶点表+顶点数+边数 
//顶点表:顶点信息+第一条边结点
//边结点:顶点编号+边权+下一条边
int getvex2(adjlist &g,char v){
	for(int i=1;i<=g.vnum;i++)
		if(g.vex[i].vex==v) return i;
	return 0;
}
typedef struct acrnode{//边结点 
	int adjacr;//记录邻接顶点编号-弧尾 
	int weigh;//权值 
	acrnode *next;//有相同弧头顶点的下一个边结点 
}acrnode; 
typedef struct vnode{//顶点类型 
	char vex;
	acrnode *first;
}vnode; 
typedef struct {//邻接表 
	int vnum,acrnum;
	vnode vex[maxn];//顶点表 
}adjlist;
void create(adjlist &g){
	char v1,v2;
	int  vex1,vex2;
	acrnode n,m; 
	//1.输入顶点数、边数
	cin>>g.vnum>>g.acrnum; 
	//2.初始邻接表:输入顶点,初始顶点表头指针为空
	for(int i=1;i<=g.vnum;i++){
		cin>>g.vex[i].vex;
		g.vex[i].first=NULL;
	}
	//3.输入边顶点,构造边结点,记录弧头与弧尾顶点,头插边表
	for(int i=1;i<=g.acrnum;i++){
		cin>>v1>>v2;
		vex1=getvex2(g,v1);//弧尾 
		vex2=getvex2(g,v2);//弧头
		n=new acrnode;//构造边结点
		//记录边v1->v2; 并插入到顶点v1的边表中 
		n->adjacr=vex2;//存储邻接v1的顶点v2的编号 
		n->next=g.vex[vex1].first;//下一个边结点存储原来v1顶点的第一个边结点
		g.vex[vex1].first=n;//更新v1顶点的第一条边为n,实现插入 
		//记录边v2->v1:新边结点结构-左边记录邻接指点编号  权值   右边记录具有同样以v2为弧尾的下一条边结点 
		m=new acrnode;
		m->adjacr=vex1;//记录邻接v2的顶点v1的编号
		m->next=g.vex[vex2].first;//下一个边结点存储v2指向的第一个边结点 
		g.vex[vex2].first=m;//更新顶点v2的第一条边结点,实现插入 
	} 
}

//3.十字链表表示:弧结点+顶点结点==>顶点表+弧数+顶点数-解决有向图找出入度的问题
//弧结点 
typedef struct acrnode{
	int tailvex,headvex;//弧头+弧尾编号
	struct acrnode *tailacr,*headacr;//分别具有相同弧头和弧尾的下一条弧结点 
}arcnode;
typedef struct vexnode{
	char data;//顶点信息 
	acrnode *tail,*head;//以顶点为弧尾或为弧头的弧结点 
}vexnode; 
typedef struct node{
	int vnum,acrnum;
	vexnode v[maxn];
};

//4.多重表:顶点结点+边结点==>顶点表+边数+顶点数-解决无向图重复存边的问题
typedef struct acrnode{
	int tailvex,headvex;//组成边结点的两顶点编号 
	struct acrnode *tailacr,*headacr;//与边结点顶点相同的边结点 
	int weigh;//边的权重 
}; 
//顶点结点:顶点信息+指向第一条边的指针 
typedef struct vexnode{
	char data;
	acrnode *first;//第一条边结点 
}; 
typedef struct node{
	int vnum,vacr;
	vexnode v[maxn];//顶点表 
}; 
int main(){
	adjgraph g;
	create(&g);
	return 0;
} 

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

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

相关文章

IDEA使用阿里通义灵码插件

在这个AI火热的时代&#xff0c;纯手工写代码已经有点out了&#xff0c;使用AI插件可以帮我们快速写代码&#xff0c;起码能省去写那些简单、重复性的代码&#xff0c;大大提高编码效率&#xff0c;在这里我推荐使用阿里的通义灵码 注册安装 安装注册好后&#xff0c;打开我们…

室内外融合定位是如何做到成为定位领域的新宠

在信息化高速发展的今天&#xff0c;定位技术已成为人们生活和工作中不可或缺的一部分。随着物联网、智慧城市等领域的蓬勃发展&#xff0c;传统的单一定位方式已无法满足复杂多变的环境需求。在这样的背景下&#xff0c;室内外融合定位技术应运而生&#xff0c;以其独特的优势…

海南聚广众达电子商务咨询有限公司正规吗?

在数字经济的浪潮下&#xff0c;海南聚广众达电子商务咨询有限公司凭借其对抖音电商领域的深刻洞察和专业服务&#xff0c;成为引领行业新风尚的佼佼者。公司不仅具备丰富的电商运营经验&#xff0c;更有一支高效、创新的团队&#xff0c;致力于为品牌商家提供全方位的电商解决…

《数学学习与研究》投稿难度大吗?

《数学学习与研究》杂志的投稿难度相对适中。 一方面&#xff0c;它作为一本有一定影响力的数学专业期刊&#xff0c;对稿件的质量有一定要求。论文需要具备一定的创新性、科学性和逻辑性&#xff0c;研究内容要具有一定的价值和深度。 另一方面&#xff0c;与一些核心期刊相…

小红书笔记怎么发浏览量高?建议收藏

如何让自己的小红书笔记脱颖而出&#xff0c;赢得高浏览量&#xff1f;本文伯乐网络传媒将从内容编辑、提高曝光度方面&#xff0c;为你揭秘小红书笔记创作的技巧。 一、文字内容编辑技巧 1.优化笔记标题和封面 &#xff08;1&#xff09;标题关键词设置 一个好的标题决定了…

国密SSL证书与传统SSL证书的区别

随着网络技术的飞速发展&#xff0c;网络安全问题日益凸显。在保护数据传输安全、防止数据泄露和篡改方面&#xff0c;SSL证书扮演着至关重要的角色。国密SSL证书作为一种遵循国家标准技术规范并参考国际标准的SSL证书产品&#xff0c;近年来受到越来越多的关注。本文将详细介绍…

13. ESP32-HTTPClient(Arduino)

使用ESP32 Arduino框架的HTTPClient库进行HTTP请求 在ESP32开发里&#xff0c;网络通信是挺重要的一部分&#xff0c;你可能需要从服务器拿数据啊&#xff0c;或者把传感器数据发到云端什么的。不过别担心&#xff0c;ESP32 Arduino框架给我们提供了HTTPClient库&#xff0c;让…

电子纸在日化行业的全新应用

电子纸在日化行业的全新应用 项目背景 在一日化龙头企业他们的洗衣粉产线在AGV小车取料到运输到产品包装工序时&#xff0c;因为取料粉车无明显区分标识&#xff0c;但是产品系列有十大类。在未采用晨控电子纸之前现场采用一个转盘分为十个区域&#xff0c;取料工序上方会有一…

2024-06-06 问AI: 在深度学习中,什么是欧几里德长度?

文心一言 在深度学习中&#xff0c;欧几里德长度&#xff08;也称为欧几里得距离或欧氏距离&#xff09;是一个常用的概念&#xff0c;它衡量的是在多维空间中两个点之间的真实距离&#xff0c;或者说是向量的自然长度&#xff08;即该点到原点的距离&#xff09;。以下是关于…

企业该如何选择GPU云服务器配置?

无论是个人开发者还是企业用户&#xff0c;对于如何选购最佳的云服务器配置&#xff0c;都是比较头疼与纠结的。因为GPU云服务器的配置众多&#xff0c;各种组合有各自优势与用途&#xff0c;很难一下子做出决策。接下来&#xff0c;我们来简单分析下各配置应该怎么选购。 1、地…

Linux C语言:指针和指针变量

一、指针的作用 使程序简洁、紧凑、高效有效地表示复杂的数据结构动态分配内存能直接访问硬件能够方便的处理字符串得到多于一个的函数返回值 二、内存、地址和变量 1、内存地址 2、变量和地址 1&#xff09;变量用来在程序中保存数据 比如: int k 58; //声明一个int变…

Dockershim 与 Containerd:两种容器运行时的故事

在不断发展的容器化世界中&#xff0c;两个关键组件经常被混淆&#xff1a;Dockershim 和 containerd。虽然它们在管理容器方面都发挥着重要作用&#xff0c;但它们的用途却截然不同。本文深入探讨了它们的功能&#xff0c;深入探讨了 Dockershim 和 containerd 之间的区别。 揭…

【前端】响应式布局笔记——自适应布局

自适应布局 自适应布局是不同设备对应不同的html(局部自适应)&#xff0c;通过判断设备的类型或控制局部的变化。 1、获取设备是移动端还是pc端 // 获取设备的信息let userAgent navigator.userAgent.toLowerCase();// 使用正则表达式来判断类型let device /ipad|iphone|m…

读书笔记分享

1.绝大多数父母都是爱孩子的&#xff0c;可他们却不是称职的父母。世界上任何职业都要培训、考核、竞争上岗&#xff0c;唯有“父母”这个职业是没有这些程序&#xff0c;只要生了小孩&#xff0c;就是天经地义的父母。 2.由于自身工作特点&#xff0c;“白领”们的部分器官和…

【Java数据结构】详解Stack与Queue(四)

&#x1f512;文章目录&#xff1a; 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.用队列实现栈 3.用栈实现队列 4.栈和队列存放null 5.总结 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友…

计算机网络-NAT配置与ACL

目录 一、ACL 1、ACL概述 2、ACL的作用 3、ACL的分类 4、ACL的配置格式 二、NAT 1、NAT概述 2、NAT分类 2.1 、 静态NAT 2.2 、 动态NAT 3、NAT的功能 4、NAT的工作原理 三、NAT配置 1、静态NAT配置 2、动态NAT配置 四、总结 一、ACL 1、ACL概述 ACL&#xff…

微服务框架下,因发送端与消费端的vhost不一致,导致rabbitmq出现严重的消息堆积

一、背景 在生产环境下&#xff0c;rabbitmq机器出现磁盘空间不足的报警&#xff0c;发现是某个队列的消息只有生产&#xff0c;迟迟没有消费。 可以得到的信息是&#xff1a; 队列queue是data_center_file_change_queue队列绑定的交换机是resourceChangeExchange&#xff0c…

基于深度学习的CT影像肺癌检测识别

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 肺癌是全球范围内导致癌症死亡的主要原因之一&#xff0c;早期检测和诊断对于提高患者生存率至关重要。随着深度学习技术的迅猛发展&#xff0c;基于CT影像的肺癌检测识别成为了研究热点。本文介绍…

水库安全监测系统:智慧水文动态监测系统

TH-SW2水库安全监测系统&#xff0c;作为一款智慧水文动态监测系统&#xff0c;其在现代水利管理中扮演着至关重要的角色。该系统通过集成先进的数据采集、传输、处理和分析技术&#xff0c;为水库的安全运行提供了强有力的技术支撑。 水库安全监测系统是一种用于实时监测和记…

【案例分享】印前制版工单系统:“鹿山科技”助力“铭匠数据”重塑业务流程

内容概要 本文介绍了鹿山信息科技通过明道云HAP平台的数字化解决方案提升了铭匠数据在印前制版行业的效率。周口铭匠数据科技有限公司位于河南省周口市沈丘县&#xff0c;是一家专注于印前制版设计服务的公司&#xff0c;成立于2023年。企业在销售业务、版材制作生产和美工设计…