鄰接表的深搜廣搜,非常容易看懂的代碼風格

#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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章