C语言实现邻接表表示无向图的广度优先遍历
- 邻接表的存储结构
- 创建邻接表表示的无向图
- 定义广度优先遍历的队列基本操作
- 广度优先遍历算法
- 测试代码整合
邻接表的存储结构
typedef int OtherInfo;
typedef int Status;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
OtherInfo info;
}ArcNode;
typedef struct VNode
{
char data;
ArcNode *firstArc;
}VNode,adjList[MVNum];
typedef struct
{
adjList vertices;
int vexnum,arcnum;
}ALGraph;
创建邻接表表示的无向图
int LocateVex(ALGraph G,char v)
{
for(int i=0;i<G.vexnum;i++)
if(G.vertices[i].data == v) return i;
return -1;
}
void CreateUDG(ALGraph *G)
{
printf("请输入顶点数和边数:");
scanf("%d %d",&G->vexnum,&G->arcnum);
printf("请输入%d个顶点:",G->vexnum);
for(int i=0;i<G->vexnum;i++)
{
scanf(" %c",&G->vertices[i].data);
G->vertices[i].firstArc = NULL;
}
for(int i=0;i<G->arcnum;i++)
{
int i,j;
char v1,v2;
printf("请输入边对应的顶点:");
scanf(" %c%c",&v1,&v2);
i=LocateVex(*G,v1);
j=LocateVex(*G,v2);
ArcNode *p1 = (ArcNode *)malloc(sizeof(ArcNode));
p1->nextarc=G->vertices[i].firstArc;
p1->adjvex = j;
p1->info = 1;
G->vertices[i].firstArc = p1;
ArcNode *p2 = (ArcNode *)malloc(sizeof(ArcNode));
p2->nextarc = G->vertices[j].firstArc;
p2->adjvex = i;
p2->info = 1;
G->vertices[j].firstArc = p2;
}
}
定义广度优先遍历的队列基本操作
typedef struct
{
int *base;
int front;
int rear;
}SqQueue;
Status InitQueue(SqQueue *Q)
{
Q->base = (int *)malloc(MAXSIZE);
if(Q->base == NULL) return ERROR;
Q->front = Q->rear = 0;
return OK;
}
Status EnQueue(SqQueue *Q,int e)
{
if(Q->rear+1 == Q->rear) return ERROR;
Q->base[Q->rear] = e;
Q->rear = (Q->rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(SqQueue *Q,int *e)
{
if(Q->front == Q->rear) return ERROR;
*e = Q->base[Q->front];
Q->front = (Q->front+1)%MAXSIZE;
return OK;
}
Status QueueEmpty(SqQueue Q)
{
if(Q.front == Q.rear) return TRUE;
return FALSE;
}
广度优先遍历算法
int visited[MVNum];
void BFS(ALGraph G,int i)
{
ArcNode *p;
SqQueue Q;
int e;
for(int i=0;i<G.vexnum;i++)
visited[i]=0;
InitQueue(&Q);
EnQueue(&Q,i);
printf("%c",G.vertices[i].data);
visited[i]=1;
while(!QueueEmpty(Q))
{
DeQueue(&Q,&e);
p=G.vertices[e].firstArc;
while(p)
{
if(!visited[p->adjvex])
{
printf("%c",G.vertices[p->adjvex].data);
visited[p->adjvex]=1;
EnQueue(&Q,p->adjvex);
}
p=p->nextarc;
}
}
}
测试代码整合
#include
#include
#define OK 1
#define ERROR 0
#define MAXSIZE 10
#define MVNum 100
#define TRUE 1
#define FALSE 0
typedef int OtherInfo;
typedef int Status;
typedef struct
{
int *base;
int front;
int rear;
}SqQueue;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
OtherInfo info;
}ArcNode;
typedef struct VNode
{
char data;
ArcNode *firstArc;
}VNode,adjList[MVNum];
typedef struct
{
adjList vertices;
int vexnum,arcnum;
}ALGraph;
Status InitQueue(SqQueue *Q)
{
Q->base = (int *)malloc(MAXSIZE);
if(Q->base == NULL) return ERROR;
Q->front = Q->rear = 0;
return OK;
}
Status EnQueue(SqQueue *Q,int e)
{
if(Q->rear+1 == Q->rear) return ERROR;
Q->base[Q->rear] = e;
Q->rear = (Q->rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(SqQueue *Q,int *e)
{
if(Q->front == Q->rear) return ERROR;
*e = Q->base[Q->front];
Q->front = (Q->front+1)%MAXSIZE;
return OK;
}
Status QueueEmpty(SqQueue Q)
{
if(Q.front == Q.rear) return TRUE;
return FALSE;
}
int LocateVex(ALGraph G,char v)
{
for(int i=0;i<G.vexnum;i++)
if(G.vertices[i].data == v) return i;
return -1;
}
void CreateUDG(ALGraph *G)
{
printf("请输入顶点数和边数:");
scanf("%d %d",&G->vexnum,&G->arcnum);
printf("请输入%d个顶点:",G->vexnum);
for(int i=0;i<G->vexnum;i++)
{
scanf(" %c",&G->vertices[i].data);
G->vertices[i].firstArc = NULL;
}
for(int i=0;i<G->arcnum;i++)
{
int i,j;
char v1,v2;
printf("请输入边对应的顶点:");
scanf(" %c%c",&v1,&v2);
i=LocateVex(*G,v1);
j=LocateVex(*G,v2);
ArcNode *p1 = (ArcNode *)malloc(sizeof(ArcNode));
p1->nextarc=G->vertices[i].firstArc;
p1->adjvex = j;
p1->info = 1;
G->vertices[i].firstArc = p1;
ArcNode *p2 = (ArcNode *)malloc(sizeof(ArcNode));
p2->nextarc = G->vertices[j].firstArc;
p2->adjvex = i;
p2->info = 1;
G->vertices[j].firstArc = p2;
}
}
int visited[MVNum];
void BFS(ALGraph G,int i)
{
ArcNode *p;
SqQueue Q;
int e;
for(int i=0;i<G.vexnum;i++)
visited[i]=0;
InitQueue(&Q);
EnQueue(&Q,i);
printf("%c",G.vertices[i].data);
visited[i]=1;
while(!QueueEmpty(Q))
{
DeQueue(&Q,&e);
p=G.vertices[e].firstArc;
while(p)
{
if(!visited[p->adjvex])
{
printf("%c",G.vertices[p->adjvex].data);
visited[p->adjvex]=1;
EnQueue(&Q,p->adjvex);
}
p=p->nextarc;
}
}
}
int main()
{
ALGraph G;
CreateUDG(&G);
BFS(G,0);
return 0;
}
【图】

【结果】
