图的邻接矩阵的建立以及遍历

图可以用邻接矩阵的方式表示,本文用邻接矩阵建立无向图,INF比图中的任何权值都大,表示两个顶点之间没有边。图的邻接矩阵结构体定义如下:

#define maxSize 30
typedef int VertexType;//定义结点类型
typedef struct
{
    int edges[maxSize][maxSize];
    int n,e;
    VertexType vex[maxSize];
}MGraph;

图的建立的算法如下

#include<stdio.h>
#define QueueSize 100//广度优先搜索遍历中用到的队列的大小
#define OK 1
#define ERROR 0
#define INF 9999999
typedef enum{FALSE,TRUE} Boolean;//用枚举类型 
typedef struct 
{
    int front ;
    int rear;
    int count;
    int data[QueueSize];
}CirQueue;

//标记是否访问过
Boolean visited[maxSize];
void CreateMGraph( MGraph * m)
{
    int i,j,k;
    int n1,n2;
    
    printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");
    scanf("%d,%d",&(m->n),&(m->e));
    //给顶点编号
    for(i=0;i<m->n;i++)
        m->vex[i]=i;

    for(i=0;i<m->n;i++)
        for(j=0;j<m->n;j++)
            m->edges[i][j]=INF;
    
    printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):\n");
    for(k=0;k<m->e;k++)
        {
            printf("请输入第%d条边对应的结点序号:",k+1);
            scanf("%d,%d",&n1,&n2);
            m->edges[n1][n2]=1;
            m->edges[n2][n1]=1;//无向图的邻接矩阵是对称的
        }

        
}


/***********************************************************/
/*************深度优先遍历**********************************/
/**********************************************************/


void DFSM(MGraph * m,int i)//访问结点i
{
    int k;
    printf("深度优先遍历结点:%d\n",m->vex[i]);    
    visited[i]=TRUE;
    for (k=0;k<m->n ;k++)
        if(m->edges[i][k]==1 && !visited[k])
            DFSM(m,k);
}

void DFSMTraver (MGraph * m)
{
    int i;
    for(i=0;i<m->n;i++)
        visited[i]=FALSE;
    for(i=0;i<m->n ;i++)
        if(!visited[i])  DFSM(m,i);
}

/*******************************************************/
/**********************广度优先遍历*********************/
/*******************************************************/
void InitQueue(CirQueue * Q)
{
    Q->front=Q->rear=0;
    Q->count=0;
    Q->QueueSize=0;
}

int QueueEmpty(CirQueue * Q)
{
    return Q->count==0;
}

int QueueFull (CirQueue * Q)
{
    return Q->count==QueueSize;
}
void EnQueue(CirQueue * Q,int x)
{
    if(QueueFull(Q))
    {
        printf("队列已满!\n");
        return;
    }
    else
    {
        Q->count++;
        Q->data[Q->rear]=x;
        Q->rear=(Q->rear+1)%QueueSize;
    }

}

int  DeQueue(CirQueue * Q)//返回出队元素
{
    int temp;
    if(QueueEmpty(Q))
    {
        printf("队列已空!\n");
        return INF;
    }
    else
    {
        temp=Q->data[Q->front];
        Q->count--;
        Q->front=(Q->front+1)%QueueSize;
        return temp;
    }
}

void BFSM(MGraph *m,int k)//广度优先遍历第K个结点
{
    int i,j;
    CirQueue Q;
    InitQueue(&Q);
    printf("广度优先遍历结点:%d\n",m->vex[k]);
    visited[k]=TRUE;
    EnQueue(&Q,k);
    while(!QueueEmpty(&Q))
    {
        i=DeQueue(&Q);
        if(i!=INF)
        {
            for(j=0;j<m->n;j++)
            if(m->edges[i][j]==1&&!visited[j])
            {
                printf("广度优先遍历结点:%d\n",m->vex[j]);
                visited[j]=TRUE;
                EnQueue(&Q,j);
            }
        }
    }
}

void BFSMTraver(MGraph * m)
{
    int i;
    for(i=0;i<m->n;i++)
        visited[i]=FALSE;
    for(i=0;i<m->n;i++)
        if(!visited[i])
            BFSM(m,i);
}

void main (void)
{
    MGraph m;
    CreateMGraph(& m);
    DFSMTraver(&m);
    BFSMTraver(&m);
    return OK;

}

以上代码测试通过!

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/zhaozicang/article/details/24134303
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞