深度和广度优先搜索C实现-栈和队列辅助

/*使用邻接矩阵,只关注与搜索算法本身,所以没有考虑边所带的信息之类的东西. 借助堆栈和队列的方法实现深度优先和广度优先搜索 
* 广度优先也可以使用递归实现
*/ 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <queue>
#include <stack>

#define N 6
#define N_R 200
//#define InfoType char

using namespace std;

static int a[N][N]={
            {0,1,0,0,1},
            {1,0,1,1,1},
            {0,1,0,1,0},
            {0,1,1,0,1},
            {1,1,0,1,0}
};  


/*
//结点信息 
typedef struct Info{
    char * info;
}Info, *PInfo;
*/

typedef struct node{
    int key;           //结点索引关键字 
   // InfoType inf;       //结点信息指针 
    int visit;         //访问标志位,-1代表黑色:完全访问过,0代表灰色,有相邻节点未被访问,1代表未访问。 
    struct node *p;    //该结点的父结点(即连接结点)
    int d;             //与父结点之间的距离 
}Gnode, *PGnode;            

typedef struct{
    PGnode node[N];           //所有顶点 
    int vexnum;                 //顶点数量 
    int arcnum;                 //边的数量
}Graph, *PGraph;

//用来维护广度优先搜索的队列    
queue<PGnode> qBFS;
//用来维护深度优先搜索的栈  
stack<PGnode> sDFS;

PGnode IniGnode(int key){
    PGnode gNode=(PGnode)malloc(sizeof(Gnode));
    gNode->key=key;
    gNode->visit=1; //初始化未访问 
    gNode->p=NULL;
    gNode->d=0;
    return gNode;
} 
     
void IniGraph(PGraph *g, int a[N][N]){
    //将结点初始化 
    *g=(PGraph)malloc(sizeof(Graph));
    for(int i=0;i<N;i++){
        (*g)->node[i]=IniGnode(i);
    }
}

void BFS(PGraph g, PGnode s){
    int index,i;
    PGnode u,v;   //u为当前处理结点,v为相邻结点 
    s->visit=0;
    qBFS.push(s);
    while(!qBFS.empty()){
        u=qBFS.front();  //获取队列第一个元素 
        printf("(key=%d,distance=%d)->",u->key,u->d);  
        qBFS.pop();      //弹出元素
        index=u->key;
        for(int i=0;i<N;i++){
            if(a[index][i] == 1){  //找到相邻结点
                v=g->node[i];
                if(v->visit == 1){ //节点未被访问                      
                     v->visit=0;   //找到节点 
                     v->d=u->d + 1;
                     v->p=u;
                     qBFS.push(v);
                }
            }
        }
        u->visit=-1;  //已经将所有邻接节点处理完 
    }
}

void DFS(PGraph g, PGnode s){
    int index,i,flag;
    PGnode u,v;   //u为当前处理结点,v为相邻结点 
    s->visit=0;
    sDFS.push(s);
    printf("(key=%d,distance=%d)->",s->key,s->d);
    while(!sDFS.empty()){
        u=sDFS.top();      
        //sBFS.pop();
        index=u->key;
        for(i=0;i<N;i++){
            if(a[index][i] == 1){  //找到相邻结点
                v=g->node[i];
                if(v->visit == 1){ //节点未被访问                      
                     v->visit=0;   //找到节点 
                     v->d=u->d + 1;
                     v->p=u;
                     printf("(key=%d,distance=%d)->",v->key,v->d);
                     sDFS.push(v);
                     break;
                }
            }
            
        }
        if(i==N){  
            sDFS.pop();   //如果该结点的所有子节点都查询完,则弹出。
            u->visit=-1;
        }    
    }       
} 
            
int main(){
    PGraph g;
    IniGraph(&g,a);
   // printf("宽度遍历结果为:\n");
   // BFS(g, g->node[0]);
    printf("深度遍历结果为:\n");
    DFS(g, g->node[0]);
    system("pause");
    return 0;
} 

相关链接:

http://www.cppblog.com/woaidongmao/archive/2009/01/04/71164.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值