1.以邻接表的存储方式,用c语言实现图的BFS和DFS遍历 输入: 第一行输入两个数m, n,表示图有m个顶点(所有顶点的字母各不相同),n条边; 接下来n行每行输入两个顶点,表示这两个顶点之间有边相连; 最后一行输入遍历开始的顶点 输出: 从遍历开始的顶点出发,分别输出图的BFS和DFS遍历的结果
时间: 2024-03-10 07:51:24 浏览: 121
数据结构-c语言-带main函数-图7.2-图的存储结构-图的邻接表的创建-无向图。
5星 · 资源好评率100%
好的,我可以帮您解答这个问题。
首先,对于邻接表的存储方式,我们可以使用一个结构体数组来表示每个顶点以及与之相连的边。具体定义如下:
```c
#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;
```
接下来,我们可以分别实现BFS和DFS遍历算法。
BFS遍历算法可以使用队列来实现。具体实现如下:
```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 InitGraph(ALGraph *G){
int i;
for(i = 0; i < MAX_VERTEX_NUM; i++){
G->vertices[i].data = '0';
G->vertices[i].firstarc = NULL;
}
G->vexnum = 0;
G->arcnum = 0;
}
//插入顶点
void InsertVertex(ALGraph *G, char v){
G->vertices[G->vexnum].data = v;
G->vexnum++;
}
//插入边
void InsertArc(ALGraph *G, int v, int w){
ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = w;
p->nextarc = G->vertices[v].firstarc;
G->vertices[v].firstarc = p;
G->arcnum++;
}
//查找顶点在结点数组中的位置下标
int LocateVex(ALGraph G, char v){
int i;
for(i = 0; i < G.vexnum; i++){
if(G.vertices[i].data == v){
return i;
}
}
return -1;
}
//BFS遍历
void BFS(ALGraph G, int v){
int visited[MAX_VERTEX_NUM];
int i, j;
for(i = 0; i < G.vexnum; i++){
visited[i] = 0;
}
visited[v] = 1;
printf("%c ", G.vertices[v].data);
int queue[MAX_VERTEX_NUM];
int front = 0, rear = 0;
queue[rear] = v;
rear = (rear + 1) % MAX_VERTEX_NUM;
while(front != rear){
j = queue[front];
front = (front + 1) % MAX_VERTEX_NUM;
ArcNode *p = G.vertices[j].firstarc;
while(p != NULL){
if(visited[p->adjvex] == 0){
visited[p->adjvex] = 1;
printf("%c ", G.vertices[p->adjvex].data);
queue[rear] = p->adjvex;
rear = (rear + 1) % MAX_VERTEX_NUM;
}
p = p->nextarc;
}
}
}
//DFS遍历
void DFS(ALGraph G, int v, int visited[]){
visited[v] = 1;
printf("%c ", G.vertices[v].data);
ArcNode *p = G.vertices[v].firstarc;
while(p != NULL){
if(visited[p->adjvex] == 0){
DFS(G, p->adjvex, visited);
}
p = p->nextarc;
}
}
int main(){
int m, n;
scanf("%d %d", &m, &n);
ALGraph G;
InitGraph(&G);
int i;
char v1, v2;
for(i = 0; i < m; i++){
scanf(" %c", &v1);
InsertVertex(&G, v1);
}
for(i = 0; i < n; i++){
scanf(" %c %c", &v1, &v2);
InsertArc(&G, LocateVex(G, v1), LocateVex(G, v2));
InsertArc(&G, LocateVex(G, v2), LocateVex(G, v1));
}
scanf(" %c", &v1);
BFS(G, LocateVex(G, v1));
printf("\n");
int visited[MAX_VERTEX_NUM];
for(i = 0; i < G.vexnum; i++){
visited[i] = 0;
}
DFS(G, LocateVex(G, v1), visited);
printf("\n");
return 0;
}
```
其中,visited数组用于记录遍历过的顶点,front和rear分别表示队列的头和尾。
DFS遍历算法可以使用递归方式实现。具体实现如下:
```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 InitGraph(ALGraph *G){
int i;
for(i = 0; i < MAX_VERTEX_NUM; i++){
G->vertices[i].data = '0';
G->vertices[i].firstarc = NULL;
}
G->vexnum = 0;
G->arcnum = 0;
}
//插入顶点
void InsertVertex(ALGraph *G, char v){
G->vertices[G->vexnum].data = v;
G->vexnum++;
}
//插入边
void InsertArc(ALGraph *G, int v, int w){
ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = w;
p->nextarc = G->vertices[v].firstarc;
G->vertices[v].firstarc = p;
G->arcnum++;
}
//查找顶点在结点数组中的位置下标
int LocateVex(ALGraph G, char v){
int i;
for(i = 0; i < G.vexnum; i++){
if(G.vertices[i].data == v){
return i;
}
}
return -1;
}
//DFS遍历
void DFS(ALGraph G, int v, int visited[]){
visited[v] = 1;
printf("%c ", G.vertices[v].data);
ArcNode *p = G.vertices[v].firstarc;
while(p != NULL){
if(visited[p->adjvex] == 0){
DFS(G, p->adjvex, visited);
}
p = p->nextarc;
}
}
int main(){
int m, n;
scanf("%d %d", &m, &n);
ALGraph G;
InitGraph(&G);
int i;
char v1, v2;
for(i = 0; i < m; i++){
scanf(" %c", &v1);
InsertVertex(&G, v1);
}
for(i = 0; i < n; i++){
scanf(" %c %c", &v1, &v2);
InsertArc(&G, LocateVex(G, v1), LocateVex(G, v2));
InsertArc(&G, LocateVex(G, v2), LocateVex(G, v1));
}
scanf(" %c", &v1);
int visited[MAX_VERTEX_NUM];
for(i = 0; i < G.vexnum; i++){
visited[i] = 0;
}
DFS(G, LocateVex(G, v1), visited);
printf("\n");
return 0;
}
```
其中,visited数组用于记录遍历过的顶点。
注意:这里的代码实现仅供参考,如果您想要使用这段代码,请自行进行测试和修改。
阅读全文