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

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define  MAX   50
#define  INFINITY   65535       //无穷大
typedef  char Elemtype;
typedef  int  Status;
typedef struct TNode{
    Elemtype vex[MAX];   //顶点数
    Status   arc[MAX][MAX];    //对应权值或(0,1)
    Status   V,E;      //顶点与边数
    //Status   weigh;
}Graph;
typedef struct {
    int    data[MAX];
    int    front, rear;
}Queue;
Status visit[MAX];

//队列顺序表的相关操作
//初始化
void InitQueue(Queue *Q)
{
    Q->front = Q->rear = 0;
}

//入队
void EnQueue(Queue *Q, int e)
{
    if ((Q->rear+1)%MAX == Q->front)
        return ;
    Q->data[Q->rear] = e;
    Q->rear = (Q->rear+1)%MAX;
}

//判空
int QueueEmpty(Queue *Q)
{
    if (Q->front == Q->rear)
        return 1;
    else
        return 0;
}

//出队
void DeQueue(Queue *Q, int *e)
{
    if (Q->front == Q->rear)
        return ;

    *e = Q->data[Q->front];
    Q->front = (Q->front+1)%MAX;
}

void Create_Graph(Graph &G){   //G一定要有&引用
    printf("输入顶点与边的数目:\n");
    scanf("%d%d",&G.V,&G.E);
    getchar() ;
    printf("输入顶点值:\n");
    for(int i = 0;i<G.V;i++){
        scanf("%c",&G.vex[i]) ;
        getchar();
    }
    /*初始化*/
    for(int i = 0;i<G.V;i++){
        for(int j = 0;j<G.V;j++){
            G.arc[i][j] = INFINITY;
        }
    }
    int k,t,w;
    //边处理
    printf("输入邻接矩阵对应的下标及对应权值\n");
    for(int i = 0;i<G.E;i++){
            scanf("%d%d%d",&k,&t,&w);
            G.arc[k][t]     = w;       //指向权值
            G.arc[t][k]  =  G.arc[k][t]; //无向图对称
    }
}
/*深度遍历*/
void DFS(Graph G,Status i){
    visit[i] = 1;     //访问点置1,从此往内探索
    printf("%c ",G.vex[i]);
    for(int j=0; j<G.V;j++){
            //int item = j;
        if(!visit[j]&&G.arc[i][j]!=INFINITY){
            DFS(G,j);
        }
    }
}
/*初始化标志visit确定深度遍历位置*/
void Traver_Graph(Graph G){
    for(int i = 0;i<G.V;i++){
        visit[i] = 0;
    }
    for(int j = 0;j<G.V;j++){
        if(!visit[j]){
            DFS(G,j);
        }
    }
}

/*广度遍历*/
void BFSTraverse(Graph *G)
{
    int i, j;
    Queue Q;
    for (i=0; i<G->V; ++i)
        visit[i] = 0;

    InitQueue(&Q);  //构造空队列

    for (i=0; i<G->V; ++i)
    {
        if (!visit[i])
        {
            visit[i] = 1;   //访问点置1
            printf("%c ", G->vex[i]);
            EnQueue(&Q, i);   //访问过的位置进队列

            while (!QueueEmpty(&Q))
            {
                DeQueue(&Q, &i);    //要访问的节点出队列;
                for (j=0; j<G->V; ++j)   //访问与它关联的全部邻节点,且按照先与之关联的先输出
                {
                    if (!visit[j] && G->arc[i][j]!=INFINITY)
                    {
                        visit[j] = 1;    //访问点置1
                        printf("%c ", G->vex[j]);
                        EnQueue(&Q, j);  //进队列,下次广度搜索从此节点开始
                    }
                }
            }
        }
    }
}


int main(int argc, char** argv) {
    Graph G;
    Create_Graph(G);
    printf("\n图的深度优先遍历为:\n");
    Traver_Graph(G);
    printf("\n图的广度优先遍历为:\n");
    BFSTraverse(&G);
    return 0;
}

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