知识大全 邻接表表示的图的深度优先搜索和广度优先搜索程序
Posted 结点
篇首语:知识是为老年准备的最好食粮。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 邻接表表示的图的深度优先搜索和广度优先搜索程序相关的知识,希望对你有一定的参考价值。
邻接表表示的图的深度优先搜索和广度优先搜索程序
#include <stdio h>#define maxvertexnum #define queuesize #define null
typedef struct int front rear count data[queuesize]; cirqueue;//循环队列结构定义
typedef int vertextype;//为了简单 设图中结点的数据为整型typedef struct node int adjvex;//存放邻接点序号 struct node *next;//指向下一个边结点 edgenode;//图的邻接表的边结点定义
typedef struct vnode vertextype vertex;//顶点数据域 edgenode *firstedge;//指向第一个边结点 vertexnode;//图的邻接表表示的顶点结点定义
typedef vertexnode adjlist[maxvertexnum];//用向量定义图的邻接表表示的顶点表
typedef struct adjlist adjlist; int n;//图的顶点数 int e;//图的边数 algraph;//定义图的邻接表
typedef enumFALSE TRUEboolean;boolean visited[maxvertexnum];//保存访问信息的布尔向量
main()//主函数 //建立图g 并进行深度优先搜索和广度优先搜索 algraph *g; g=(algraph*)malloc(sizeof(algraph));//申请图g的邻接表空间 createalgraph(g);//建立图g的邻接表表示 printf( the dfs is: );/ dfstraverse(g);//对图g进行深度优先搜索 并打印搜索序列 printf( the bfs is: ); bfstraverse(g);//对图g进行广度优先搜索 并打印搜索序列
createalgraph(algraph *g) //建立图g的邻接表表示 int i j k; int flag; edgenode *s; printf( \\ncreat:\\n )//选择建立有向图或无向图 printf( digraph \\n ); printf( undigraph \\n ); scanf( %d &flag); printf( input n e\\n ); scanf( %d%d &g >n &g >e);//输入图g的顶点数和边数 printf( input nodes:\\n ); for(i= ;i<g >n;i++)//构造一个只含n个顶点 边数为 的图 scanf( %d &(g >adjlist[i] vertex)); //输入顶点的数据域(为了简单起见 输入为整数) g >adjlist[i] firstedge=null;//将顶点结点的firstedge域置为空 //end for for(k= ;k<g >e;k++) printf( input i j( ~n ):\\n ); scanf( %d%d &i &j);//输入对应于一条边的顶点序号序偶对 要求顶点序号为 ~n s=(edgenode *)malloc(sizeof(edgenode));//申请一个边结点*s s >adjvex=j;//将序号j放入边结点*s的adjvex域 s >next=g >adjlist[i] firstedge; //将边结点*s作为第一个邻接点插入到序号为i的顶点的边表中 g >adjlist[i] firstedge=s; if (flag)//若要建立无向图 s=(edgenode *)malloc(sizeof(edgenode));申请一个边结点*s s >adjvex=i;//将序号i放入边结点*s的adjvex域 s >next=g >adjlist[j] firstedge; //将边结点*s作为第一个邻接点插入到序号为j的顶点的边表中 g >adjlist[j] firstedge=s; //end of if //end of for //end of creatalgraph
dfs(algraph *g int i) //对图g进行以序号为i的顶点作为出发点深度优先搜索 edgenode *p; printf( visit vertex:%d g >adjlist[i] vertex);//打印序号为i的顶点信息 visited[i]=TRUE;//将序号为i的顶点设置已访问过标记 p=g >adjlist[i] firstedge;//设置寻找序号为i的第一个未访问过邻接点的扫描指针 while(p) if (!visited[p >adjvex])//若*p边结点对应顶点(假设序号为j)未访问过 dfs(g p >adjvex);//对图g进行以序号为j的顶点作为出发点进行深度优先搜索 p=p >next;//p顺着边表next指针 往后继续寻找 //end of while //end of dfs
dfstraverse(algraph *g) //对以邻接表表示的图g进行深度优先搜索 int i; for(i= ;i<g >n;i++)//将图g的所有顶点设置未访问过标记 visited[i]=FALSE; for(i= ;i<g >n;i++)//对图g调用dfs函数进行深度优先搜索 if(!visited[i]) dfs(g i); printf( \\n ); //end of dfstraverse
bfs(algraph *g int k) //对图g进行以序号为k的顶点作为出发点广度优先搜索 int i j; cirqueue *q;//设置循环队列指针 edgenode *p; q=(cirqueue *)malloc(sizeof(cirqueue));//申请循环队列空间 q >rear=q >front=q >count= ;//将循环队列置为空队 printf( visit vertex:%d g >adjlist[k] vertex); visited[k]=TRUE;//将序号为k的顶点设置为已访问过 q >data[q >rear]=k;q >rear=(q >rear+ )%queuesize;q >count++;//将顶点序号k入队 while(q >count)//当队列非空时做以下操作 i=q >data[q >front];q >front=(q >front+ )%queuesize;q >count ;//将队首元素i出队 p=g >adjlist[i] firstedge;//设置寻找序号为i顶点的未访问过邻接点的扫描指针p while (p)//当*p不为空时 做以下操作 if(!visited[p >adjvex])//若*p边结点对应顶点(假设序号为j)未访问过 printf( visit vertex:%d g >adjlist[p >adjvex] vertex); //访问序号为j的顶点 visited[p >adjvex]=TRUE;//设置已访问过标记 q >data[q >rear]=p >adjvex;q >rear=(q >rear+ )%queuesize;q >count++; //将序号为j的顶点入队 //end of if p=p >next;//p顺着边表next指针 往后继续寻找 //end of while //end of while //end of bfs
cha138/Article/program/sjjg/201311/23272相关参考