數據結構——圖的遍歷(以鄰接矩陣為例)


 

#include<stdio.h>
#define N 20
#define TRUE 1
#define FALSE 0
int visited[N];
typedef struct    /*隊列的定義*/
{
    int data[N];
    int front;//隊頭指針
    int rear;//隊尾指針
} queue;
typedef struct    /*圖的鄰接矩陣*/
{
    int vexnum,arcnum;
    char vexs[N];
    int arcs[N][N];///鄰接矩陣
} graph;

void createGraph(graph *g);  /*建立一個無向圖的鄰接矩陣*/
void dfs(int i,graph *g);    /*從第i個頂點出發深度優先搜索*/
void tdfs(graph *g);          /*深度優先搜索整個圖*/
void bfs(int k,graph *g);    /*從第k個頂點廣度優先搜索*/
void tbfs(graph *g);          /*廣度優先搜索整個圖*/
void init_visit();            /*初始化訪問標識數組*/

void createGraph(graph *g)   /*建立一個無向圖的鄰接矩陣*/
{
    int i,j;
    char v;
    g->vexnum=0;
    g->arcnum=0;
    i=0;
    printf("輸入頂點序列(以#結束):\n");
    while((v=getchar())!='#')
    {
        g->vexs[i]=v;        /*讀入頂點信息*/
        i++;
    }
    g->vexnum=i;             /*頂點數目*/
    for(i=0; i<g->vexnum; i++) /*鄰接矩陣初始化*/
    {
        for(j=0; j<g->vexnum; j++)
        {
            g->arcs[i][j]=0;
        }
    }
    printf("輸入邊的信息:\n");
    scanf("%d,%d",&i,&j);  /*讀入邊i,j*/
    while(i!=-1)              /*讀入i,j為-1時結束*/
    {
        g->arcs[i][j]=1;
        g->arcs[j][i]=1;
        scanf("%d,%d",&i,&j);
    }
}

void dfs(int i,graph *g) /*從第i個頂點出發深度優先搜索*/
{
    int j;
    printf("%c",g->vexs[i]);
    visited[i]=1;
    for(j=0; j<g->vexnum; j++)
    {
        if(visited[j]==0&&g->arcs[i][j]==1)
        {
            dfs(j,g);
        }
    }
}


void tdfs(graph *g)      /*深度優先搜索整個圖*/
{
    int i;
    printf("\n從頂點%C開始深度優先搜索序列:",g->vexs[0]);
    for(i=0; i<g->vexnum; i++)
    {
        if(visited[i]!=1)
        {
            dfs(i,g);
        }
    }
}
void bfs(int k,graph *g)  /*從第k個頂點廣度優先搜索*/
{
    int i,j;
    queue qlist,*q;
    q=&qlist;
    q->rear=0;
    q->front=0;
    printf("%c",g->vexs[k]);
    visited[k]=TRUE;
    q->data[q->rear]=k;
    q->rear=(q->rear+1)%N;//更新隊尾指針
    while(q->rear!=q->front)//隊不空
    {
        i=q->data[q->front];//去隊首元素
        q->front=(q->front+1)%N;
        for(j=0; j<g->vexnum; j++)//便利所有的結點,找到與i相關聯的點
        {
            if((g->arcs[i][j]==1)&&(!visited[j]))//找到未便利的點
            {
                printf("%c",g->vexs[j]);//輸出
                visited[j]=TRUE;//修改訪問標志
                q->data[q->rear]=j;//入隊
                q->rear=(q->rear+1)%N;
            }
        }
    }
}

void tbfs(graph *g) /*廣度優先搜索整個圖*/
{
    int i;
    printf("\n從頂點%C開始廣度優先搜索序列:",g->vexs[0]);
    for(i=0; i<g->vexnum; i++)
        if(visited[i]!=TRUE)
            bfs(i,g);
}

void init_visit()   /*初始化訪問標識數組*/
{
    int i;
    for(i=0; i<N; i++)
    {
        visited[i]=FALSE;
    }
}

int main()
{
    graph ga;
    int i,j;
    createGraph(&ga);
    printf("無向圖的鄰接矩陣:\n");
    for(i=0; i<ga.vexnum; i++)
    {
        for(j=0; j<ga.vexnum; j++)
            printf("%3d",ga.arcs[i][j]);
        printf("\n");
    }
    init_visit();
    tbfs(&ga);
    return 0;
}

 


免責聲明!

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



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