BFS--广度优先搜索--图的邻接表

来源:互联网 发布:网络协议的四层模型 编辑:程序博客网 时间:2024/05/01 00:03
# 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;//该边所指向的顶点的位置为js->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;}

0 0
原创粉丝点击