要使用的无向图如下图所示
代码如下
#include<iostream>
#include <queue>
using namespace std;
#define maxSize 10
//定义邻接表的边
typedef struct ArcNode {
char adjvex;
struct ArcNode* next;
}ArcNode;
//定义邻接表的顶点
typedef struct Vertex {
int vertex;
ArcNode* firstedge;
};
//定义图
typedef struct ALGraph {
Vertex vertices[maxSize];//邻接表的顶点数组
int vexnum, arcnum;//图的最大顶点数和最大边数
}ALGraph;
int visited[maxSize];//visited代表已经访问的数组
void set_visited(ALGraph* G) {//将visited数组的前vexnum个数据置为0
for (int i = 0; i < G->vexnum; i++) {
visited[i] = 0;
}
}
void Creat_AdjList(ALGraph* G, int n, int e, int arr[]) //创建图, 别忘记用引用
{
n = 5; e = 7;
G->vexnum = n;
G->arcnum = e;//将图的最大顶点数置为n, 最大边数置为e
//初始化顶点表
for (int i = 0; i < G->vexnum; i++)//i<5
{
G->vertices[i].vertex = arr[i];//给顶点数组中的每个顶点赋值, 分别是0,1,2,3,4
G->vertices[i].firstedge = NULL; //给每一个顶点的边表指针赋值为NULL, 因为还没有添加节点,所以边表是空的
}
//创建无向图 因为是无向图,有a->b的边,就会有b->a的边,所以创建了*s 和 *p指针
for (int i = 0; i < G->arcnum; i++)
{
int a, b;
cin >> a >> b; // 表示 a和b有一条边
ArcNode* s = new ArcNode;
s->adjvex = b; //边表的顶点值为 b
s->next = G->vertices[a].firstedge; //用头插法将顶点链接在边表,
G->vertices[a].firstedge = s;
ArcNode* p = new ArcNode;
p->adjvex = a;
p->next = G->vertices[b].firstedge;
G->vertices[b].firstedge = p;
}
}
void show_Graph(ALGraph G)
{
for (int i = 0; i < G.vexnum; i++)
{
ArcNode* p = G.vertices[i].firstedge;
while (p != NULL)
{
cout << "(" << i << "," << p->adjvex << ")";
p = p->next;
}
cout << endl;
}
}
//深度优先遍历代码实现
void DFSTraverse(ALGraph G, int v)//int v代表选取任意一个顶点作为起始顶点
{
cout << G.vertices[v].vertex << " ";
visited[v] = 1;//访问顶点并将该顶点的访问数组置为1
ArcNode* p = G.vertices[v].firstedge;
while (p != NULL)
{
int j = p->adjvex;
if (visited[j] == 0)
{
DFSTraverse(G, j);
}
p = p->next;
}
}
//广度优先遍历代码实现
void BFSTraverse(ALGraph G, int v, queue<int> Q)
{
cout << G.vertices[v].vertex << " ";//输出v位置的顶点数据
visited[G.vertices[v].vertex] = 1;//将已访问数组中的vertex位置的数据置为1
Q.push(G.vertices[v].vertex);//将顶点的数据入队
while (!Q.empty())//当队列不为空时持续循环
{
int val = Q.front();//将队首元素的值赋值给val
Q.pop();//出队, 用C语言实现的话相当于队首指针向后移动一位
ArcNode* p = G.vertices[val].firstedge;
while (p != NULL)
{
int j = p->adjvex;
if (!visited[j])
{
cout << G.vertices[j].vertex << " ";
visited[j] = 1;
Q.push(j);
}
p = p->next;
}
}
}
int main() {
int arr[5] = { 0,1,2,3,4 };
ALGraph* G = (ALGraph*)malloc(sizeof(ALGraph));
Creat_AdjList(G, 3, 4, arr);
}
主要分为四部分, 1.邻接表的定义 2.图的建立 3.深度优先遍历 4.广度优先遍历
建议先掌握邻接表的定义, 否则其它部分比较难看懂