邻接表的深搜广搜,非常容易看懂的代码风格

#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);
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值