数据结构 — 图 之 广度优先遍历

原创 2015年11月21日 13:05:48

【描述】:  图的bfs


【输入】:

8
1 2 -1
0 3 4 -1
0 5 6 -1
1 7 -1
1 7 -1
2 7 -1
2 7 -1
3 4 5 6 -1


【输出】:


0 1 2 3 4 5 6 7


/*
 *图的广度优先遍历
 *1.链式队列(链表的头节点中存数据、节点的尾插法、头节点的删除)
 *2.bfs 

8 
1 2 -1 
0 3 4 -1 
0 5 6 -1 
1 7 -1 
1 7 -1 
2 7 -1 
2 7 -1 
3 4 5 6 -1 
 */

#include<iostream>
#include<memory.h>
using namespace std;

/* 宏定义 */
#define MAX_NUM 50
#define ElementType int

/* 定义动态链式队列节点 */
typedef struct QueueNode{
    ElementType data;
    struct QueueNode *next;
}QueueNode,*QueuePointer;

/* 邻接表表节点 */
typedef struct TableNode{
    ElementType vertex;
    struct TableNode *next;
}TableNode,*TablePointer;

/* 头节点数组 */
TablePointer graph[MAX_NUM];

/* 定义visited数组 */
bool visited[MAX_NUM];

/* 顶点数 */
int vertices;

/*
 * 动态链式队列
 * 1.addq -> 入队
 * 2.deleteq -> 出队
 */
/*在链式队列的队尾插入元素*/
void addq(QueuePointer &front, QueuePointer &rear, ElementType item){
    QueuePointer temp = new QueueNode;
    temp->data = item;
    temp->next = NULL;

    //插入
    if(front){
        rear->next = temp;
    }else{
        front = temp;
    }
    rear = temp;
}

/*从链式队列的头部出队*/
ElementType deleteq(QueuePointer &front){
    QueuePointer temp = front;
    ElementType item;

    //出队
    item = temp->data;
    front = temp->next;
    delete temp;
    return item;
}

/*
 * 邻接表存储的图
 * 1.创建图
 * 2.bfs
 */
/*创建*/
void CreateGraph(){  
    ElementType ch;  
    TablePointer pnew,qnode;  
    pnew = qnode = NULL;  
  
    for(int i = 0; i < vertices; i++){  
        cin>>ch;  
        if(ch == -1) continue; /*当ch 为-1是结束该vertex的创建*/  
        //链表的头节点  
        pnew = new TableNode;  
        pnew->vertex = ch;  
        pnew->next = NULL;  
        //将头节点存入 头节点数组  
        graph[i] = pnew;  
        //尾插法创建链表  
        cin>>ch;  
        while(ch != -1){  
            //申请内存、处理数据域、处理指针域  
            qnode = new TableNode;  
            qnode->vertex = ch;  
            qnode->next =NULL;  
            //插入  
            pnew->next = qnode;  
            //更新尾指针  
            pnew = qnode;  
            cin>>ch;  
        }  
    }  
}

/*bfs*/
void bfs(ElementType v){
    TablePointer w;
    QueuePointer front, rear;
    front = rear = NULL;

    //将第一个节点输入、标记、进队
    cout<<v<<endl;
    visited[v] = true;
    addq(front, rear, v);

    //访问队列中的节点、访问与其相邻的节点、已经被visited的节点将不再访问
    while(front){
        v = deleteq(front);
	//扫vertex v 的链表
        for(w = graph[v]; w; w=w->next){
            if(!visited[w->vertex]){
                cout<<w->vertex<<" ";
		visited[w->vertex] = true;
                addq(front, rear, w->vertex);
            }
	}
    }
	cout<<endl;
}

int main(){  
  
    memset(visited,false,sizeof(visited));  
  
    cout<<"输入顶点数"<<endl;  
    cin>>vertices;  
  
    CreateGraph();  
    cout<<"广度优先遍历"<<endl;  
    bfs(0);  

    return 0;  
}  

【运行结果】:


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

【c/c++ 算法/数据结构】 邻接矩阵表示图,深度,广度优先遍历 算法设计+代码+图片

*问题描述: 建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网,学生可以任选两种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。   1、邻接矩阵...
  • wzwdcld
  • wzwdcld
  • 2014年05月24日 15:15
  • 3211

数据结构(C实现)------- 图的广度优先遍历

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述:           设图G的初始状态是所有顶点均未被访问过,...

算法与数据结构实验5:图的深度和广度优先遍历(邻接矩阵)

Akatsuki

《数据结构和算法》之图的广度优先遍历

一,广度优先遍历,又称为广度优先搜索,简称BFS。举例说明,在一套房子里找一个钥匙,利用深度优先搜索就是搜索每一个房间,而广度优先搜索,是先看看钥匙有没有放在各个房间的明显位置,如果没有,再看看各个房...

【数据结构】邻接矩阵表示法的图的深度广度优先遍历递归和非递归遍历

假设有以下结构的图: 用邻接矩阵表示如下: 因为他是无向图,我们可以发现他的矩阵是对角对称的。矩阵中每一行每一列都可以看成是一个顶点,矩阵中的元素表示着该顶点与其他顶点的关系,当元素的值为1说明...
  • e_one
  • e_one
  • 2016年02月02日 16:26
  • 7284

【数据结构实验】图的深度优先/广度优先遍历

#include #include using namespace std; #define MAX_VERTEX_NUM 20  //最大顶点数 #define OK 0 #define ERR...

数据结构和算法之:图的深度优先和广度优先遍历及其Java实现

转载自: 图的遍历,所谓遍历,即是对结点的访问。 一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略,深度优先遍历和广度优先遍历。   深度优先遍历: ...
  • csummm4
  • csummm4
  • 2014年04月19日 19:55
  • 514

数据结构--图的理解:深度优先和广度优先遍历及其 Java 实现

遍历 图的遍历,所谓遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我...

数据结构:图的遍历--深度优先、广度优先

图的遍历是指从图中的某一顶点出发,按照一定的策略访问图中的每一个顶点。当然,每个顶点有且只能被访问一次。 在图的遍历中,深度优先和广度优先是最常使用的两种遍历方式。这两种遍历方式对无向图和有向图都是适...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构 — 图 之 广度优先遍历
举报原因:
原因补充:

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