圖的廣度優先遍歷(鄰接表)


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
using namespace std;

#define MAX 100

typedef struct EdgeNode// 邊表結點
{
    int adjves;//存儲頂點的下標
    struct EdgeNode* next;//連接下一個鄰點
}EdgeNode;

typedef struct VertexNode//頂點表結點
{
    int ves;//頂點的值
    EdgeNode* firstedge;//相連的頂點的值
}VertexNode,AdjList[MAX];
//鄰接表
typedef struct
{
    AdjList adjlist;
    int ves;//頂點
    int edge;//
    int book[MAX];//判斷是否有被訪問過
}MGraph;

void createMGraph(MGraph *G)
{
    int i;
    int start;
    int end;

    EdgeNode *e;

    printf("please input the ves and edge:\n");
    scanf("%d%d",&(G->ves),&(G->edge));
//初始化
    printf("please input the ves:\n");//此處設置頂點與存儲下標相同且從零開始 

    for(i = 0; i < G->ves; i++)//輸入頂點
    {
        scanf("%d",&(G->adjlist[i].ves));
        G->adjlist[i].firstedge = NULL;
    }
//創建鄰接矩陣

    printf("please input the edges:\n");
    for(i = 0; i < G->edge; i++)
    {
        scanf("%d%d",&start,&end);

        e =(EdgeNode*)malloc(sizeof(EdgeNode));//分配空間
        e->adjves = end;
        e->next = G->adjlist[start].firstedge;
        G->adjlist[start].firstedge = e;//類似於鏈表的前插


        e =(EdgeNode*)malloc(sizeof(EdgeNode));//分配空間
        e->adjves = start;
        e->next = G->adjlist[end].firstedge;
        G->adjlist[end].firstedge = e;//類似於鏈表的前插
    }
}

void bfs(MGraph *G,int ves)
{
    queue<VertexNode> Q;
    Q.push(G->adjlist[ves]);
    G->book[ves] = 1;
    while(!Q.empty()){
        VertexNode tmp = Q.front();
        printf("%d ", tmp.ves);
        Q.pop();
        EdgeNode *p = tmp.firstedge;
        while(p != NULL){
            if(G->book[p->adjves] == 0){
                Q.push(G->adjlist[p->adjves]);
                G->book[p->adjves] = 1;
            }
            p = p->next;
        }
    }
}

void bfsTraverse(MGraph *G){
    int i;
    memset(G->book,0,sizeof(G->book));//清空標志位
    for(i = 0; i < G->ves; i++)
        if(!G->book[i])
            bfs(G, i);
} 

int main()
{
    MGraph G;
    createMGraph(&G);

    bfsTraverse(&G);
    return 0;
}
/*
輸入樣例:
7 9
0 1 2 3 4 5 6
0 2
0 3
0 4
1 3
1 5
2 3
2 5
4 5
5 6
*/ 

輸入樣例:給定圖如下 
這里寫圖片描述

 

在關於bfs的代碼編寫的時候發現了自己 ->操作符和 .操作符亂用,下面作出說明:

比如你有這個結構體:

struct xx
{
  int a;
  int b;
}yy, *kk;

那么使用如下:

yy.a = 3,  yy.b = 5;
kk = new xx;
kk->a = 4, kk->b = 6;

也就是說你用結構體定義了一個實體,那么這個實體要引用他里面的成員,就用.操作符

如果你用結構體定義的是一個結構指針,那么要引用他里面的成員就用->

typedef struct VertexNode//頂點表結點
{
    int ves;//頂點的值
    EdgeNode* firstedge;//相連的頂點的值
}VertexNode,AdjList[MAX];
.
.
.
void bfs(MGraph *G,int ves)
{
    queue<VertexNode> Q;
    Q.push(G->adjlist[ves]);
    G->book[ves] = 1;
    while(!Q.empty()){
        VertexNode tmp = Q.front();
        printf("%d ", tmp.ves);
        Q.pop();
        EdgeNode *p = tmp.firstedge;
        while(p != NULL){
            if(G->book[p->adjves] == 0){
                Q.push(G->adjlist[p->adjves]);
                G->book[p->adjves] = 1;
            }
            p = p->next;
        }
    }
}

結合上述代碼,VertexNode 結構體中定義了AdjList[MAX]實體數組

所以隊列聲明為 queue<VertexNode> Q; 而不是 queue<VertexNode*> Q;

所以類似聲明 VertexNode tmp = Q.front();

繼而 tmp 的相關操作使用操作符 .


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM