图的广度优先搜索(采用邻接表存储方式)

原创 2016年06月01日 20:10:47
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20

int visited[MAXSIZE];

typedef struct node{
    int adjvex;
    struct node * next;
}Node;

typedef struct{
    int vertex;
    Node * first;
}VNode;

typedef struct qnode{
    int data;
    struct qnode * next;
}Qnode;

typedef struct{
    Qnode * front;
    Qnode * rear;
}LinkQueue;

LinkQueue * init(){             //初始化队列
    LinkQueue * lq;
    Qnode * qn;
    qn = (Qnode *)malloc(sizeof(Qnode));
    lq = (LinkQueue *)malloc(sizeof(LinkQueue));

    qn->next = NULL;
    lq->front = qn;
    lq->rear = qn;
    return lq;
}

void inLinkQueue(LinkQueue * lq,int x){           //入队
    Qnode * p = (Qnode *)malloc(sizeof(Qnode));
    p->data = x;
    p->next = NULL;
    lq->rear->next = p;
    lq->rear = p;
}

int outLinkQueue(LinkQueue * lq){           //出队
    Qnode * p;
    int x;
    if(lq->front == lq->rear){
        printf("队列为空\n");
        return -1;
    }else{
        p = lq->front->next;
        x = p->data;
        lq->front->next = p->next;
        free(p);
        if(lq->front->next == NULL){
            lq->rear = lq->front;
        }
        return x;
    }
}

void create(VNode g[],int n,int e){         //创建无向图的邻接表
    Node * p;
    int i,j;

    for(int t=0;t<n;t++){
        g[t].vertex = t;
        g[t].first = NULL;
    }

    for(int k=0;k<e;k++){
        printf("请输入连通边i->j\n");
        scanf("%d,%d",&i,&j);
        p = (Node *)malloc(sizeof(Node));
        p->adjvex = j;
        p->next = g[i].first;
        g[i].first = p;
        p = (Node *)malloc(sizeof(Node));
        p->adjvex = i;
        p->next = g[j].first;
        g[j].first = p;
    }
}

void BFS(VNode g[]){                        //广度优先搜索
    LinkQueue * lq = init();
    Node * p;
    int j;
    printf("%4d",g[0].vertex);
    visited[0] = 1;
    inLinkQueue(lq,0);
    while(lq->front != lq->rear){
        j = outLinkQueue(lq);
        p = g[j].first;
        while(p != NULL){
            if(!visited[p->adjvex]){
                printf("%4d",g[p->adjvex].vertex);
                inLinkQueue(lq,p->adjvex);
                visited[p->adjvex] = 1;
            }else{
                p = p->next;
            }
        }
    }
}

int main(){
    VNode g[MAXSIZE];
    int n,e;
    printf("请输入节点的个数!\n");
    scanf("%d",&n);
    printf("请输入边的个数\n");
    scanf("%d",&e);
    create(g,n,e);
    printf("广度优先搜索结果:\n");
    BFS(g);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

图的广度优先搜索(邻接表)

图的遍历(Traversing Graph)是指从图中某一顶点出发访问图中其余顶点,且使每个顶点仅被访问一次。 广度优先搜索(Breadth First Search)        广度...
  • furney
  • furney
  • 2012年02月11日 11:52
  • 4503

邻接表存储图的深度优先、广度优先遍历非递归算法

邻接表存储图的深度、广度优先非递归遍历
  • yk_ee
  • yk_ee
  • 2016年06月17日 16:41
  • 1917

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

图的邻接表存储总结

图的存储方式有两种,即邻接矩阵存储方式和邻接表存储方式。图的邻接矩阵存储很简单,邻接表存储方式的原理很简单,实现也不难。对于图中的每一个结点,都会有以邻接表,邻接表是有以该结点为起点边的所有终点组成的...

图的广度优先搜索(邻接表)

Problem Description 给出图的顶点数和顶点与顶点之间的连接关系,请输出用邻接表存储的图的广度优先搜索顶点序列。 Input 输入的第一行是一个整数T表示测试示例的数...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

图的邻接表存储及基本操作

图的存储方式有很多种,这里事宜邻接表存储为例实现的。图的基本操作包括初始化一个空图、插入一节点、插入条边、深度优先遍历、广度优先遍历、销毁图等 #include #include #define OK...
  • engerla
  • engerla
  • 2017年12月10日 22:54
  • 46

基于邻接表的图的深度和广度优先搜索遍历

/*****头文件Graph.h**********/ #define MAX_VERTEX 20 #define GQSIZE 20 #include using namespace std; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图的广度优先搜索(采用邻接表存储方式)
举报原因:
原因补充:

(最多只允许输入30个字)