C语言邻接表、邻接矩阵的BFS/DFS方法实现
引入
看了一下,在网上似乎很少有邻接表和邻接矩阵的简单可行的BFS/DFS方法进行实现,于是我就把我的代码贴上来供大家参考好了。
C语言邻接表的BFS/DFS方法实现:
#include <stdio.h>
#include "stdlib.h"
#define VNum 100
int visited[VNum] = {0};
int visited2[VNum]={0};
typedef struct ArcNode {
int adjvex;
struct ArcNode *nextarc;
} ArcNode;//定义边结点
typedef struct VertexNode {
char data;
struct ArcNode *firstarc;
} VNode, AdjList[VNum];//定义头结点
typedef struct {
AdjList vexs;
int vnum, arcnum;
} ALGraph;//定义邻接表
ALGraph createALGraph() {
ALGraph G;
int v, e, k1, k2;
char a, b;
ArcNode *p1, *p2;
printf("请输入无向图的顶点数和边数:\n");
scanf("%d %d", &G.vnum, &G.arcnum);
getchar();
for (int i = 0; i < G.vnum; i++) {
printf("请输入顶点%d的值:\n", i + 1);
scanf("%c", &G.vexs[i].data);
getchar();
G.vexs[i].firstarc = NULL;
}//初始化头结点
for (int j = 0; j < G.arcnum; j++) {
printf("请输入无向图第%d条边的两端结点:\n", j + 1);
scanf("%c,%c", &a, &b);
getchar();
p1 = (ArcNode *) malloc(sizeof(ArcNode));
p1->adjvex = b - 'A';
p2 = (ArcNode *) malloc(sizeof(ArcNode));
p2->adjvex = a - 'A';
k1 = a - 'A';
k2 = b - 'A';
p1->nextarc = G.vexs[k1].firstarc;
G.vexs[k1].firstarc = p1;
p2->nextarc = G.vexs[k2].firstarc;
G.vexs[k2].firstarc = p2;
}//初始化边结点
return G;
}
void Print(ALGraph G) {
for (int i = 0; i < G.vnum; i++) {
ArcNode *node = G.vexs[i].firstarc;
printf("%c ->", G.vexs[i].data);
while (node != NULL) {
printf("%5c|", G.vexs[node->adjvex].data);
node = node->nextarc;
}
printf("\n");
}
}
void DFS(ALGraph G, VNode n) {
printf("%5c", n.data);
visited[n.data - 'A'] = 1;
for (ArcNode *node = n.firstarc; node != NULL; node = node->nextarc) {
if (visited[node->adjvex] == 0)
DFS(G, G.vexs[node->adjvex]);
}
}
void BFS(ALGraph G, VNode n) {
VNode queue[G.vnum];
ArcNode *temp;
int front = 0, rear = 0;
printf("\n接下来是BFS算法:\n");
printf("%5c", n.data);
visited2[n.data - 'A'] = 1;//设置已访问标签
queue[rear] = n;//结点入队
rear = (rear + 1) % G.vnum;
while (((rear + 1) % G.vnum) != front) {
temp = queue[front].firstarc;//出队
front = (front + 1) % G.vnum;
for (temp; temp != NULL; temp = temp->nextarc) {
if (!visited2[temp->adjvex]) {
printf("%5c", G.vexs[temp->adjvex].data);//进行访问并且输出
visited2[temp->adjvex] = 1;//设置访问过标记
queue[rear] = G.vexs[temp->adjvex];//入队
rear=(rear+1)%G.vnum;
}
}
}//当队不为空
}
int main() {
ALGraph G;
G = createALGraph();
Print(G);
printf("\n接下来是DFS遍历:\n");
DFS(G, G.vexs[0]);
printf("\n");
BFS(G,G.vexs[1]);
}
邻接矩阵的BFS/DFS实现及结构体的定义:
#include <stdio.h>
#define VNum 100
int visited[VNum]={0};
int BFSVisited[VNum]={0};
typedef struct {
char vexs[VNum];
int edges[VNum][VNum];
int v, e;
}Graph,AMGraph;
void Create2(Graph *G){
int v, e;
char a, b;
printf("请输入图的边数和顶点数:\n");
scanf("%d %d", &e, &v);
getchar();
G->v = v;
G->e = e;
for (int i = 0; i < G->v; i++) {
printf("请输入顶点%d的值:\n", i + 1);
scanf("%c", &G->vexs[i]);
getchar();
}
for (int i = 0; i < G->e; i++) {
printf("请输入第%d条边的两边顶点:\n", i + 1);
scanf("%c,%c", &a, &b);
getchar();
G->edges[a - 'A'][b - 'A'] = 1;
G->edges[b - 'A'][a - 'A'] = 1;
}
printf("初始化完成!\n");
for (int i = 0; i < G->v; i++) {
for (int j = 0; j < G->v; j++) {
printf("%d ", G->edges[i][j]);
}
printf("\n");
}
}
AMGraph createAMGraph() {
AMGraph G;
int v, e;
char a, b;
printf("请输入图的边数和顶点数:\n");
scanf("%d %d", &e, &v);
getchar();
G.v = v;
G.e = e;
for (int i = 0; i < G.v; i++) {
printf("请输入顶点%d的值:\n", i + 1);
scanf("%c", &G.vexs[i]);
getchar();
}
for (int i = 0; i < G.e; i++) {
printf("请输入第%d条边的两边顶点:\n", i + 1);
scanf("%c,%c", &a, &b);
getchar();
G.edges[a - 'A'][b - 'A'] = 1;
G.edges[b - 'A'][a - 'A'] = 1;
}
printf("初始化完成!\n");
for (int i = 0; i < G.v; i++) {
for (int j = 0; j < G.v; j++) {
printf("%d ", G.edges[i][j]);
}
printf("\n");
}
return G;
}
void DFS(AMGraph G,int v){
printf("%5c",G.vexs[v]);
visited[v]=1;
for(int i=0;i<G.v;i++){
if((G.edges[v][i]==1)&&(!visited[i]))
DFS(G,i);
}
}
void BFS(AMGraph G,int v){
printf("\n接下来是BFS算法:\n");
int queue[G.v],temp;//初始化队列queue用数组表示
int front = 0, rear = 0;//初始化队列指针
printf("%3c",G.vexs[v]);
BFSVisited[v]=1;
queue[rear]=v;//入队
rear=(rear+1)%G.v;//入队
while (((rear + 1) % G.v) != front){
temp=queue[front];//出队
front=(front+1)%G.v;
for(int i=0;i<G.v;i++){
if((G.edges[temp][i]!=0)&&!(BFSVisited[i])){
printf("%3c",G.vexs[i]);
BFSVisited[i]=1;
queue[rear]=i;
rear=(rear+1)%G.v;
}//存在边并且后面这个节点没有被访问过则进行访问并入队
}
}
}
int main() {
Graph G;
AMGraph G1;
Create2(&G);
char temp;
printf("请输入您要开始进行DFS的顶点:");
scanf("%c",&temp);
DFS(G,temp-'A');
BFS(G,temp-'A');
return 0;
}
保存一下,当个纪念吧~