数据结构 图 的邻接表建立

图 的邻接表建立

如下图
节点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;
}

输入信息即显示如下

相关推荐
luj_17686 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
取地址符7 小时前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习
思麟呀7 小时前
C++17(三)if constexpr+折叠表达式
开发语言·c++
ysa0510307 小时前
【板子】ST表
c++·笔记·算法·板子
CHHH_HHH8 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
十五年专注C++开发8 小时前
fatal error C1189: #error: WinSock.h has already been included 的解决方案
c++·socket·boost
旖-旎11 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
QN1幻化引擎11 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
拂拉氏12 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树
qeen8712 小时前
〖C++〗STL简介:发展历史、六大组件与简单应用
c++·学习·stl·模板