C++实现图论邻接表

用C++实现图论中的邻接表,用的STL中vector和list实现

这是AdjList.h文件

#pragma once
#include 
#include 
#include 
#include 
#include 

using namespace std;

class AdjList
{
private:
	int V;//顶点数
	int E;//边数
	vector> adjlist;//用于存储每个顶点的相邻顶点
    //vector中有V个list,每个list里面是各个顶点的相邻顶点
	
	void validateVertex(int v) {//用于验证输入顶点的有效性
		if (v < 0 || v >= V)
		{
			cout << "vertex " << v << " is invalid" << endl;
		}
	}

public:
	AdjList(){
		V = 0;
		E = 0;
	}
	AdjList(string filename) {//读取顶点与边的关系文件
		ifstream file;
		file.open(filename.data());
		assert(file.is_open());

		//读取 V 和 E 的值
        //前两个值是顶点个数和边数
		char c;
		file >> c;
		V = c - '0';
		file >> c;
		E = c - '0';

		//初始化vector list列表
		for (int i = 0; i < V; i++)
		{
			list ve_list;
			adjlist.push_back(ve_list);
		}

        //读取两个顶点,即一条边,这个无向图,所有两边都要加入
		for (int i = 0; i < E; i++)
		{
			file >> c;
			int a = c - '0';
			file >> c;
			int b = c - '0';
			adjlist[a].push_back(b);
			adjlist[b].push_back(a);
		}
	}
	~AdjList() {
	}

	int getV() {
		return V;
	}
	int getE() {
		return E;
	}
	bool contain(int v, int w) {//看两个顶点是否相邻
		for (auto it : adjlist[v]) {
			if (it == w)
				return true;
		}
		return false;
	}

	list neborlist(int v) {//获取相邻顶点的列表
		validateVertex(v);
		return adjlist[v];
	}

	bool hasEdge(int v, int w) {//看两顶点之间是否有边
		validateVertex(v);
		validateVertex(w);
		return contain(v, w);
	}
	int degree(int v) {//看顶点的度
		return adjlist[v].size();
	}
	void listprint() {//打印邻接表
		for (int v = 0; v < V; v++)
		{
			cout << v << " : ";
			for (auto it : adjlist[v])
				cout << it << "  ";
			cout << endl;
			cout << adjlist[v].size() << endl;
		}
	}
	void printlist(list& temp) {
		for (auto it : temp )
		{
			cout << it << "  ";
		}
		cout << endl;
	}
};

这个是main文件

#include 
#include 
//#include "AdjMatrix.h"
#include 
#include "AdjList.h"
//#include"GraphDFS.h"
using namespace std;

int main() {
	AdjList* adjList = new AdjList("g.txt");
	adjList->listprint();
	
	return 0;
}

这是读取的顶点与边的关系文件

C++实现图论邻接表_第1张图片

这是打印的结果

C++实现图论邻接表_第2张图片

你可能感兴趣的:(C++实现图论邻接表)