#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);
}
邻接表的深搜广搜,非常容易看懂的代码风格
最新推荐文章于 2024-08-21 14:56:15 发布