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

数据结构 图 的邻接表建立

图 的邻接表建立

如下图
节点A没有指向任何节点
节点B指向A,也指向C,还指向E.
节点C指向E.
节点D指向C.
节点E指向B,也指向C,还指向D.
将其抽象建立为右下的邻接表

在这里插入图片描述

typedef struct _EdgeNode {//与节点连接的边的定义int adjvedx; //指向终点顶点的下标int weight; //权重_EdgeNode* next; //下一条边
}EdgeNode;typedef struct _VertexNode { //顶点节点char data; //节点数据_EdgeNode* first; //指向邻接第一条边
}VertexNode,AdjList;typedef struct _AdjListGraph {AdjList* adjlist;int vex; //顶点数int edge; //边数
}AdjListGraph;

在内存中的建立结构如下:

在这里插入图片描述

参考程序如下:

Graphs.h

#pragma once
#include <iostream>using namespace std;#define  MAXSIZE   10 typedef struct _EdgeNode {//与节点连接的边的定义int adjvedx; //邻接的顶点int weight; //权重_EdgeNode* next; //下一条边
}EdgeNode;typedef struct _VertexNode { //顶点节点char data; //节点数据_EdgeNode* first; //指向邻接第一条边
}VertexNode,AdjList;typedef struct _AdjListGraph {AdjList* adjlist;int vex; //顶点数int edge; //边数
}AdjListGraph;//图的初始化
void Init(AdjListGraph& G);//图的创建(邻接表的创建)
void Create(AdjListGraph& G);//通过顶点对应的字符寻找顶点在顶点列表中的位置
int Location(AdjListGraph& G, char c);//输出构建的邻接表
void printGraphs(AdjListGraph& G);//销毁邻接表
void Destroy(AdjListGraph& G);

Graphs.cpp

#include "Graphs.h"void Init(AdjListGraph& G)
{G.adjlist = new AdjList[MAXSIZE];G.edge = 0;G.vex = 0;
}void Create(AdjListGraph& G)
{cout << "请输入该图的顶点数:" << endl;cin >> G.vex;cout << "请输入该图的边数:" << endl;cin >> G.edge;cout << "请输入相关顶点:" << endl;for (int i = 0; i < G.vex; i++) {cin >> G.adjlist[i].data;G.adjlist[i].first = NULL;}char v1 = 0, v2 = 0; //保存输入的顶点的字符int i1, i2; //保存顶点在数组中的下标cout << "请输入想关联边的顶点(A-->B):" << endl;for (int i = 0; i < G.edge; i++) {cout << "起点-->终点:";cin >> v1 >> v2;i1 = Location(G, v1);i2 = Location(G, v2);if (i1 != -1 && i2 != -1) { //寻找到位置EdgeNode* temp = new EdgeNode;temp->adjvedx = i2; //边指向的顶点位置temp->next = G.adjlist[i1].first; //置空G.adjlist[i1].first = temp; //链接到顶点表上}}
}int Location(AdjListGraph& G, char c)
{for (int i = 0; i < G.vex; i++) {if (G.adjlist[i].data == c) {return i;}}return -1;
}void printGraphs(AdjListGraph& G)
{cout << "邻接表顶点数:" << G.vex << "  邻接表边数:" << G.edge << endl;for (int i = 0; i < G.vex; i++) {cout << "顶点:" << G.adjlist[i].data;EdgeNode* p = G.adjlist[i].first;while (p) {int n = p->adjvedx; //边指向顶点的位置cout << "-->" << G.adjlist[n].data;p = p->next;}cout << endl;}}void Destroy(AdjListGraph& G)
{EdgeNode* p = NULL, * tmp = NULL;for (int i = 0; i < G.vex; i++) {p=G.adjlist[i].first;while (p) {tmp = p;p = p->next;delete tmp;}}delete[] G.adjlist;
}

main.cpp

#include "Graphs.h"int main() {AdjListGraph Graph;Init(Graph);Create(Graph);printGraphs(Graph);Destroy(Graph);system("pause");return 0;
}

输入信息即显示如下
在这里插入图片描述

http://www.dtcms.com/a/600707.html

相关文章:

  • C++CUDA实战:通过两个图像算法,搞懂了GPU编程
  • RabbitMQ应用(2)
  • Spring Boot 中的消息队列集成:从 RabbitMQ 到 Kafka 的深度实践
  • Spring Boot 与 RabbitMQ 集成示例
  • 家纺 网站模版想自己做网站流程
  • 将 CentOS 风格的命令行提示符(如 [root@slave1 ~]#)修改为 Ubuntu 风格
  • k8s各种场景下排错思路以及命令 k8s常见问题故障处理思路
  • win32k源代码分析之win32k!IsSAS函数中的全局变量win32k!gfsSASModifiers = 3是什么时候被赋值的
  • 序列和可迭代
  • 16.udp_socket(二)
  • 如何在不使用iTunes的情况下在电脑上访问iPhone文件
  • python+websockets,报错RuntimeError: no running event loop
  • 自己做网站流程龙口市最新公告
  • 自助建站系统介绍wordpress 百度推广
  • 基于Springboot的汽车推荐系统设计与实现7f7h74np(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
  • DBLoss: Decomposition-based Loss Function for Time Series Forecasting 论文阅读
  • STM32F103学习笔记-16-RCC(第4节)-使用 HSI 配置系统时钟并用 MCO 监控系统时钟
  • Git 中新建学习分支 + 暂存修改 + VSCode 可视化查看改动(超详细教程)
  • Linux高效编程与实战:自动化构建工具“make/Makefile”和第一个系统程序——进度条
  • Docker 相关使用收录
  • 【详细步骤解析】爬虫小练习——爬取豆瓣Top250电影,最后以csv文件保存,附源码
  • Docker-存储
  • wap手机网站模板上饶网站建设3ao cc专业a
  • 【Nginx】Nginx 多协议负载均衡实战:StarRocks 与 MinIO 代理配置全解析
  • 域名注册和网站设计服务如何做贴吧类网站多钱
  • python+uniapp基于微信小程序的垃圾分类信息系统
  • C语言编译器安卓版 | 强大功能助力编程学习与实践
  • STM32使用金属探测传感器自制金属探测仪
  • vmware嵌套安装esxi7.0.3扩容vmfs
  • 使用 BR 备份 TiDB 到 AWS S3 存储