当前位置: 首页 > news >正文

8. 数据结构——邻接表、邻接矩阵的基本操作

一、邻接表

1. 内容

2. 实现代码(直接可以复制使用)

//邻接表的相关操作
#include<bits/stdc++.h>
#define MVnum 100
#define OK 1
#define ERROR -1
using namespace std;typedef int Status; 
typedef char VerTexType;  //假设顶点的数据类型为char
typedef int ArcType;      //假设边的权值类型为int
bool visit1[MVnum];      //dfs的时候状态数组 
bool visit2[MVnum];      //bfs的时候状态数组 //定义结构体(边结点+头节点数组+相关信息)
//1.边结点
typedef struct ArcNode{int adjvex;  struct ArcNode *nextarc;
}ArcNode;//2.头结点数组 
typedef struct VNode{VerTexType data;ArcNode *firstarc;
}VNode,AdList[MVnum]; typedef struct{AdList vertices;int vexnum,arcnum;  //图当前的顶点数、边数 
}ALGraph; //查找顶点值在图中存储的位置 
Status LocateVex(ALGraph G,VerTexType v){for(int i=0;i<G.vexnum;i++){if(G.vertices[i].data==v)return i;}return -1;  //表示未找到 
}//1.创建有向图
Status CreateDG(ALGraph &G){VerTexType v1,v2;  //临时值 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 i=0;i<G.arcnum;i++){cout<<"请输入两个邻接的点:"<<endl; cin>>v1>>v2;int t1=LocateVex(G,v1); int t2=LocateVex(G,v2);//建立从t1->t2的边 ArcNode *p1=new ArcNode;  //建立一个新边结点p1->adjvex=t2;p1->nextarc=G.vertices[t1].firstarc;G.vertices[t1].firstarc=p1; 
//		//建立从t2->t1的边 
//		ArcNode *p2=new ArcNode;  //建立一个新边结点
//		p2->adjvex=t1;
//		p2->nextarc=G.vertices[t2].firstarc;
//		G.vertices[t2].firstarc=p2; }return OK; 
}//计算有向图的出度 
Status CalculateDGO(ALGraph G,VerTexType v){int x=0;int i=LocateVex(G,v);  //得到该顶点的位置if(i==-1) return ERROR;ArcNode *p=G.vertices[i].firstarc;while(p){x++;p=p->nextarc;} return x;
} 
//有向图的入度
//需要把每个顶点遍历一次,找到到点i的情况,增加1 
Status CalculateDGI(ALGraph G,VerTexType v){int x=0;int i=LocateVex(G,v);  //得到该顶点的位置if(i==-1) return ERROR;for(int k=0;k<G.vexnum;k++){ArcNode *p=G.vertices[k].firstarc;while(p){if(p->adjvex==i)x++;p=p->nextarc;}}return x;
} 
//有向图的总度 
Status CalculateSum(ALGraph G,VerTexType v){if(LocateVex(G,v)==-1) return ERROR;return CalculateDGO(G,v)+CalculateDGI(G,v);
}//深度优先遍历 
void dfs(ALGraph G,int v){cout<<G.vertices[v].data;visit1[v]=true;  //表明已经遍历过ArcNode *p=G.vertices[v].firstarc;while(p){if(!visit1[p->adjvex])dfs(G,p->adjvex);p=p->nextarc;	}
} //广度优先遍历 
void bfs(ALGraph G,VerTexType v){int x=LocateVex(G,v);queue<int> q;  //队列q.push(x);visit2[x]=true;  //表示已经遍历过while(!q.empty()){int t=q.front();q.pop();cout<<G.vertices[t].data;//找t位置结点相邻的未被访问的点ArcNode *p=G.vertices[t].firstarc;while(p){if(!visit2[p->adjvex]){q.push(p->adjvex);visit2[p->adjvex]=true;}p=p->nextarc;} } 
} //输出在数据库中本身存储形式 
void Reverse(ALGraph G){for(int i=0;i<G.vexnum;i++){if(i!=0)  cout<<endl;cout<<G.vertices[i].data;ArcNode *p=G.vertices[i].firstarc;while(p){cout<<"->"<<G.vertices[p->adjvex].data;p=p->nextarc;}} 
} void menu(){cout<<"==========================="<<endl;cout<<"          菜单             "<<endl; cout<<"==========================="<<endl;cout<<"     1.图的建立            "<<endl;cout<<"     2.求顶点的度          "<<endl;cout<<"     3.深度优先遍历        "<<endl;cout<<"     4.广度优先遍历        "<<endl; cout<<"     5.输出存储结构        "<<endl; cout<<"     0.退出程序            "<<endl; cout<<"==========================="<<endl; 
} int main(void) {VerTexType v;ALGraph G;char order;int t;menu();cout<<"请输入你的选择:";cin>>order;while(order!='0'){switch(order){case '1':CreateDG(G);cout<<"此有向图的邻接表建立成功!!!"<<endl;cout<<"此有向图在邻接表中存储结构为:"<<endl; Reverse(G);cout<<endl;break;case '2':cout<<"请输入需要查找度数的顶点:";cin>>v;if(LocateVex(G,v)==-1)cout<<v<<"不存在于此图中"<<endl;else {cout<<"顶点"<<v<<"的出度为:"<<CalculateDGO(G,v)<<endl;cout<<"顶点"<<v<<"的入度为:"<<CalculateDGI(G,v)<<endl;cout<<"顶点"<<v<<"的总度为:"<<CalculateSum(G,v)<<endl; }		break;case '3':cout<<"请输出深度优先遍历的起点:";cin>>v; memset(visit1,false,sizeof(visit1));t=LocateVex(G,v);cout<<"深度优先遍历结果为:";dfs(G,t);cout<<""<<endl; //实现换行 break;case '4':cout<<"请输出广度优先遍历的起点:";cin>>v; memset(visit2,false,sizeof(visit2));cout<<"广度优先遍历结果为:";bfs(G,v);cout<<""<<endl; //实现换行 break;		case '5':cout<<"此有向图在邻接表中存储结构为:"<<endl; Reverse(G);cout<<endl;break;	case '0':cout<<"程序终止";break;default:cout<<"输入不合法,重新输入"<<endl;				 }if(order!='0'){menu();cout<<"请输入你的选择:";cin>>order;}}return 0;
}

二、邻接矩阵

因为邻接矩阵大部分实现代码和邻接表一致,故这里就只写了邻接矩阵的创建。

#include<bits/stdc++.h>
#define MVnum 100
using namespace std;typedef int Status;
typedef char VerTexType;   //假设每个顶点的数据类型是char 
typedef int ArcType;      //假设每条边权值的数据类型是inttypedef struct{VerTexType vexs[MVnum];   //顶点表 int vexnum,arcnum;  //图当前的顶点数和边数ArcType arcs[MVnum][MVnum];  //邻接矩阵存储权值 
}AMGraph; //给定顶点值,找到其位置 
Status LocateVex(AMGraph G,VerTexType v){for(int i=0;i<G.vexnum;i++){if(G.vexs[i]==v)return i;}return -1;
}//1.建立有向图 
Status CreateDG(AMGraph &G){VerTexType v1,v2; 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.arcnum;i++){cout<<"请输入两个邻接的点:"<<endl; cin>>v1>>v2; int t1=LocateVex(G,v1); int t2=LocateVex(G,v2);G.arcs[t1][t2]=1;}
}//2.输出 
void Reverse(AMGraph G){for(int i=0;i<G.vexnum;i++){if(i!=0) cout<<endl;for(int j=0;j<G.vexnum;j++){cout<<G.arcs[i][j]<<" ";}}
}int main(void){AMGraph G;CreateDG(G);Reverse(G);return 0;
} 

相关文章:

8. 数据结构——邻接表、邻接矩阵的基本操作

一、邻接表 1. 内容 2. 实现代码(直接可以复制使用) //邻接表的相关操作 #include<bits/stdc.h> #define MVnum 100 #define OK 1 #define ERROR -1 using namespace std;typedef int Status; typedef char VerTexType; //假设顶点的数据类型为char typedef int ArcT…...

OpenCV Python 版使用教程(二)摄像头调用

文章目录 一、上篇回顾二、使用步骤1. 调用摄像头的 API 介绍2. 代码示例3. 代码分析 三、下篇预告 一、上篇回顾 在上一篇中&#xff0c;简单介绍了如何在 Windows 和 Ubuntu 两个环境下部署和安装 OpenCV&#xff0c;从本篇开始将逐步介绍 OpenCV 中的常见操作。 本篇介绍 …...

基础算法——排序算法(冒泡排序,选择排序,堆排序,插入排序,希尔排序,归并排序,快速排序,计数排序,桶排序,基数排序,Java排序)

1.概述 比较排序算法 算法最好最坏平均空间稳定思想注意事项冒泡O(n)O( n 2 n^2 n2)O( n 2 n^2 n2)O(1)Y比较最好情况需要额外判断选择O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)O(1)N比较交换次数一般少于冒泡堆O( n l o g n nlogn nlogn)O( n l o g n nlogn nlogn)O( n l…...

几种常见的处理ARP欺骗的方法:静态ARP表和VLAN等

ARP&#xff08;Address Resolution Protocol&#xff09;欺骗是一种常见的网络攻击手段&#xff0c;攻击者通过伪造ARP响应&#xff0c;将网关的MAC地址指向攻击者的MAC地址&#xff0c;从而截获或篡改网络流量。为了应对ARP欺骗攻击&#xff0c;现代网络设备和管理员采取了一…...

突破1200°C高温性能极限!北京科技大学用机器学习合成24种耐火高熵合金,室温延展性极佳

在工程应用中&#xff0c;如燃气轮机、核反应堆和航空推进系统&#xff0c;对具备优异高温机械性能的金属合金需求十分旺盛。由于材料熔点的固有限制&#xff0c;传统镍基 (Ni) 高温合金的耐温能力已接近极限。为满足开发高温结构材料的需求&#xff0c;耐火高熵合金 (RHEAs) 于…...

ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 或者超时失效

数据治理过程中&#xff0c;有字段长度不够&#xff0c;扩展字段&#xff0c;报&#xff1a;ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 或者超时失效 ALTER TABLE LAPD_RSJ_CXJMYLBXCBXX MODIFY HKXZ VARCHAR2(10);错误表示当前会话在试图访问的资源&#xff08;通常…...

Python学习笔记-断点操作结合异常处理

在编程中,调试和错误处理是提升代码质量和开发效率的关键环节。调试能帮助识别并修复问题,异常处理则使得程序能在出现错误时有效地管理而不至于崩溃。断点与异常处理的结合应用是高级编程中不可或缺的技巧,能够帮助更高效地定位问题,提高程序的鲁棒性。 本文将通过详细的…...

Java实现JWT登录认证

文章目录 什么是JWT?为什么需要令牌?如何实现?添加依赖&#xff1a;JwtUtils.java&#xff08;生成、解析Token的工具类&#xff09;jwt配置&#xff1a;登录业务逻辑&#xff1a;其他关联代码&#xff1a;测试&#xff1a; 什么是JWT? JWT&#xff08;Json Web Token&…...

「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas 组件自定义绘图

Canvas 组件在鸿蒙应用中用于绘制自定义图形&#xff0c;提供丰富的绘制功能和灵活的定制能力。通过 Canvas&#xff0c;可以创建矩形、圆形、路径、文本等基础图形&#xff0c;为鸿蒙应用增添个性化的视觉效果。本篇将介绍 Canvas 组件的基础操作&#xff0c;涵盖绘制矩形、圆…...

山东路远生态科技有限公司竣工投产仪式暨产品发布会圆满举行

第二十届三中全会于2024年7月15日至18日在北京举行。全会审议通过了《关于进一步全面深化改革、推进中国式现代化的决定》。其中提到,“要健全因地制宜发展新质生产力体制机制”。 新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级而催生的当代先进生产力…...

java: 题目:银行账户管理系统

题目&#xff1a;银行账户管理系统 设计一个简单的银行账户管理系统。要求实现以下功能&#xff1a; 1. 创建一个银行账户 BankAccount 类&#xff0c;该类具有以下属性&#xff1a;accountNumber&#xff08;账户号码&#xff0c;类型为 String&#xff09; balance&#xff…...

PH热榜 | 2024-11-06

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 Github&#xff1a;https://github.com/LaughingZhu/DevNow 1. MindOne Builder 标语&#xff1a;这是一个“设计优先”的应用构建工具…...

五、Java并发 Java Google Guava 实现

Guava 是托管在 Github.com 上的流行的 Google 开源的 Java 线程池库。 Guava 包含了许多有用的并发类&#xff0c;同时还包含了几个方便的 ExecutorService 实现&#xff0c;但这些实现类都无法通过直接实例化或子类化来创建实例。取而代之的是提供了 MoreExecutors 助手类来…...

ssm公交车信息管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 摘要 I Abstract II 第1章 绪 论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 国内外研究现状 …...

如何删除react项目的默认图标,使在浏览器中不显示默认图标favicon.ico

要删除 React 项目的默认图标&#xff0c;使在浏览器中不显示默认图标favicon.ico&#xff0c;其实有两种方法&#xff1a; 方法一 方法要点&#xff1a;删除掉 public 目录下的 favicon.ico 文件&#xff0c;再用浏览器访问时&#xff0c;如果加载不到图标文件&#xff0c;就…...

【React】react-app-env.d.ts 文件

在使用 create-react-app 生成的 TypeScript 项目模板中&#xff0c;react-app-env.d.ts 文件的作用是为 React 应用中的全局变量和类型进行声明。 全局类型声明&#xff1a;react-app-env.d.ts 文件会引入 react-scripts 提供的全局类型定义&#xff0c;这些类型定义扩展了 Ty…...

设计模式讲解01-建造者模式(Builder)

1. 概述 建造者模式也称为&#xff1a;生成器模式 定义&#xff1a;建造者模式是一种创建型设计模式&#xff0c;它允许你将创建复杂对象的步骤与表示方式相分离。 解释&#xff1a;建造者模式就是将复杂对象的创建过程拆分成多个简单对象的创建过程&#xff0c;并将这些简单…...

wflow-web:开源啦 ,高仿钉钉、飞书、企业微信的审批流程设计器,轻松打造属于你的工作流设计器

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 wflow-web是一个开源的工作流设计器&#xff0c;它支持可视化拖拽表单组件&#xff0c;动态任意层级结构审批节点&#xff0c;以及复杂流程条件的设置…...

Promise 简单介绍及深入挖掘

一、什么是 Promise&#xff1f; 在 JavaScript 中&#xff0c;Promise 是用于处理异步操作的一种方式。它代表了一个 可能 在将来某个时间点完成或失败的操作的结果。Promise 使得我们能够优雅地处理异步代码&#xff0c;避免了回调地狱&#xff08;Callback Hell&#xff09;…...

103 - Lecture 1

Introduction to Database 一、Introduction to Database Systems 1. 数据的定义 What is Data? EX: data could be a docx file storing your project status report; data could be a spreadsheet containing information • 数据只有在设计的场景中才有意义。&#xff…...

Qwen3.5-9B-AWQ-4bit多场景落地:零售货架图分析+缺货识别+SKU自动计数

Qwen3.5-9B-AWQ-4bit多场景落地&#xff1a;零售货架图分析缺货识别SKU自动计数 1. 零售场景中的视觉理解挑战 在零售行业&#xff0c;货架管理一直是运营效率的关键指标。传统的人工巡检方式存在几个明显痛点&#xff1a; 效率低下&#xff1a;一个中型超市需要2-3小时完成…...

Benchmark.js 配置选项终极指南:如何优化你的 JavaScript 性能测试环境

Benchmark.js 配置选项终极指南&#xff1a;如何优化你的 JavaScript 性能测试环境 【免费下载链接】benchmark.js A benchmarking library. As used on jsPerf.com. 项目地址: https://gitcode.com/gh_mirrors/be/benchmark.js Benchmark.js 是一款专业的 JavaScript 性…...

3步搞定大麦网自动抢票:告别手速不够的时代

3步搞定大麦网自动抢票&#xff1a;告别手速不够的时代 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为抢不到心仪演唱会门票而烦恼吗&#xff1f;当周杰伦、五月天等热…...

金仓数据库KingbaseES KSQL命令行工具实战指南:从基础操作到高级调优

1. KSQL命令行工具入门指南 第一次接触金仓数据库的KSQL命令行工具时&#xff0c;我完全被它强大的功能震撼到了。作为DBA日常运维的瑞士军刀&#xff0c;KSQL不仅能完成基本的数据库操作&#xff0c;还能进行深度性能分析和调优。记得刚开始使用时&#xff0c;我还在纠结要不要…...

AI应用架构师讲解AI在金融市场应用案例的模型构建

AI应用架构师讲解&#xff1a;AI在金融市场应用案例的模型构建 一、引入与连接&#xff1a;当AI成为金融市场的“智能分析师” 2023年&#xff0c;某头部量化基金的AI策略实现了35%的年化收益率&#xff0c;远超市场平均水平&#xff1b;同年&#xff0c;某国有银行用AI风险模型…...

告别双流!用Vision Transformer (ViT) 搭建单流目标跟踪器OSTrack,实测速度提升40%

单流目标跟踪新范式&#xff1a;ViT驱动的OSTrack实战解析 在计算机视觉领域&#xff0c;目标跟踪技术正经历着从传统双流架构向单流范式的革命性转变。当我们面对复杂场景中的实时跟踪需求时&#xff0c;传统方法的性能瓶颈日益凸显——特征提取与关系建模的割裂处理导致计算冗…...

像素风AI工具体验:像素史诗智识终端,让研究变得有趣又高效

像素风AI工具体验&#xff1a;像素史诗智识终端&#xff0c;让研究变得有趣又高效 1. 引言&#xff1a;当科研遇上像素冒险 想象一下&#xff1a;你是一位勇者&#xff0c;站在像素风格的城堡前&#xff0c;准备开始一场史诗般的冒险。但这次&#xff0c;你的武器不是剑与盾&…...

计算机组成原理知识可视化:影墨·今颜生成硬件结构图解

计算机组成原理知识可视化&#xff1a;影墨今颜生成硬件结构图解 每次给学生讲计算机组成原理&#xff0c;最头疼的就是怎么把那些抽象的概念讲明白。什么“冯诺依曼结构”、“CPU流水线”、“Cache工作原理”&#xff0c;光靠文字和PPT里的方块图&#xff0c;学生听得云里雾里…...

保姆级教程:从GEO下载Hi-C数据到HiC-Pro完整分析(避坑指南+实战脚本)

从零开始掌握Hi-C数据分析&#xff1a;HiC-Pro全流程实战与避坑指南 Hi-C技术已经成为三维基因组研究的重要工具&#xff0c;但对于刚接触生物信息学的研究人员来说&#xff0c;从原始数据到最终分析结果的过程往往充满挑战。本文将带你完整走通Hi-C数据分析全流程&#xff0c;…...

Kandinsky-5.0-I2V-Lite-5s技术解析:如何在24GB显存跑通完整图生视频栈

Kandinsky-5.0-I2V-Lite-5s技术解析&#xff1a;如何在24GB显存跑通完整图生视频栈 1. 开箱即用的轻量级图生视频方案 Kandinsky-5.0-I2V-Lite-5s是一款让静态图片动起来的AI工具。想象一下&#xff0c;你只需要上传一张照片&#xff0c;再简单描述想要的动态效果&#xff0c…...