邻接表 实现图的遍历 C++
来源:互联网 发布:天下无人不通共 知乎 编辑:程序博客网 时间:2024/05/10 22:18
#include <iostream>#include <queue>using namespace std;const int MaxSize = 5;struct ArcNode//边表节点{int adjvex;ArcNode* next;};template <class T>struct VertexNode//定义顶点表节点{T vertex;ArcNode* firstedge;};template <class T>class AdjGraph{public:AdjGraph(T a[],int n,int e);//构造函数,建立具有n个顶点e条边的图void dfsTraverse(int v);//深度优先遍历图void bfsTraverse(int v);//广度优先遍历图void Insert(int a,int b);//插入边表void Show();//显示邻接表private:VertexNode<int> adjlist[MaxSize];//存放顶点表的数组int vertexNum, arcNum;//图的顶点数和边数int visited[MaxSize];//有没访问数组queue<int> que;};template <class T>AdjGraph<T>::AdjGraph(T a[],int n,int e){vertexNum = n;arcNum = e;for(int i=0;i<vertexNum;i++)//初始化头节点表{visited[i]=0;adjlist[i].vertex = a[i];adjlist[i].firstedge=NULL;}}template <class T>void AdjGraph<T>::Insert(int vertex,int arcNode){ArcNode *pArc = new ArcNode();pArc->adjvex = arcNode;if(adjlist[vertex].firstedge == NULL)adjlist[vertex].firstedge=pArc;else{ArcNode *p = adjlist[vertex].firstedge;while(p->next!=NULL)p = p->next;p->next = pArc;}}template <class T>void AdjGraph<T>::Show(){cout<<"邻接表为:"<<endl;for(int i = 0; i < vertexNum; i++){cout <<adjlist[i].vertex;ArcNode *p = adjlist[i].firstedge;while(p != NULL){cout << "->" << p->adjvex;p = p->next;}cout << "->NULL" << endl; }}template <class T>void AdjGraph<T>::dfsTraverse(int v)//深度优先{cout<<adjlist[v].vertex<<" ";visited[v]=1;ArcNode *p = adjlist[v].firstedge;//指向顶点v的边表while(p!=NULL){int j = p->adjvex;if(visited[j]==0)dfsTraverse(j);p=p->next;}}template <class T>void AdjGraph<T>::bfsTraverse(int v)//广度优先{for(int i=0;i<vertexNum;i++)//被访问节点初始化{visited[i]=0;}cout<<adjlist[v].vertex<<" ";visited[v]=1;que.push(v);//先把第一个元素放入队列while(que.empty()!=1)//队列非空时{v = que.front();//获取队头元素并弹出que.pop();ArcNode *p = adjlist[v].firstedge;//指向顶点v的边表while(p!=NULL){int j = p->adjvex;if(visited[j]==0)//若没被访问{cout<<adjlist[j].vertex<<" ";visited[j]=1;que.push(j);}p=p->next;}}}void main(){int a[5] = {0,1,2,3,4};AdjGraph<int> myGraph(a,5,6);myGraph.Insert(0,1);myGraph.Insert(0,3);myGraph.Insert(1,0);myGraph.Insert(1,2);myGraph.Insert(1,4);myGraph.Insert(2,1);myGraph.Insert(2,3);myGraph.Insert(2,4);myGraph.Insert(3,0);myGraph.Insert(3,2);myGraph.Insert(4,2);myGraph.Insert(4,1);myGraph.Show();cout<<endl<<"深度优先遍历:"<<endl;myGraph.dfsTraverse(0);cout<<endl;cout<<endl<<"广度优先遍历:"<<endl;myGraph.bfsTraverse(0);cout<<endl;}
0 0
- 邻接表实现图的遍历
- 邻接表实现图的储存,遍历
- 邻接表 实现图的遍历 C++
- 图的邻接表存储 深度优先遍历 广度优先遍历 C语言实现
- 图的邻接表存储 深度优先遍历 广度优先遍历 C语言实现
- 邻接表的图遍历
- 图的邻接表遍历
- 图的广度优先搜索遍历(邻接表&邻接矩阵)(C++)
- 图的邻接表创建与遍历(C语言)
- 图的邻接表存储 c实现
- 图的邻接表存储 c实现
- 图的邻接表存储 c实现
- 图的邻接表存储c实现
- 图的邻接表存储 c实现
- 图的邻接表C实现
- 图的邻接表存储 c实现
- 图的邻接表存储 c实现
- 图的邻接表存储 c实现
- 设计模式之Decorator(油漆工) 装饰者模式
- 数据结构之归并排序
- iptables详解
- JVM的内存结构
- 推荐系统:技术、评估及高效算法 第1章
- 邻接表 实现图的遍历 C++
- 面向对象<一>
- Mac 安装 Mxnet(cpu版),并跑学梵高画画demo
- C++中显式和隐式调用(直接返回结构体如何生成对象)
- Cookie应用——自动登录
- 类的继承与派生、多态、this指针、函数模板与类模板
- 735 A. Ostap and Grasshopper codeforces
- electron开发记录(二):VisualStudioCode相关
- 初窥wireshark fiddler等抓包工具及部分实现分析