有向图的邻接表(Adjacency List)

简介: 有向图的邻接表(Adjacency List)

listNode.h

#ifndef __LISTNODE_H__
#define __LISTNODE_H__
class EdgeNode
{
public:
  int adjVex;
  EdgeNode * next;
};
template <class T>
class VertexNode
{
public:
  T vertex;
  EdgeNode * firstEdgeNode;
};
#endif


ALGraph.h

#ifndef __ALGRAPH_H__
#define __ALGRAPH_H__
#include "listNode.h"
const int MaxSize = 10;
template <class T>
class ALGraph
{
public:
  ALGraph(T _adjList[], int _vertexNum, int _edgeNum);
  ~ALGraph();
public:
  void DFSTraverse(int _vertex);
  void BFSTraverse(int _vertex);
private:
  VertexNode<T> adjList[MaxSize];
  int vertexNum, edgeNum;
};
#endif


ALGraph.cpp

#include <iostream>
#include "listNode.h"
#include "ALGraph.h"
using namespace std;
template <class T>
ALGraph<T>::ALGraph(T _adjList[], int _vertexNum, int _edgeNum)
{
  vertexNum = _vertexNum;
  edgeNum = _edgeNum;
  for (int i = 0; i < vertexNum; i++)
  { 
  adjList[i].vertex = _adjList[i];
  adjList[i].firstEdgeNode = nullptr;
  }
  for (int i = 0; i < edgeNum; i++)
  {
  int vertex1, vertex2;
  cin >> vertex1 >> vertex2;
  EdgeNode * tempEdgeNode = new EdgeNode;
  tempEdgeNode->adjVex = vertex2;
  tempEdgeNode->next = adjList[vertex1].firstEdgeNode;
  adjList[vertex1].firstEdgeNode = tempEdgeNode;
  }
}
template <class T>
ALGraph<T>::~ALGraph()
{}
template <class T>
void ALGraph<T>::DFSTraverse(int _vertex)
{
  int tempVertex = 0;
  static int * visitedDFS = new int[vertexNum];
  cout << adjList[_vertex].vertex;
  visitedDFS[_vertex] = 1;
  EdgeNode * tempFirstEdgeNode = adjList[_vertex].firstEdgeNode;
  while (tempFirstEdgeNode != nullptr)
  {
  tempVertex = tempFirstEdgeNode->adjVex;
  if (visitedDFS[tempVertex] != 1)
    DFSTraverse(tempVertex);
  tempFirstEdgeNode = tempFirstEdgeNode->next;
  }
}
template <class T>
void ALGraph<T>::BFSTraverse(int _vertex)
{
  int front = -1, rear = -1;
  int *visitedBFS = new int[vertexNum];
  int *queue = new int[vertexNum];
  cout << adjList[_vertex].vertex;
  visitedBFS[_vertex] = 1;
  queue[++rear] = _vertex;
  while (front != rear)
  {
  _vertex = queue[++front];
  EdgeNode * tempFirstEdgeNode = adjList[_vertex].firstEdgeNode;
  while (tempFirstEdgeNode != nullptr)
  {
    if (visitedBFS[tempFirstEdgeNode->adjVex] != 1)
    {
    cout << adjList[tempFirstEdgeNode->adjVex].vertex;
    visitedBFS[tempFirstEdgeNode->adjVex] = 1;
    queue[++rear] = tempFirstEdgeNode->adjVex;
    }
    tempFirstEdgeNode = tempFirstEdgeNode->next;
  }
  }
}


AdjacencyList.cpp

#include <iostream>
#include "ALGraph.h"
#include "ALGraph.cpp"
using namespace std;
int main()
{
  int arr[] = { 0, 1, 2, 3 };
  ALGraph<int> G(arr, 4, 4);
  G.BFSTraverse(0);
  cout << endl;
  G.DFSTraverse(0);
  cout << endl;
  return 0;
}


输入输出

//输入
0 1
0 2
2 3
3 0
//输出
0213
0231


相关文章
|
存储 关系型数据库 MySQL
【MySQL疑难杂症】如何将树形结构存储在数据库中(方案一 Adjacency List)
  今天来看看一个比较头疼的问题,如何在数据库中存储树形结构呢?   像mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这样有深度的人,就很难驾驭了。   举个栗子:现在有一个要存储一下公司的人员结构,大致层次结构如下:     (画个图真不容易。
1198 0
|
C++
图的邻接表实现 Adjacency List of the Graph
图的邻接表实现 Adjacency List of the Graph eryar@163.com 一、图的邻接表   邻接表(Adjacency List)是图的一种链式存储结构。在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边,对有向图是以顶点Vi为尾的弧。
1901 0
|
3天前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
8 1
|
3天前
|
存储 消息中间件 算法
Java中的集合框架详解:List、Set、Map的使用场景
Java中的集合框架详解:List、Set、Map的使用场景
|
8天前
|
存储 安全 Java
Java List详解
Java List详解
|
9天前
|
Java API
使用 Java 来实现两个 List 的差集操作
使用 Java 来实现两个 List 的差集操作
14 3
|
11天前
|
安全 Java 索引
Java List:从入门到精通,一篇文章就够了!
【6月更文挑战第17天】Java List是有序元素集合,支持索引访问、添加、删除和修改。从ArrayList、LinkedList到Vector,各种实现满足不同场景需求。使用add()添加元素,get()获取,set()修改,remove()删除。遍历可用for-each或Iterator,subList()创建子集。注意线程安全,可选synchronizedList()、Vector或CopyOnWriteArrayList。理解List的基本操作和特性,能提升编程效率。
|
11天前
|
存储 Java 索引
告别Java集合小白!一文读懂List的精髓
【6月更文挑战第17天】Java中的List接口作为有序集合,允许存储和操作有序元素,支持重复值。ArrayList和LinkedList是常见实现类:ArrayList基于数组,适合快速访问但插入删除慢;LinkedList基于链表,插入删除快但访问慢。了解其核心概念、方法及泛型使用,能提升编程效率和代码质量。示例代码展示了添加和访问元素。通过深入学习,可以更好地掌握List的高级用法。
|
2天前
|
存储 设计模式 并行计算
CopyOnWriteArrayList:深入理解Java中的线程安全List原理和应用
CopyOnWriteArrayList:深入理解Java中的线程安全List原理和应用
|
2天前
|
并行计算 Java API
Java List集合取交集的八种不同实现方式
Java List集合取交集的八种不同实现方式