数据结构与算法-图的遍历

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法-图的遍历相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<string>
#include<queue>
using namespace std;
#define ERROR 1
#define MAX_VERTEX_NUM 100
typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; string info; }ArcNode;
typedef struct VNode{ char date; ArcNode * firstarc; }VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{ AdjList vertices; int vexnum,arcnum; //当前图的vexnum顶点数和arcnum弧数 int kind; }ALGraph;
int LocateVex(ALGraph &G,char &v1) { int i; for(i=0;i<G.vexnum;i++) { if(G.vertices[i].date==v1) return i; } if(i>=G.vexnum) return ERROR; else return 0; }
void CreateDG(ALGraph &G) { ArcNode *p,*q; char v1,v2; char v; int i,j,k,n; cout<<"请输入图的顶点数和弧数:"<<endl; cin>>G.vexnum; cin>>G.arcnum; cout<<"请输入顶点:"<<endl; for(i=0;i<G.vexnum;i++) { cin>>v; G.vertices[i].date=v; G.vertices[i].firstarc=NULL; } cout<<"请输入弧尾和弧头:"; for(k=0;k<G.arcnum;k++) { cin>>v1; cin>>v2; i=LocateVex(G,v1);j=LocateVex(G,v2); if(G.vertices[i].firstarc==NULL) { p=(ArcNode *)new ArcNode; G.vertices[i].firstarc=p; q=G.vertices[i].firstarc; } else { q=G.vertices[i].firstarc; for(n=0;n<G.arcnum;n++,q=q->nextarc) { if(!q->nextarc) break; } p=(ArcNode *)new ArcNode; q->nextarc=p; q=q->nextarc; } q->adjvex=j; q->nextarc=NULL; } cout<<"图构建成功!"; }
//----------------深度优先遍历--------------------// bool visited[MAX_VERTEX_NUM]; int FirstAdjVex(ALGraph &G,int v) { int i; int n=-1; ArcNode*p; p=G.vertices[v].firstarc; if(p) { i=p->adjvex; if(visited[i]==false) n=i; } return n; } int NextAdjVex(ALGraph &G,int v) { int i; int n=-1; ArcNode *p; p=G.vertices[v].firstarc; for(i=p->adjvex;i<G.vexnum,p!=NULL;) { i=p->adjvex; if(visited[i]==false) { n=i; break; } else p=p->nextarc; } return n; } void VisitFuc(ALGraph &G,int v) { cout<<G.vertices[v].date<<" "; } void DFS(ALGraph &G,int v) { int w; visited[v]=true; VisitFuc(G,v); for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v)) if(!visited[w]) DFS(G,w); } void DFSTraverse(ALGraph &G) { int v; for(v=0;v<G.vexnum;v++) visited[v]=false; cout<<"深度优先搜索:"<<endl; for(v=0;v<G.vexnum;v++) { if(!visited[v]) DFS(G,v); } }
//----------------广度优先遍历--------------------// void BFSTraverse(ALGraph &G) { int v; int w; queue<int> q; //STL队列 for(v=0;v<G.vexnum;v++) visited[v]=false; // InitQueue(Q); cout<<"广度优先搜索:"; for(v=0;v<G.vexnum;v++) { if(!visited[v]) { visited[v]=true; VisitFuc(G,v); q.push(v); //v进队 while(q.empty()!=true) { v = q.front(); q.pop(); for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v)) { if(!visited[w]) { visited[w]=true; VisitFuc(G,w); q.push(w); } } } } } }
///////////////////////////////////////////////////////////////// void menu() { cout<<‘\n‘; cout<<" //---------------图的基本操作---------------//"<<endl; cout<<" ** 1、图的构建 **"<<endl; cout<<" ** 2、深度优先遍历 **"<<endl; cout<<" ** 3、广度优先遍历 **"<<endl; cout<<" --------------------------------------------"<<endl; cout<<"请输入数字进行选择:"<<endl; } int main() { ALGraph G; int i; menu(); cin>>i; while(i<4) { switch(i) { case 1:CreateDG(G);break; case 2:DFSTraverse(G);cout<<endl;break; case 3:BFSTraverse(G);cout<<endl;break; default:return ERROR; } menu(); cin>>i; } return 0; }

以上是关于数据结构与算法-图的遍历的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法: 三十张图弄懂「图的两种遍历方式」

数据结构算法之图的存储与遍历(Java)

数据结构C语言版 图的遍历 DFS和BFS算法,用邻接矩阵储存 急阿在线等 求大神指点

2023-03-29 图的深度优先遍历

数据结构实验报告-实验四 图的构造与遍历

数据结构—— 图:图的遍历