# include <stdio.h>
# include <malloc.h>
# include <memory.h>
# define MAX 20 //顶点最大值
typedef struct ARCNODE
{
int num; //该边所指的顶点的位置
struct ARCNODE *next; //指向下一条边的指针
}arcnode; //表的结点
typedef struct VNODE
{
char data; //顶点信息
arcnode *firstarc; //指向第一条依附该顶点的边的弧指针
}adjlist[MAX]; //头结点
typedef struct
{
adjlist vertices;
bool visited[MAX]; //访问标志数组
int arcnum,vexnum; //图的顶点数和弧数
}mgraph;
void init_mgraph(mgraph &g) //初始化图
{
memset(g.visited,false,sizeof(bool)*MAX); //访问标志数组为false时,未访问
g.vexnum = 0;
g.arcnum = 0;
}
int locatevex(mgraph &g,char ch) //定位顶点ch在顶点向量中的位置
{
int i;
for (i=0; i<g.vexnum && ch != g.vertices[i].data; ++i)
;
if (i >= g.vexnum)
return -1;
return i;
}
void add_vex(mgraph &g) //增加顶点
{
printf ("请输入顶点个数\n");
scanf ("%d",&g.vexnum);
printf ("请输入顶点信息\n");
for (int i=0; i<g.vexnum; ++i)
{
scanf (" %c",&g.vertices[i].data); //构造结点向量
g.vertices[i].firstarc = NULL;
}
}
void add_arc(mgraph &g) //增加边
{
arcnode *s,*t;
printf ("输入边的个数\n");
scanf (" %d",&g.arcnum);
char ch1,ch2;
printf ("请输入边的信息\n");
for (int k=0; k<g.arcnum; ++k)
{
scanf (" %c %c",&ch1,&ch2);
int i = locatevex(g,ch1);
int j = locatevex(g,ch2); //定义ch1,ch2在顶点向量的位置
s = (arcnode *)malloc(sizeof(ARCNODE));
t = (arcnode *)malloc(sizeof(ARCNODE));
s->num = j; //该边所指向的顶点的位置为j
s->next = g.vertices[i].firstarc;
g.vertices[i].firstarc = s;
t->num = i; //该边所指向的顶点的位置为i
t->next = g.vertices[j].firstarc;
g.vertices[j].firstarc = t;
}
}
void creat_mgraph(mgraph &g) //构造邻接链表
{
add_vex(g);
add_arc(g);
}
void print_mgraph(mgraph &g) //输出图
{
int i;
arcnode *p;
printf("编号 顶点 邻接顶点\n");
for (i=0; i<g.vexnum; ++i)
{
printf (" %d %c ",i,g.vertices[i].data);
for (p=g.vertices[i].firstarc; p; p=p->next)
{
printf ("%d ",p->num);
}
printf ("\n");
}
}
void visit(mgraph &g,int i)
{
printf ("%c ",g.vertices[i].data);
g.visited[i] = true; //以访问
}
void BFStraverse(mgraph &g,int i) //广度优先搜索
{ //从i结点可是搜索
arcnode *p;
int quene[MAX]; //辅助数组
memset(quene,0,sizeof(int)*MAX);
int front = 0; //头指针
int rear = 0; //尾指针
int gettop; //取队头,标记结点位置
visit(g,i);
quene[rear++] = i; //入队
while (front != rear) //队列非空
{
gettop = quene[front++]; //出队
for (p=g.vertices[gettop].firstarc; p; p=p->next)
{
if (!g.visited[p->num])
{
visit(g,p->num);
quene[rear++] = p->num; //入队
}
}
}
}
int main (void)
{
mgraph g;
init_mgraph(g);
creat_mgraph(g);
print_mgraph(g);
BFStraverse(g,0);
return 0;
}
BFS--广度优先搜索--图的邻接表
最新推荐文章于 2022-07-23 12:52:48 发布