GeeksforGeeks - Adjacency List邻接矩阵C\C++代码

邻接矩阵的图示:

构建一个这种无向邻接矩阵。

參考站点: http://www.geeksforgeeks.org/graph-and-its-representations/

这里写了个类,添加删除图的操作。

#pragma once
#include <stdio.h>
#include <stdlib.h>

class AdjListGraph
{
	struct Node
	{
		int dest;
		Node *next;
	};

	struct List
	{
		Node *first;
	};

	struct Graph
	{
		int vers;
		List *verArr;
	};

	Node *createNode(int dest)
	{
		Node *newNode = (Node *) malloc(sizeof(Node));
		newNode->dest = dest;
		newNode->next = nullptr;
		return newNode;
	}

	Graph *createGraph(int vers)
	{
		Graph * gra = (Graph *) malloc(sizeof(Graph));
		gra->vers = vers;
		gra->verArr = (List *) malloc(vers * sizeof(List));
		for (int i = 0; i < vers; i++)
		{
			gra->verArr[i].first = nullptr;
		}
		return gra;
	}

	void addEdge(Graph *gra, int src, int dest)
	{
		Node *n = createNode(dest);
		n->next = gra->verArr[src].first;//这里不须要->next,由于无空head指针
		gra->verArr[src].first = n;

		//构造无向图
		n = createNode(src);
		n->next = gra->verArr[dest].first;
		gra->verArr[dest].first = n;
	}

	void printGraph()
	{
		for (int i = 0; i < graph->vers; i++)
		{
			Node *n = graph->verArr[i].first;
			printf("\n Adjacency list of vertex %d\n head ", i);
			while (n)
			{
				printf("-> %d", n->dest);
				n = n->next;
			}
			putchar(‘\n‘);
		}
	}

	Graph *graph;
public:
	AdjListGraph(int V = 0) : graph(nullptr)
	{
		graph = createGraph(V);
		addEdge(graph, 0, 1);
		addEdge(graph, 0, 4);
		addEdge(graph, 1, 2);
		addEdge(graph, 1, 3);
		addEdge(graph, 1, 4);
		addEdge(graph, 2, 3);
		addEdge(graph, 3, 4);
		printGraph();
	}

	~AdjListGraph()
	{
		if (graph)
		{
			for (int i = 0; i < graph->vers; i++)
			{
				Node *n = graph->verArr[i].first;
				Node *p = nullptr;
				while (n)
				{
					p = n;
					n = n->next;
					free(p);
				}
			}
			free(graph->verArr);
			free(graph);
		}
	}
};

以下是C++的代码,C++的代码会更加简洁。

使用默认构造函数和使用new的确会方便非常多。

malloc原始快捷,new方便。不用专门设置一个create函数,直接new+构造函数就实现了。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

class AdjListGraph_2
{
	struct Node
	{
		int label;
		Node *next;
		Node(int l = 0, Node *n = nullptr) : label(l), next(n){}
	};
	struct Vertice
	{
		Node *first;
		Vertice() : first(nullptr) {}
	};
	struct Graph
	{
		int vers;
		Vertice *vArr;
		Graph(int v = 5) : vers(v)
		{
			vArr = new Vertice[vers];
		}
	};
	Graph *graph;
public:
	AdjListGraph_2(int V = 5) : graph(nullptr)
	{
		graph = new Graph(V);
		addEdge(0, 1);
		addEdge(0, 4);
		addEdge(1, 2);
		addEdge(1, 3);
		addEdge(1, 4);
		addEdge(2, 3);
		addEdge(3, 4);
		printGraph();
	}

	void addEdge(int src, int dest)
	{
		Node *n = new Node(dest);
		n->next = graph->vArr[src].first;
		graph->vArr[src].first = n;

		n = new Node(src);
		n->next = graph->vArr[dest].first;
		graph->vArr[dest].first = n;
	}
	void printGraph()
	{
		if (graph)
		{
			for (int i = 0; i < graph->vers; i++)
			{
				Node *n = graph->vArr[i].first;
				printf("\n The %d vertice‘s adjcences are :\n V%d", i, i);
				while (n)
				{
					printf(" ->V%d", n->label);
					n = n->next;
				}
				putchar(‘\n‘);
			}
		}
	}

	~AdjListGraph_2()
	{
		if (graph)
		{
			for (int i = 0; i < graph->vers; i++)
			{
				Node *n = graph->vArr[i].first;
				while (n)
				{
					Node *p = n;
					n = n->next;
					delete p;
				}
			}
			delete [] graph->vArr;
			delete graph;
		}
	}
};
时间: 2024-07-29 10:14:28

GeeksforGeeks - Adjacency List邻接矩阵C\C++代码的相关文章

GeeksforGeeks - Adjacency List邻接矩阵C代码

邻接矩阵的图示: 构建一个这样的无向邻接矩阵. 参考网站: http://www.geeksforgeeks.org/graph-and-its-representations/ 这里写了个类,增加删除图的操作. #pragma once #include <stdio.h> #include <stdlib.h> class AdjListGraph { struct Node { int dest; Node *next; }; struct List { Node *firs

邻接矩阵DFS,BFS代码实现

// 邻接矩阵的深度和广度优先遍历 #include <stdio.h> #define OK 1 // 执行成功 #define ERROR 0 // 执行失败 #define TRUE 1 // 返回值为真 #define FALSE 0 // 返回值为假 typedef int Status; // 执行状态(OK.ERROR) typedef int Boolean; // 布尔值(TRUE.FALSE) typedef char VertexType; // 顶点元素类型 typed

邻接矩阵无向图的介绍

邻接矩阵无向图是指通过邻接矩阵表示的无向图. 上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)"共7条边.由于这是无向图,所以边(A,C)和边(C,A)是同一条边:这里列举边时,是按照字母先后顺序列举的. 上图右边的矩阵是G1在内存中的邻接矩阵示意图.A[i][j]=1表示第i个顶点与第j个顶点是邻接点,A[i][j]=0则表示它们不是邻接点:而A[i][j]表

邻接矩阵有向图(二)之 C++详解

本章是通过C++实现邻接矩阵有向图. 目录 1. 邻接矩阵有向图的介绍 2. 邻接矩阵有向图的代码说明 3. 邻接矩阵有向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 邻接矩阵有向图的介绍 邻接矩阵有向图是指通过邻接矩阵表示的有向图. 上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"<A,B>,<B,C>,<B,E>,<

邻接矩阵有向图(三)之 Java详解

前面分别介绍了邻接矩阵有向图的C和C++实现,本文通过Java实现邻接矩阵有向图. 目录 1. 邻接矩阵有向图的介绍 2. 邻接矩阵有向图的代码说明 3. 邻接矩阵有向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 邻接矩阵有向图的介绍 邻接矩阵有向图是指通过邻接矩阵表示的有向图. 上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"<A,B>,<

邻接矩阵无向图(二)之 C++详解

本章是通过C++实现邻接矩阵无向图. 目录 1. 邻接矩阵无向图的介绍 2. 邻接矩阵无向图的代码说明 3. 邻接矩阵无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 邻接矩阵无向图的介绍 邻接矩阵无向图是指通过邻接矩阵表示的无向图. 上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,

邻接矩阵有向图的介绍

邻接矩阵有向图的介绍 邻接矩阵有向图是指通过邻接矩阵表示的有向图. 上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"<A,B>,<B,C>,<B,E>,<B,F>,<C,E>,<D,C>,<E,B>,<E,D>,<F,G>"共9条边. 上图右边的矩阵是G2在内存中的邻接矩阵示意图.A[i][j]=1表示第i个顶点到第j个顶点是一条边,A

邻接矩阵有向图(一)之 C语言详解

本章介绍邻接矩阵有向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实现.实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文章有错误或不足的地方,请不吝指出! 目录 1. 邻接矩阵有向图的介绍 2. 邻接矩阵有向图的代码说明 3. 邻接矩阵有向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结

图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)

Adjacency Matrix 邻接矩阵是表示一个图的常用存储表示.它用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息.阶为n的图G的邻接矩阵A是n*n的.将G的顶点标签为v_1,v_2,...,v_n.若(v_i,v_j) \in E(G),A_{ij}=1,否则A_{ij}=0. Depth-First-Search 是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发