图实验(邻接表)
用邻接表实现图的存储,并完成深度优先遍历和广度优先遍历
头文件
#pragma once
const int MaxSize = 10;
struct EdgeNode {//边结点
int adjvex;//邻接点域
EdgeNode* next;
};
struct VertexNode {//顶点
char vertex;
EdgeNode* firstEdge;
};
class ALGraph
{
public:
ALGraph(char a[], int n, int e);
~ALGraph();
void BFT(int v);//广度优先遍历
void DFT(int v);//深度优先遍历
int visited[MaxSize];//判断结点是否被访问过
private:
VertexNode adjlist[MaxSize];//存放顶点表的数组
int vertexNum, edgeNum;//顶点数,边数
};
源文件
#include "ALGraph.h"
#include<iostream>
ALGraph::ALGraph(char a[], int n, int e) {
EdgeNode* s = nullptr;
vertexNum = n, edgeNum = e;
//初始化顶点表
for (int i = 0; i < vertexNum; i++) {
adjlist[i].vertex = a[i];
adjlist[i].firstEdge = nullptr;
visited[i] = 0;
}
for (int i = 0; i < edgeNum; i++) {
std::cout << "输入边表信息:";
int j, k;//输入边
std::cin >> j >> k;
//生成一条表并将其插入表中
//类似单链表的头插法
s = new EdgeNode;
s->adjvex = k;
s->next = adjlist[j].firstEdge;
adjlist[j].firstEdge = s;
}
}
ALGraph::~ALGraph() {
EdgeNode* p = nullptr, * q = nullptr;
for (int i = 0; i < vertexNum; i++) {
p = q = adjlist[i].firstEdge;
while (p != nullptr) {
p = p->next;
delete q;
q = p;
}
}
}
void ALGraph::DFT(int v) {
EdgeNode* p = nullptr;
std::cout << adjlist[v].vertex;
visited[v] = 1;
p = adjlist[v].firstEdge;//p指向顶点v的边表
while (p != nullptr) {
int j;
j = p->adjvex;
if (visited[j] == 0) {
DFT(j);
}
p = p->next;
}
}
void ALGraph::BFT(int v) {
int Q[MaxSize];
int front = -1, rear = -1;
EdgeNode* p = nullptr;
std::cout << adjlist[v].vertex;
visited[v] = 1;
Q[++rear] = v;//被访问的顶点入队
while (front != rear) {
int w = Q[++front];//出队
p = adjlist[w].firstEdge;//p指向边表
while (p != nullptr) {
int j = p->adjvex;
if (visited[j] == 0) {
std::cout << adjlist[j].vertex;
visited[j] = 1;
Q[++rear] = j;//入队
}
p = p->next;
}
}
}
测试程序
#include<iostream>
using namespace std;
#include"ALGraph.h"
int main() {
char ch[] = { 'A','B','C','D','E' };
ALGraph ALG(ch, 5, 6);
cout << "\n深度优先遍历序列是:";
ALG.DFT(0);//从0出发
for (int i = 0; i < MaxSize; i++) {
ALG.visited[i] = 0;
}
cout << "\n广度优先遍历序列是:";
ALG.BFT(0);//从0出发
}