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

#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);
}
邻接表是一种的存储结构,它可以用于实现的深度优先索(DFS)和广度优先索(BFS)。下面是邻接表深搜广的C语言实现: 1. 邻接表的深度优先索(DFS)C语言实现: ```c #define MAXNODE 1000 #define MAXSIDE 10000 typedef struct SIDE { int tailNode; int nextSide; int weight; } SIDE; SIDE edge[MAXSIDE]; int head[MAXNODE]; int visited[MAXNODE]; int counttEdge = 0; void CreateABoundary(int headNode, int tailNode, int weight) { edge[counttEdge].tailNode = tailNode; edge[counttEdge].weight = weight; edge[counttEdge].nextSide = head[headNode]; head[headNode] = counttEdge; counttEdge++; } void DFS(int node) { visited[node] = 1; printf("%d ", node); for (int i = head[node]; i != -1; i = edge[i].nextSide) { int nextNode = edge[i].tailNode; if (!visited[nextNode]) { DFS(nextNode); } } } int main() { // 初始化 memset(head, -1, sizeof(head)); memset(visited, 0, sizeof(visited)); counttEdge = 0; // 创建 CreateABoundary(1, 2, 0); CreateABoundary(1, 3, 0); CreateABoundary(2, 4, 0); CreateABoundary(2, 5, 0); CreateABoundary(3, 6, 0); CreateABoundary(3, 7, 0); // DFS遍历 DFS(1); return 0; } ``` 2. 邻接表广度优先索(BFS)C语言实现: ```c #define MAXNODE 1000 #define MAXSIDE 10000 typedef struct SIDE { int tailNode; int nextSide; int weight; } SIDE; SIDE edge[MAXSIDE]; int head[MAXNODE]; int visited[MAXNODE];int counttEdge = 0; void CreateABoundary(int headNode, int tailNode, int weight) { edge[counttEdge].tailNode = tailNode; edge[counttEdge].weight = weight; edge[counttEdge].nextSide = head[headNode]; head[headNode] = counttEdge; counttEdge++; } void BFS(int node) { int queue[MAXNODE]; int front = 0, rear = 0; visited[node] = 1; printf("%d ", node); queue[rear++] = node; while (front < rear) { int curNode = queue[front++]; for (int i = head[curNode]; i != -1; i = edge[i].nextSide) { int nextNode = edge[i].tailNode; if (!visited[nextNode]) { visited[nextNode] = 1; printf("%d ", nextNode); queue[rear++] = nextNode; } } } } int main() { // 初始化 memset(head, -1, sizeof(head)); memset(visited, 0, sizeof(visited)); counttEdge = 0; // 创建 CreateABoundary(1, 2, 0); CreateABoundary(1, 3, 0); CreateABoundary(2, 4, 0); CreateABoundary(2, 5, 0); CreateABoundary(3, 6, 0); CreateABoundary(3, 7, 0); // BFS遍历 BFS(1); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值