1. 程式人生 > >資料結構 圖的鄰接表儲存結構及DFS/BFS遍歷

資料結構 圖的鄰接表儲存結構及DFS/BFS遍歷

//鄰接表
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define INF 999
using namespace std;

typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *nextarc;
    int weight;
}ArcNode;

typedef struct VNode
{
    ArcNode *firstarc;
}VNode;

typedef struct
{
    VNode adjlist[100];
    int n,e;
}AdjGraph;

int vis[99]={0};
void CreatAdj(AdjGraph *&G,int A[6][10],int n,int e)
{
    int i,j,k;
    ArcNode *p;
    G=(AdjGraph *)malloc(sizeof(AdjGraph));
    for(i=0;i<n;i++)
    {
        G->adjlist[i].firstarc=NULL;
    }
    for(i=0;i<n;i++)
    {
        for(j=n-1;j>=0;j--)
        {
            if(A[i][j]!=0&&A[i][j]!=INF)
            {
                p=(ArcNode *)malloc(sizeof(ArcNode));
                p->adjvex=j;
                p->weight=A[i][j];
                p->nextarc=G->adjlist[i].firstarc;
                G->adjlist[i].firstarc=p;
            }
        }
    }
    G->n=n;
    G->e=e;
}

void DispAdj(AdjGraph *G)
{
    ArcNode *p;
    for(int i=0;i<G->n;i++)
    {
        p=G->adjlist[i].firstarc;
        printf("%2d:",i);
        while(p!=NULL)
        {
            printf("%2d[%d]->",p->adjvex,p->weight);
            p=p->nextarc;
        }
        printf("^\n");
    }
}

void Destory(AdjGraph *&G)
{
    int i;
    ArcNode *pre,*p;
    for(i=0;i<G->n;i++)
    {
        pre=G->adjlist[i].firstarc;
        if(pre!=NULL)
        {
            p=pre->nextarc;
            while(p!=NULL)
            {
                free(pre);
                pre=p;
                p=p->nextarc;
            }
            free(pre);
        }
    }
    free(G);
}

void dfs(AdjGraph *G,int v)
{
    cout<<"   "<<v<<endl;
    vis[v] = 1;
    ArcNode *p;
    p = G->adjlist[v].firstarc;
    while(p!=NULL)
    {
        if(vis[p->adjvex]==0)
        {
            dfs(G,p->adjvex);
        }
        p = p->nextarc;
    }
}

void bfs(AdjGraph *G,int v)
{
    int que[99],fron = 0,rear = 0;
    ArcNode *p;
    memset(vis,0,sizeof(vis));
    int w , i;
    vis[v] = 1;
    rear+=1;
    que[rear] = v;
    cout<<v<<endl;
    while(fron!=rear)
    {
        fron++;
        w = que[fron];
        p = G->adjlist[w].firstarc;
        while(p!=NULL)
        {
            if(vis[p->adjvex]==0)
            {
                cout<<p->adjvex<<endl;
                vis[p->adjvex]=1;
                rear++;
                que[rear] = p->adjvex;
            }
            p = p->nextarc;
        }
    }
}

int main()
{
    memset(vis,0,sizeof(vis));
    AdjGraph *G;
    int A[6][10]={
    {0,5,INF,7,INF,INF}, {INF,0,4,INF,INF,INF},
    {8,INF,0,INF,INF,9}, {INF,INF,5,0,INF,6},
    {INF,INF,INF,5,0,INF}, {3,INF,INF,INF,1,0}};
    CreatAdj(G,A,6,10);
    for(int i=0;i<6;i++){
        for(int j=0;j<10;j++){
            cout<<A[i][j]<<" ";
        }
        cout<<endl;
    }
    DispAdj(G);
    cout<<endl<<"dfs"<<endl;
    dfs(G,0);
    cout<<"BFS"<<endl;
    bfs(G,0);
    Destory(G);
    return 0;
}