#include <iostream>
#include <queue>
#define MaxSize 10
using namespace std;
bool visited[MaxSize]; //全局数组,记录结点是否已补访问
typedef struct edgenode { //边表结点
int adjvex; //邻接点
int weight; //权值
edgenode *next; //下一条边
};
typedef struct vertexnode { //顶点结点
char data; //结点数据
edgenode *fist; //指向第一条边
}AdjList[MaxSize];
typedef struct AdjListGraph {
AdjList adjlist; //邻接表
int vex; //顶点数
int edge; //边数
};
void Init(AdjListGraph &G) { //初始化为未访问
for (int i = 0; i < MaxSize; i++) {
visited[i] = false;
}
}
int Location(AdjListGraph &G,char c) { //寻找顶点数据的邻接点
for (int i = 0; i < G.vex; i++) {
if (G.adjlist[i].data == c) {
return i;
}
}
return -1;
}
void Create(AdjListGraph &G) { //创建图
cout << "请输入该图的顶点数以及边数:" << endl;
cin >> G.vex >> G.edge;
cout << "请输入相关顶点:" << endl;
for (int i = 0; i < G.vex; i++) {
cin >> G.adjlist[i].data;
G.adjlist[i].fist = NULL;
}
char a, b;
int m, n;
cout << "请输入相关边的顶点:" << endl;
for (int i = 0; i < G.edge; i++) {
cin >> a >> b;
m = Location(G, a); //寻找顶点号
n = Location(G, b);
if (m != -1 && n != -1) { //寻找到位置
edgenode *temp = new edgenode;
temp->adjvex = n;
temp->next = G.adjlist[m].fist;
G.adjlist[m].fist = temp;
}
}
}
void DFS(AdjListGraph &G,int v) { //图的深度遍历
int w;
if (visited[v] == false) {
cout << G.adjlist[v].data << " ";
visited[v] = true; //设置已访问过
}
edgenode *temp = G.adjlist[v].fist;
if (temp != NULL) {
w = temp->adjvex;
if (visited[w] == false) {
DFS(G, w);
}
while (temp->next != NULL) {
temp = temp->next;
w = temp->adjvex;
if (visited[w] == false) {
DFS(G, w);
}
}
}
}
void DFS_Main(AdjListGraph &G) { //这个函数的存在是防止不连通图的存在
for (int i = 0; i < G.vex; i++) {
if (visited[i] == false) {
DFS(G,i);
}
}
}
int main() {
AdjListGraph G;
Init(G);
Create(G); //创建图
DFS_Main(G);
system("pause");
return 0;
}
/*
8 7 a b c d e f g h
a b
a f
b c
b d
d e
f g
f h
*/
图的深度遍历(邻接表)
原文作者:数据结构之图
原文地址: https://blog.csdn.net/coolsunxu/article/details/80628076
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/coolsunxu/article/details/80628076
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。