#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define NULL 0
#define MAX_VERTEX_NUM 20 // 最大顶点数
typedef char VertexType;
typedef int VRType;
typedef int InforType;
typedef struct ArcNode
{
int adjvex; //该边所指的顶点的位置
struct ArcNode *nextarc; //指向下一条边的指针
//int weight; //边的权
}ArcNode; //表的结点
typedef struct VNode
{
VertexType data; //顶点信息(如数据等)
ArcNode *firstarc; //指向第一条依附该顶点的边的弧指针
}VNode, AdjList[MAX_VERTEX_NUM]; //头结点
typedef struct ALGraph
{
AdjList vertices;
int visited[MAX_VERTEX_NUM]; //访问标志数组
int vexnum, arcnum; //图的当前顶点数和弧数
}ALGraph;
//初始化图
void init_ALGraph(ALGraph &g)
{
for(int i=0;i<MAX_VERTEX_NUM;i++)
g.visited[i]=0; //访问标志数组置0,表示没有被访问
g.vexnum=0;
g.arcnum=0;
}
//返回顶点v在顶点向量中的位置
int LocateVex(ALGraph &G, char v)
{
int i;
for(i = 0; v != G.vertices[i].data && i < G.vexnum; i++)
;
if(i >= G.vexnum)
return -1;
return i;
}
//增加节点
void add_vex(ALGraph &G)
{
cout<<"输入无向图顶点数: "<<endl;
cin>>G.vexnum;
//getchar(); //吃回车
cout<<"输入顶点信息:"<<endl;
for(int i = 0; i < G.vexnum; i++)
{
cin>>G.vertices[i].data; //构造顶点向量
G.vertices[i].firstarc = NULL;
//getchar();
}
}
//增加边
void add_arc(ALGraph &G)
{
ArcNode *s, *t;
cout<<"输入无向图边数: "<<endl;
cin>>G.arcnum;
char v1, v2;
cout<<"输入边信息:"<<endl;
for(int k = 0; k < G.arcnum; k++)
{
cin>>v1>>v2;
int i = LocateVex(G, v1);
int j = LocateVex(G, v2); //确定v1 , v2在G中的位置
s = (ArcNode*) malloc (sizeof(ArcNode));
t = (ArcNode*) malloc (sizeof(ArcNode));
s->adjvex = j; //该边所指向的顶点的位置为j
s->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc =s;
t->adjvex = i; //该边所指向的顶点的位置为j
t->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc =t;
}
}
//构造邻接链表
void CreateUDN(ALGraph &G)
{
add_vex(G); //增加节点
add_arc(G); //增加边
}
void PrintAdjList(ALGraph &G)
{
int i;
ArcNode *p;
cout<<"编号 顶点 邻点编号"<<endl;
for(i = 0; i < G.vexnum; i++)
{
cout<<" "<<i<<" "<<G.vertices[i].data<<" ";
for(p = G.vertices[i].firstarc; p; p = p->nextarc)
cout<<p->adjvex<<" ";
cout<<endl;
}
}
void Visit(ALGraph &g,int i)
{
cout<<g.vertices[i].data<<" ";
g.visited[i]=1; //将访问标志置为1
}
//广度优先搜索
void BFSTraverse(ALGraph &g,int i) //从第i个顶点开始搜索
{
ArcNode *p;
int Queue[MAX_VERTEX_NUM]; //辅助队列
for(int j=0;j<MAX_VERTEX_NUM;j++)
Queue[j]=0;
int front=0,rear=0; //头指针和尾指针
int gettop; //取对头,它是节点的编号
Visit(g,i);
Queue[rear++]=i; //入队
while(front != rear) //队列非空时
{
gettop=Queue[front];
front++; //出队列
for(p = g.vertices[gettop].firstarc; p; p = p->nextarc)
if( !g.visited[p->adjvex] )
{
Visit(g,p->adjvex);
Queue[rear++]=p->adjvex; //入队
}
}//while
}
int main()
{
ALGraph G;
init_ALGraph(G); //初始化图
CreateUDN(G); //创建图
PrintAdjList(G); //打印图
BFSTraverse(G,0); //广度优先搜索
return 0;
}
数据结构——图的邻接表的广度优先搜索
最新推荐文章于 2023-08-03 22:37:28 发布