鄰接表表示的圖的深度優先搜索和廣度優先搜索程序
#include <stdio
#define maxvertexnum
#define queuesize
#define null
typedef struct{
int front
}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 enum{FALSE
boolean visited[maxvertexnum];//保存訪問信息的布爾向量
main()//主函數
{//建立圖g
algraph *g;
g=(algraph*)malloc(sizeof(algraph));//申請圖g的鄰接表空間
createalgraph(g);//建立圖g的鄰接表表示
printf(
dfstraverse(g);//對圖g進行深度優先搜索
printf(
bfstraverse(g);//對圖g進行廣度優先搜索
}
createalgraph(algraph *g)
{//建立圖g的鄰接表表示
int i
int flag;
edgenode *s;
printf(
printf(
printf(
scanf(
printf(
scanf(
printf(
for(i=
scanf(
//輸入頂點的數據域(為了簡單起見
g
}//end for
for(k=
printf(
scanf(
s=(edgenode *)malloc(sizeof(edgenode));//申請一個邊結點*s
s
s
//將邊結點*s作為第一個鄰接點插入到序號為i的頂點的邊表中
g
if (flag){//若要建立無向圖
s=(edgenode *)malloc(sizeof(edgenode));申請一個邊結點*s
s
s
//將邊結點*s作為第一個鄰接點插入到序號為j的頂點的邊表中
g
}//end of if
}//end of for
}//end of creatalgraph
dfs(algraph *g
{//對圖g進行以序號為i的頂點作為出發點深度優先搜索
edgenode *p;
printf(
visited[i]=TRUE;//將序號為i的頂點設置已訪問過標記
p=g
while(p){
if (!visited[p
dfs(g
p=p
}//end of while
}//end of dfs
dfstraverse(algraph *g)
{//對以鄰接表表示的圖g進行深度優先搜索
int i;
for(i=
visited[i]=FALSE;
for(i=
if(!visited[i])
dfs(g
printf(
}//end of dfstraverse
bfs(algraph *g
{//對圖g進行以序號為k的頂點作為出發點廣度優先搜索
int i
cirqueue *q;//設置循環隊列指針
edgenode *p;
q=(cirqueue *)malloc(sizeof(cirqueue));//申請循環隊列空間
q
printf(
visited[k]=TRUE;//將序號為k的頂點設置為已訪問過
q
while(q
i=q
p=g
while (p){//當*p不為空時
if(!visited[p
printf(
//訪問序號為j的頂點
visited[p
q
//將序號為j的頂點入隊
}//end of if
p=p
}//end of while
}//end of while
}//end of bfs
bfstraverse(algraph *g)
{//對以鄰接表表示的圖g進行廣度優先搜索
int i;
for(i=
visited[i]=FALSE;
for(i=
if(!visited[i])
bfs(g
printf(
}
From:http://tw.wingwit.com/Article/program/sjjg/201311/23272.html