邻接表实现
//无向图的邻接表
#include<iostream>
using namespace std;
const int MAX = 20;
struct ArcNode { //边节点
int adjvex; //存储图中节点的下标
ArcNode * next;
};
typedef struct {
int vertex; //存储图中节点的数据
ArcNode * firstEdge; //表头指针
} vertexNode[MAX];
class ALGraph {
private:
int vertexNum; //节点数
int arcNum; //边数
vertexNode adjList; //创建表头
public:
ALGraph(int v[], int n, int e); //构造函数
void display();
//静态创建数组,无需定义析构函数
void DFS(int v, int * visited);
void DFSTraverse(int *visited);
};
ALGraph::ALGraph(int v[], int n, int e) {
vertexNum = n; //节点数
arcNum = e; //边数
//表头数据初始化
for (int i = 0; i < vertexNum; i++) {
adjList[i].vertex = v[i];
adjList[i].firstEdge = NULL;
}
int vi, vj;
ArcNode *s;
//插入节点
for (int i = 0; i < arcNum; i++) {
cout << "请输入第" << i + 1 << "条边依附的两个顶点的编号" << endl;
cin >> vi >> vj;
s = new ArcNode;
s->adjvex = vj;
s->next = adjList[vi].firstEdge; //头插法
adjList[vi].firstEdge = s;
}
}
void ALGraph::display() {
for (int i = 0; i < vertexNum; i++) {
cout << adjList[i].vertex;
ArcNode * p = adjList[i].firstEdge;
if (p) {
cout << "->";
}
while (p) {
cout << p->adjvex << " ";
p = p->next;
if (p) {
cout << "->";
}
}
cout << endl;
}
}
void ALGraph::DFSTraverse(int * visited) {
int i;
for (i = 0; i < vertexNum; i++) {
visited[i] = 0;
}
for (i = 0; i < vertexNum; i++) {
if (!visited[i]) {
DFS(i, visited);
}
}
}
void ALGraph::DFS(int v, int *visited) {
// static int visited[MAX] = {0};
visited[v] = 1;
cout << adjList[v].vertex << " ";
ArcNode *p = adjList[v].firstEdge;
while (p) {
if (!visited[p->adjvex]) {
DFS(p->adjvex, visited);
}
p = p->next;
}
}
int main() {
// static int visited[MAX] = {0};
// int v[4] = {0, 1, 2, 3};
// ALGraph algraph(v, 4, 4);
// algraph.display();
// algraph.DFSTraverse(visited);
// return 0;
static int visited[MAX] = {0};
int num;
cout << "请输入边的数量:" << endl;
cin >> num;
cin.sync();
cin.clear();
int v[num] = {0};
cout << "请输入节点信息:" << endl;
for (int i = 0; i < num; i++) {
cin >> v[i];
}
ALGraph algraph1(v, num, num);
algraph1.display();
algraph1.DFSTraverse(visited);
return 0;
}