图的遍历
采用图的邻接表存储结构实现
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> using namespace std; #define MAX_NUM 100 //边节点 typedef struct ArcNode { int adjvex; //边的终点编号 int weight; //边权重 struct ArcNode* next; //指向下一条边 }ArcNode; //顶点节点 typedef struct VNode { int data; //顶点编号 ArcNode* first; //顶点指向的第一条边 }VNode; //图 typedef struct Graph { VNode adjList[MAX_NUM]; //顶点集合 int vexnum; //顶点个数 int arcnum; //边的条数 }ALGraph; void init(ALGraph &graph) { memset(graph.adjList, 0, sizeof(graph.adjList)); graph.arcnum = 0; graph.vexnum = 0; } //构建图 void buildGraph(ALGraph &graph, int edgeInfo[], int n) { bool vist[MAX_NUM]; memset(vist, 0, sizeof(vist)); for(int i = 0; i < n; i = i + 2) { //新建边节点 ArcNode* arcNode = (ArcNode*)malloc(sizeof(ArcNode)); arcNode->adjvex = edgeInfo[i + 1]; arcNode->next = NULL; graph.arcnum++; //顶点 if(!vist[edgeInfo[i]]) { graph.vexnum++; vist[edgeInfo[i]] = true; graph.adjList[edgeInfo[i]].data = edgeInfo[i]; } if(!vist[edgeInfo[i + 1]]) { graph.vexnum++; vist[edgeInfo[i + 1]] = true; graph.adjList[edgeInfo[i + 1]].data = edgeInfo[i + 1]; } int vnum = edgeInfo[i]; if(graph.adjList[vnum].first == NULL) { graph.adjList[vnum].first = arcNode; } else { ArcNode* temp = graph.adjList[vnum].first; while(temp->next != NULL) temp = temp->next; temp->next = arcNode; } } } //bfs遍历图 void bfs(ALGraph graph, int v, bool visit[]) { queue<int> q; q.push(v); visit[v] = true; while(!q.empty()) { int cur = q.front(); q.pop(); cout<<graph.adjList[cur].data<<" "; for(ArcNode* edge = graph.adjList[cur].first; edge != NULL; edge = edge->next) { if(!visit[edge->adjvex]) { q.push(edge->adjvex); visit[edge->adjvex] = true; } } } } void bfsTraverse(ALGraph graph) { //初始化访问标记 bool visit[MAX_NUM]; memset(visit, 0, sizeof(visit)); for(int i = 1; i <= graph.vexnum; i++) if(!visit[i]) bfs(graph, i, visit); cout<<endl; } void dfs(ALGraph graph, int v, bool visit[]) { cout<<graph.adjList[v].data<<" "; //v==data visit[v] = true; for(ArcNode* edge = graph.adjList[v].first; edge != NULL; edge = edge->next) { if(!visit[edge->adjvex]) { dfs(graph, edge->adjvex, visit); } } } void dfsTraverse(ALGraph graph) { bool visit[MAX_NUM]; memset(visit, 0, sizeof(visit)); for(int i = 1; i <= graph.vexnum; i++) if(!visit[i]) dfs(graph, i, visit); cout<<endl; } int main() { int edgeInfo[] = {1,2,1,4,2,5,3,1,3,6,4,2,4,6,6,5}; ALGraph graph; init(graph); buildGraph(graph, edgeInfo, 16); cout<<"图的顶点个数: "<<graph.vexnum<<endl; cout<<"图的边条数: "<<graph.arcnum<<endl; cout<<"广度优先遍历序列: "<<endl; bfsTraverse(graph); cout<<"深度优先遍历序列: "<<endl; dfsTraverse(graph); return 0; }