图——邻接表

邻接表:邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接顶点。又称链接表。


“test.cpp”

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include "GraphLink.h"

void Test()
{
	GraphLink<char,int> g("ABCDE",5,false);
	g.AddEdge('B','C',10);
	g.AddEdge('B','D',20);
	g.AddEdge('B','E',30);
	g.AddEdge('C','E',40);
	g.AddEdge('D','A',10);
	g.AddEdge('A','E',20);

	g.Display();
}
int main()
{
	Test();
	system("pause");
	return 0;
}


"GraphLink.h"

<strong><span style="font-size:18px;">#pragma once
#include <vector>

template<class V,class W>
class GraphLinkEdge
{
public:
	GraphLinkEdge(size_t str,size_t dect,const W& w)
		:_str(str)
		,_dect(dect)
		,_w(w)
		,_next(NULL)
	{}
	size_t _str;
	size_t _dect;
	W _w;
	GraphLinkEdge<V,W>* _next;
};

template<class V,class W>
class GraphLink
{
public:
	GraphLink(const V* arr,size_t size,bool isDirection)
		:_isDirection(isDirection)
	{
		_vertexs.resize(size);
		_egdes.resize(size);
		for (int i = 0;i < size;i++)
		{
			_vertexs[i] = arr[i];
		}
	}
	void AddEdge(const V& str,const V& dect,const W& w)
	{
		size_t newstr = _GetIndex(str);
		size_t newdect = _GetIndex(dect);

		if (_isDirection)
		{
			//有向图   添加一条边
			_AddEdge(newstr,newdect,w);
		} 
		else
		{
			//无向图  添加两条边
			_AddEdge(newstr,newdect,w);
			_AddEdge(newdect,newstr,w);
		}
	}
	void  Display()
	{
		for (int i = 0;i < _vertexs.size();i++)
		{
			cout<<_vertexs[i]<<"["<<i<<"]->";
			GraphLinkEdge<V,W>* begin = _egdes[i];

			while (begin)
			{
				cout<<begin->_w<<"["<<begin->_dect<<"]"<<"->";
				begin = begin->_next;
			}
			cout<<"NULL"<<endl;
		}
		cout<<endl;
	}
private:
	size_t _GetIndex(const V& v)
	{
		for (int i = 0;i < _vertexs.size();i++)
		{
			if (_vertexs[i] == v)
			{
				return i;
			}
		}
		return -1;
	}
	void _AddEdge(size_t str,size_t dect,const W& w)
	{
		GraphLinkEdge<V,W>* tmp = new GraphLinkEdge<V,W>(str,dect,w);

		//这里选择了头插的方式
		tmp->_next = _egdes[str];
		_egdes[str] = tmp;
	}
private:
	vector<V> _vertexs;//顶点集合
	vector<GraphLinkEdge<V,W>*> _egdes;//邻接表存储边
	bool _isDirection;
};</span></strong>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值