数据结构 图 的邻接表建立

图 的邻接表建立

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

cpp 复制代码
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

cpp 复制代码
#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

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

cpp 复制代码
#include "Graphs.h"

int main() {
	AdjListGraph Graph;

	Init(Graph);

	Create(Graph);

	printGraphs(Graph);

	Destroy(Graph);

	system("pause");
	return 0;
}

输入信息即显示如下

相关推荐
24白菜头9 分钟前
【无标题】
c++·笔记·学习·harmonyos
charlie11451419132 分钟前
嵌入式C++实践开发第21篇(单片机实践):按钮输入 —— 硬件原理、消抖与HAL API
开发语言·c++·单片机
AKDreamer_HeXY36 分钟前
QOJ 12255 - 36 Puzzle 题解
数据结构·c++·数学·算法·icpc·qoj
AI进化营-智能译站44 分钟前
ROS2 C++开发系列13-运算符重载让ROS2消息处理更自然
java·开发语言·c++·ai
zhouwy1131 小时前
Poco 与 libevent 网络编程
c++
叼烟扛炮1 小时前
C++第四讲:类和对象(下)
c++·算法·类和对象
Rabitebla1 小时前
vector 的骨架:三根指针、模板陷阱与迭代器失效的第一现场
开发语言·数据结构·c++·算法
Sarvartha2 小时前
N 个字符串最长公共子序列(LCS)求解问题
数据结构·算法
m0_629494732 小时前
LeetCode 热题 100-----16.除了自身以外数组的乘积
数据结构·算法·leetcode
晚风吹红霞2 小时前
C++异常处理核心知识点全解析
开发语言·c++