邻接表的实现(有向邻接表)、(无向邻接表),基于C++

邻接表的介绍以及邻接表的代码实现
摘要由CSDN通过智能技术生成

邻接表 

邻接矩阵的实现请看这里

是不错的一种图存储结构,但是,对于边数相对顶点较少的图,这种结构存在对存储空间的极大浪费。因此,找到一种数组与链表相结合的存储方法称为邻接表
邻接表的处理方法是这样的:

  • (1)图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过,数组可以较容易的读取顶点的信息,更加方便。
  • (2)图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以,用单链表存储,无向图称为顶点vi的边表,有向图则称为顶点vi作为弧尾的出边表。
    例如,下图就是一个无向图的邻接表的结构。

从图中可以看出,顶点表的各个结点由data和firstedge两个域表示,data是数据域,存储顶点的信息,firstedge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指向边表中下一个结点的指针。
对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可。如下图所示。 

代码实现邻接表(有向邻接表图) 基于C++

/**
 * C++: 邻接表图
 *
 * @author lph
 * 
 */

#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;

#define MAX 100
// 邻接表
class ListDG {
private: // 内部类
	// 邻接表中表对应的链表顶点
	class ENode {
	public:
		int ivex;			// 该边所指向的顶点的位置
		ENode* nextEdge;	// 指向下一条弧的指针
	};

	// 邻接表中表的顶点
	class VNode {
	public:
		char data;			//顶点信息
		ENode* firstEdge;	//指向第一条依赖该顶点的弧
	};

private: // 私有成员
	int mVexNum;			//图的顶点的数目
	int mEdgNum;			//图的边的数目
	VNode mVexs[MAX];		//用一维数组来存储邻接表的顶点

public:
	// 创建邻接表对应的图(自己输入)
	ListDG();
	// 创建邻接表对应的图(用已经提供的数据)
	ListDG(char vexs[], int vlen, char edges[][2], int elen);
	~ListDG();

	// 打印邻接表图
	void print();

private:
	// 读取一个输入字符
	char readChar();
	// 返回ch的位置
	int getPosition(char ch);
	// 将node
  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现无向图的基本思路是使用邻接表来存储每个顶点的邻居节点。邻接表是指一个数组,每个数组元素对应一个顶点,数组元素的值是一个链表链表中存储了与该顶点相邻的所有顶点。 下面是用 C++ 实现无向图的代码: ```cpp #include<iostream> #include<vector> using namespace std; class Graph{ private: int V; // 顶点数量 vector<vector<int>> adj; // 邻接表 public: Graph(int V){ this->V = V; adj.resize(V); } void addEdge(int v, int w){ // 无向图的邻接表需要同时添加两条边 adj[v].push_back(w); adj[w].push_back(v); } void printGraph(){ for(int i=0; i<V; i++){ cout << i << " -> "; for(int j=0; j<adj[i].size(); j++){ cout << adj[i][j] << " "; } cout << endl; } } }; int main(){ // 创建一个无向图 Graph g(5); g.addEdge(0, 1); g.addEdge(0, 4); g.addEdge(1, 2); g.addEdge(1, 3); g.addEdge(1, 4); g.addEdge(2, 3); g.addEdge(3, 4); // 打印邻接表 g.printGraph(); return 0; } ``` 在上面的代码中,我们定义了一个 Graph 类,其中 V 表示顶点数量,adj 是一个二维向量,用于存储邻接表。addEdge 函数用于向无向图中添加一条边,需要同时添加两条边。printGraph 函数用于打印邻接表。 在 main 函数中,我们创建一个无向图,并添加了一些边,然后打印邻接表。输出结果如下: ``` 0 -> 1 4 1 -> 0 2 3 4 2 -> 1 3 3 -> 1 2 4 4 -> 0 1 3 ``` 这个邻接表表示的无向图如下所示: ``` 0---1 |\ /|\ | X | 2 |/ \|/ 4---3 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值