#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<queue>
#define MAX 100
typedef struct node //表節點
{
int data;
struct node *next;
}BNODE;
typedef struct //頭節點
{
int tdata;
BNODE *firstdian;
}TNODE;
TNODE dian[MAX]; //頭節點數組
int creat()
{
BNODE *p;
int i,j,v,e,v1,v2;
scanf("%d%d",&v,&e);
for(i=1;i<=v;i++)
{
dian[i].firstdian=NULL; //頭節點數組的指針域爲空
}
for(i=1;i<=e;i++)
{
scanf("%d%d",&v1,&v2); //輸入邊
p=(BNODE*)malloc(sizeof(BNODE));
p->data=v2; //生成表節點並接在頭節點數組屁股上
p->next=dian[v1].firstdian;
dian[v1].firstdian=p;
p=(BNODE*)malloc(sizeof(BNODE)); //同理讓邊的另一個節點也接在屁股上
p->data=v1;
p->next=dian[v2].firstdian;
dian[v2].firstdian=p;
}
return v;
}
void dfs(int n)
{
int w;
BNODE *p;
p=dian[n].firstdian; //p指向第n個節點的屁股
printf("%d ",n);
dian[n].tdata=1; //=1表示已經訪問了
while(p!=NULL)
{
w=p->data;
if(dian[w].tdata==0) //沒訪問就繼續遞歸調用
dfs(w);
p=p->next;
}
}
void bfs(int n)
{
int queue[MAX];
int front=0,rear=1;
BNODE *p;
p=dian[n].firstdian;
printf("%d ",n);
dian[n].tdata=1;
queue[rear]=n; //訪問過的節點入隊列
while(front!=rear)
{
front=(front+1)%MAX;
n=queue[front];
p=dian[n].firstdian;
while(p!=NULL)
{
if(dian[p->data].tdata==0)
{
dian[p->data].tdata=1;
printf("%d ",p->data);
rear=(rear+1)%MAX;
queue[rear]=p->data;
}
p=p->next; //找他的下一個領結點
}
}
}
int main()
{
int i,n,v,e;
BNODE *p;
n=creat();
scanf("%d",&v);
dfs(v); //這裏出現了已經訪問過以後標誌全爲1,不能再正常廣搜遍歷的問題
printf("\n");
for(i=1;i<=n;i++)
dian[i].tdata=0;
bfs(v);
}
鄰接表的深搜廣搜,非常容易看懂的代碼風格
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.