/*
图的深度优先遍历(邻接矩阵的存储结构):
注意:
1. 在创建图的邻接表的时候,需要传参 * ,因为指针传递能够改变实际的参数
2. 在创建一个数据结构的时候的思路就是:这个结构里面的有什么东西,把这些东西都附上值就可以了
*/
# include<iostream>
# include<string>
using namespace std;
// 图的最大顶点值
# define MAX 30
// 访问向量,判断某个顶点是否被访问
bool visited [MAX];
// 边结点
struct ArcNode{
int vex;
ArcNode * p;
};
// 顶点
struct VexNode{
char data;
ArcNode * arcp;
};
// 邻接矩阵
struct AdjList{
VexNode vertex[MAX];
int vexNum, arcNum;
};
// 深度搜索
void depthSearch(AdjList g, int v0){
cout << g.vertex[v0].data << endl;
visited[v0] = true;
ArcNode * p = g.vertex[v0].arcp;
while(p != NULL){
if (visited[p ->vex] != true)
depthSearch(g, p -> vex);
p = p -> p;
}
return;
}
// 遍历
void traverseGraph(AdjList g){
for (int i = 0; i < MAX; i++)
visited[i] = false;
// 针对非联通图
for(int i = 0; i < g.vexNum; i++)
if(!visited[i])
depthSearch(g, 0);
return;
}
// 定位
int location(AdjList * g, char data){
for (int i = 0; i < g -> vexNum; i++){
if (g -> vertex[i].data == data)
return i;
}
return -1;
}
// 创建邻接矩阵
void createList(AdjList * g){
char data1, data2;
cout << "请输入顶点数目: " << endl;
cin >> g->vexNum;
cout << "请输入边的数目: " << endl;
cin >> g->arcNum;
cout << "请输入顶点的值: ";
for (int i = 0; i < g->vexNum; i++){
cin >> g->vertex[i].data;
g -> vertex[i].arcp = NULL;
}
for (int k = 0; k < g -> arcNum; k++){
cout << "请输入第" << k <<"边的两端顶点值: ";
cin >> data1 >> data2;
int i = location(g, data1);
int j = location(g, data2);
if (i != -1 && j != -1){
ArcNode * p1 = (ArcNode *)malloc(sizeof(ArcNode));
p1 -> vex = j;
p1 -> p = g -> vertex[i].arcp;
g -> vertex[i].arcp = p1;
ArcNode * p2 = (ArcNode *)malloc(sizeof(ArcNode));
p2 -> vex = i;
p2 -> p = g -> vertex[j].arcp;
g -> vertex[j].arcp = p2;
}else{
cout << "输入有误,请重新输入" << endl;
}
}
}
int main(){
AdjList g;
createList(&g);
for(int i = 0; i < g.vexNum; i++){
cout << g.vertex[i].data << "\t";
ArcNode * p = g.vertex[i].arcp;
while(p != NULL){
cout << p -> vex << "\t";
p = p -> p;
}
cout << endl;
}
cout << "-------------------------------------" << endl;
traverseGraph(g);
return 0;
}
测试数据: