数据结构(三)——图的邻接矩阵的创建及遍历

图由有穷、非空点集和边集合组成,简写成G(V,E0)

图的创建有多种方法(邻接矩阵、邻接表、十字链表)

图的遍历方法(深度优先遍历、广度优先遍历)

此篇博客为一道算法题,博中代码实现了邻接矩阵创建有向图,分别使用深度优先和广度优先遍历图,并且计算图中每个节点的出度与入度。

题目:

从键盘接收图的顶点集,关系集,创建有向图。
第一行依次输入图的顶点个数n,关系个数k,以空格隔开。顶点个数<=20
第二行依次输入顶点值,类型为字符。
接下去有k行,每行为两个字符 u 和 v,表示节点u 和 v 连通。格式为【uv】,中间不用空格间隔。
计算结点的出度和入度,并输出,共n行。格式为【顶点w 出度值 入度值】,三者用空格间隔。
接下去的一行,从A顶点出发,进行深度优先遍历,并输出,结点不间隔。
最后一行,从A顶点出发,进行广度优先遍历,并输出,结点不间隔。

代码:


/*
图的邻接矩阵
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 20

int visited[MAX] = {0};

typedef struct {
    char vex[MAX];
    int arcs[MAX][MAX];
    int vexnum , arcnum ;
}Chart ,* ChartNode;

typedef struct qnode{
    int node;
    struct qnode * pNext;
}Qnode;

typedef struct linkq{
    Qnode * front;
    Qnode * rear;
}LinkQ;


//初始化队列 
int InitQueue(LinkQ * LQ){
    LQ->front = LQ->rear = (Qnode *)malloc(sizeof(Qnode));
    LQ->front->pNext = LQ->rear->pNext = NULL;
    LQ->front->node = LQ->rear->node = 0;
    return 0;
}

//入队 
int EnQueue(LinkQ * LQ , int i){
    Qnode * qd = (Qnode *)malloc(sizeof(Qnode));
    qd->pNext = NULL;
    qd->node = i;
    LQ->rear->pNext = qd;
    LQ->rear = qd;
}

//出队 
int DeQueue(LinkQ * LQ){
    int i;
    Qnode * qd = NULL;
    qd = LQ->front->pNext;
    i = qd->node;
    LQ->front->pNext = LQ->front->pNext->pNext;
    free(qd);
    if(LQ->front->pNext == NULL){
         LQ->rear = LQ->front;
    }
    return i;
}

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

//初始化状态 
int Initvisited(){
    int i;
    for(i=0;i<MAX;i++){
        visited[i] = 0;
    }
    return 0;
}

//创建图 
ChartNode CreatChart(){
    ChartNode chart;
    char vex_1 , vex_2;
    int i;
    chart = (ChartNode)malloc(sizeof(Chart));
    memset(chart->arcs,0,sizeof(chart->arcs));
    scanf("%d %d",&chart->vexnum,&chart->arcnum);
    //fflush(stdin);
    scanf("%s",chart->vex);
   // fflush(stdin);
    for(i=0;i<chart->arcnum;i++){
        getchar(); 
        scanf("%c%c",&vex_1,&vex_2);
       // fflush(stdin);
        chart->arcs[vex_1-65][vex_2-65] = 1;
    }
    return chart;
}

//深度优先遍历 
int DFS(ChartNode chart , int i){
    
    int j;
    visited[i] = 1;
    printf("%c",chart->vex[i]);
    for(j = 0;j<chart->vexnum;j++){
        if(chart->arcs[i][j]==1&&!visited[j]){
            DFS(chart,j);
        }
    }   
    return 0;
    
}

//广度优先遍历 
int DFST(ChartNode chart , LinkQ * LQ){
    int i,j;
    Initvisited();
    InitQueue(LQ);
    for(i=0;i<chart->vexnum;i++){
        
        if(!visited[i]){
            visited[i] = 1;
            printf("%c",chart->vex[i]);
            EnQueue(LQ,i);
            
            while(QueueEmpty(LQ)){
                i = DeQueue(LQ);
                for(j = 0;j<chart->vexnum;j++){
                    if(chart->arcs[i][j] == 1 && !visited[j]){
                        visited[j] = 1;
                        printf("%c",chart->vex[j]);
                        EnQueue(LQ,j);
                    }
                }
            }
        }
    }   
}

//计算节点出入度
int Degrees(ChartNode chart){
    int i,j;
    int in = 0,out = 0;
    
    for(i = 0;i<chart->vexnum;i++){
        for(j = 0;j<chart->vexnum;j++){
            if(chart->arcs[i][j] == 1){
                out++;
            }
            if(chart->arcs[j][i] == 1){
                in++;
            }
        }
        printf("%c %d %d\n",chart->vex[i],out,in);
        in = 0;
        out = 0;
    }
}


int main(){
    
    ChartNode chart = NULL;
    LinkQ LQ;
    int i,j;
    chart = CreatChart();   
    Initvisited();
    Degrees(chart);
    DFS(chart,0);
    printf("\n");   
    DFST(chart , &LQ);
    return 0;
}
    原文作者:超级小江
    原文地址: https://www.jianshu.com/p/28db3986bed4
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞