图|图的存储结构:邻接矩阵、邻接表(C语言)

版权声明:转载请评论告知 https://blog.csdn.net/qq_41594999/article/details/84618282

图的存储结构

一、图的邻接矩阵表示

1. 图的邻接矩阵存储类型

1)基本思想:
-一维数组vexs[ ]:存储图中顶点信息;
-二维数组arcs[ ][ ]:存储图中各顶点间关系(1,有关系;0,没关系);
-整型变量vexNum:存储顶点数;
-整形变量arcNum:存储边(弧)数。
2)图的邻接矩阵定义:

#include <stdio.h>
#define MAXSIZE 20		//图中顶点的最大数目
#define INFINITY 9999		//表示无穷大

typedef struct {
    VertexType vexs[MAXSIZE];	//存储顶点信息(VertexType为顶点的数据类型)
    int arcs[MAXSIZE][MAXSIZE];	//存储顶点的关系
    int arcNum, vexNum;		//存储顶点数、弧数
}MGraph;			//定义图的类型

2. 图的邻接矩阵生成算法

图的邻接矩阵生成算法主要步骤:
(1)输入图的顶点个数和边的个数;
(2)输入顶点信息存储在一维数组vexs[ ]中;
(3)初始化邻接矩阵(对角线为0,其余为 ∞ );
(4)依次输入每条边存储在arcs中。

void creatGraph(MGraph &G) {
    int i, j, from, to;
    
    for(i=0; i<MAXSIZE; i++) {					//初始化邻接矩阵
        for(j=0; j<MAXSIZE; j++) {
            if(i == j) {
                G.arcs[i][j] = 0;
                continue;
            }
            G.arcs[i][j] = INFINITY;
        }
    }
    printf("Please input verNum & arcNum\n");		//输入图的顶点个数和边的个数
    scanf("%d%d", &G.vexNum, &G.arcNum);
    
    printf("Please input vertices' name\n");		//输入顶点信息
    getchar();
    for(i=0; i<G.vexNum; i++) {
        scanf("%c", &G.vexs[i]);
    }
   
    printf("Please input edge\n");
    for(i=0; i<G.arcNum; i++) {
        scanf("%d%d", &from, &to);	//生成带权图:scanf("%d%d%d", &from, &to, &weight);
        G.arcs[from][to] = 1;			//生成带权图:G.arcs[from][to] = weight;
        //生成无向图:G.arcs[to][from] = 1;
    }
}

测试函数:

int main() {
    MGraph graph;
    creatGraph(graph);
    int visited[graph.vexNum];
    int i;
    for(i=0; i<graph.vexNum; i++) {
        visited[i] = 0;
    }
    DFS(graph, 0, visited);
}

二、图的邻接表表示

1. 图的邻接表存储类型

1)基本思想:
-对图中每一个顶点建立一个与该顶点有邻接关系的顶点的单链表;
-用一个一维结构体数组存储顶点和各顶点单链表的头指针;
-用整型变量存储顶点数和边数。
下图为示例有向网对应邻接表表示
2)图的邻接矩阵定义:

#include <stdio.h>
#define MAXSIZE 20				//图的最大顶点数
//(1)邻接表的边结点类型
typedef struct arcnode {
    int adjvex; 				//弧所指向的顶点的位置
    struct arcnode *next;		//指向下一条弧的指针
    [WeightType info;]			//用于存放边上信息,视实际情况而定
}ArcNode;
//(2)邻接表的表头结点类型
typedef struct {
    VertexType vertex;			//结点信息
    ArcNode *firstArc;
}VertexNode;
//(3)图的邻接表类型
typedef struct {
    VertexNode adjList[MAXSIZE];
    int arcNum, verNum;
}ALGraph;

2. 图的邻接表生成算法

图的邻接表生成算法主要步骤:
(1)输入图的顶点个数和边的个数;
(2)输入顶点信息;
(3)依次输入每条边信息,并插入到边表中。

void buildALGraph(ALGraph &G) {
    int i, j;
    ArcNode *p;
    printf("Please input verNum & arcNum\n");
    scanf("%d%d", &G.verNum, &G.arcNum);
    
    //input vertex data
    printf("Please input vertices' name\n");
    getchar();
    for(int i=0; i<G.arcNum; i++) {
        scanf("%c", &G.adjList[i].vertex);
        G.adjList[i].firstArc = NULL;
    }
    
    //creat arc
    printf("Please input edges\n");
    for(int k=0; k<G.arcNum; k++) {
        scanf("%d%d",&i, &j);
        p = new ArcNode;
        p->adjvex = j;
        p->next = G.adjList[i].firstArc;
        G.adjList[i].firstArc = p;
        p = new ArcNode;
        p->adjvex = i;
        p->next = G.adjList[j].firstArc;
        G.adjList[j].firstArc = p;
    }
}

测试函数:

int main() {
    ALGraph graph;
    buildALGraph(graph);
}

猜你喜欢

转载自blog.csdn.net/qq_41594999/article/details/84618282