#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char VertexType[10];
//广度优先遍历
//先访问后入队
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
#define MAX_VERTEX_NUM 31
typedef int Status;
typedef struct ArcNode//弧节点结构体
{
int adjvex;
int data;
struct ArcNode * nextarc;
} ArcNode;
typedef struct VNode//顶点结构体
{
VertexType data;
ArcNode * firstarc;
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct //创建图的结构体
{
AdjList vertices; //顶点数组
int vexnum, arcnum; //顶点个数及弧的条数
} ALGraph;
typedef struct QNode//链队列
{
int data;
struct QNode *next;
} QNode,*QueuePtr;
typedef struct
{
QueuePtr front; //对头指针
QueuePtr rear; //队尾指针
} LinkQueue;
Status InitQueue(LinkQueue &Q)
{
//构造一个空队列Q
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q.front)
exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status QueueEmpty(LinkQueue Q)
{
//判断队列是否为空
if (Q.front->next==NULL)
return TRUE;
return FALSE;
}
Status EnQueue(LinkQueue &Q, int e)
{
//插入元素e为Q的新的队尾元素
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if (!p)
return ERROR;
p->next = NULL;
p->data = e;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status DeQueue(LinkQueue &Q, int &e)
{
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK
if (Q.front == Q.rear)
return ERROR;
QueuePtr p;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p)
Q.rear = Q.front;
free(p);
return OK;
}
int LocateVex(ALGraph G, VertexType v) //定位函数
{
int i;
for(i=0; i<G.vexnum; ++i)
if(strcmp(v,G.vertices[i].data)==0)
return i;
return -1;
}
void CreateGraph(ALGraph &G)
{
ArcNode *p;
int i,j,k;
VertexType v1,v2;
//printf("分别输入顶点个数和边的数目:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
//printf("分别输入各个顶点值:\n");
for(i=0; i<G.vexnum; i++)
{
scanf(" %s",G.vertices[i].data);
G.vertices[i].firstarc=NULL;//初始化
}
//printf("分别输入各条弧的弧尾和弧头:\n");
for(k=0; k<G.arcnum; k++)
{
scanf(" %s%s",v1,v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);//定位
p=(ArcNode*)malloc(sizeof(ArcNode));//申请一个结点
p->adjvex=j;
p->nextarc=NULL;//赋值
p->nextarc=G.vertices[i].firstarc;//连接结点
G.vertices[i].firstarc=p;//连接结点
}
}
int FirstAdjVex(ALGraph G,int v)
{
ArcNode *p;
p=G.vertices[v].firstarc;
if(p)
{
return p->adjvex;
}
else
return -1;
}
int NextAdjVex(ALGraph G,int v,int w)
{
ArcNode *p;
p=G.vertices[v].firstarc;
while(p&&p->adjvex!=w)
{
p=p->nextarc;
}
if(!p||!p->nextarc)
{
return -1;
}
else
return p->nextarc->adjvex;
}
void BFSTraverse(ALGraph G)
{
LinkQueue Q;
int u;
int visited[30];
int v,w;
ArcNode *p;
for(v=0; v<G.vexnum; v++)
{
visited[v]=FALSE;
}
InitQueue(Q);//置空的辅助队列Q
for(v=0; v<G.vexnum; v++)
{
if(!visited[v])//v尚未访问
{
visited[v]=TRUE;
printf("%s ",G.vertices[v].data);
EnQueue(Q,v);//v入队列
while(!QueueEmpty(Q))
{
DeQueue(Q,u);//队头元素出队并置为u
p=G.vertices[u].firstarc;
while(p)
{
if(!visited[p->adjvex])
{
visited[p->adjvex]=TRUE;
printf("%s ",G.vertices[p->adjvex].data);
EnQueue(Q,p->adjvex);
}
p=p->nextarc;
}
}
}
}
}
int main()
{
ALGraph G;
CreateGraph(G);
BFSTraverse(G);
return 0;
}
有向图的广度优先遍历
广度优先遍历:C++实现与应用
最新推荐文章于 2024-09-30 16:53:01 发布
本文介绍了如何使用C++实现广度优先搜索算法,通过创建图结构、顶点和弧节点,详细展示了图的创建、路径查找以及广度优先遍历的过程,适合初学者理解基本的数据结构和算法应用。
809

被折叠的 条评论
为什么被折叠?



