1. 程式人生 > >圖的廣度優先遍歷(鄰接表)

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

#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 的相關操作使用操作符 .