实现图的存储,输出存储结构示意图; 输出对建立的图进行深度优先搜索和广度优先搜索所得的遍历序列(C语言,邻接表)
时间: 2024-01-22 11:20:30 浏览: 60
建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc
5星 · 资源好评率100%
图的存储方式一般有两种:邻接矩阵和邻接表。邻接矩阵是一个二维数组,用来表示顶点之间的关系,其中数组元素表示两个顶点之间是否有边,邻接矩阵适用于边数比较稠密的图;邻接表则是由若干个单链表组成的数组,每个单链表表示一个顶点的邻接点,适用于边数比较稀疏的图。下面是邻接表的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 //最大顶点数
typedef struct ArcNode { //弧表结点
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
}ArcNode;
typedef struct VNode { //顶点表结点
char data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct { //邻接表
AdjList vertices; //邻接表的头结点数组
int vexnum, arcnum; //图的当前顶点数和弧数
}ALGraph;
//创建邻接表
void CreateALGraph(ALGraph *G) {
int i, j, k;
ArcNode *p;
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->vexnum, &G->arcnum);
printf("请输入顶点信息:\n");
for (i = 0; i < G->vexnum; i++) {
scanf(" %c", &G->vertices[i].data);
G->vertices[i].firstarc = NULL;
}
printf("请输入边的信息:\n");
for (k = 0; k < G->arcnum; k++) {
printf("请输入边(vi, vj)的顶点序号:\n");
scanf("%d%d", &i, &j);
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G->vertices[i].firstarc;
G->vertices[i].firstarc = p;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = i;
p->nextarc = G->vertices[j].firstarc;
G->vertices[j].firstarc = p;
}
}
//深度优先搜索
void DFS(ALGraph G, int v, int visited[]) {
ArcNode *p;
visited[v] = 1;
printf("%c ", G.vertices[v].data);
p = G.vertices[v].firstarc;
while (p) {
if (!visited[p->adjvex]) {
DFS(G, p->adjvex, visited);
}
p = p->nextarc;
}
}
//广度优先搜索
void BFS(ALGraph G, int v, int visited[]) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
ArcNode *p;
visited[v] = 1;
printf("%c ", G.vertices[v].data);
queue[rear++] = v;
while (front < rear) {
p = G.vertices[queue[front++]].firstarc;
while (p) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = 1;
printf("%c ", G.vertices[p->adjvex].data);
queue[rear++] = p->adjvex;
}
p = p->nextarc;
}
}
}
//遍历邻接表
void TraverseALGraph(ALGraph G) {
int i;
ArcNode *p;
printf("邻接表:\n");
for (i = 0; i < G.vexnum; i++) {
printf("%c: ", G.vertices[i].data);
p = G.vertices[i].firstarc;
while (p) {
printf("%d ", p->adjvex);
p = p->nextarc;
}
printf("\n");
}
}
int main() {
ALGraph G;
int visited[MAX_VERTEX_NUM] = { 0 };
CreateALGraph(&G);
TraverseALGraph(G);
printf("深度优先搜索序列为:\n");
DFS(G, 0, visited);
printf("\n");
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
printf("广度优先搜索序列为:\n");
BFS(G, 0, visited);
printf("\n");
return 0;
}
```
其中,CreateALGraph函数用于创建邻接表,DFS函数用于进行深度优先搜索,BFS函数用于进行广度优先搜索,TraverseALGraph函数用于输出邻接表。需要注意的是,visited数组用于记录顶点是否被访问过,初始化为0。
阅读全文