zoukankan      html  css  js  c++  java
  • 算法之图的存储

    关于图的基本概念,这边就不再写了。

    下面来说下图的存储,存储图可以使用邻接矩阵和邻接表。

    所谓邻接矩阵就是使用一个矩阵来存储图,下图使用矩阵来存储有向图和无向图。


    进行简单地说明,图G5中,V0和到V1有连线,所以坐标为(0,1)的地方为1,又因为G5是无向图,所以坐标为(1,0)的地方也为0,

    最后我们看到G5的存储矩阵是对角线对称的。

    图G6中,V4到V3有连线,所以坐标为(4,3)的地方为1,而V3到V4没有连线,所以坐标为(3,4)的地方为0.


    邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接顶点。

    下图就是一个无向图的邻接表结构。


    上图中,V0与V1,V2和V3有连接,V1与V0,V2有连接。。。。。


    有向图的邻接矩阵使用c语言实现如下:

    #include <stdio.h>
    #include <malloc.h>
    //有10个顶点
    #define VERTEXNUM 10
    
    void createGraph(int (*edge)[VERTEXNUM], int start, int end);
    void displayGraph(int (*edge)[VERTEXNUM]);
    
    int main(void){
    		//动态创建存放边的数组
            int (*edge)[VERTEXNUM] = (int (*)[VERTEXNUM])malloc(sizeof(int)*VERTEXNUM*VERTEXNUM);
    		//初始化数组
            int i,j;
            for(i=0;i<VERTEXNUM;i++){
                    for(j=0;j<VERTEXNUM;j++){
                            edge[i][j] = 0;
                    }
            }
            printf("after init:
    ");
            displayGraph(edge);
    
            createGraph(edge,0,1);
            createGraph(edge,1,3);
            createGraph(edge,4,3);
            createGraph(edge,4,1);
    
            printf("after create:
    ");
            displayGraph(edge);
            free(edge);
            return 0;
    }
    
    //创建一条edge,从顶点start到顶点end
    void createGraph(int (*edge)[VERTEXNUM], int start, int end){
            edge[start][end] = 1;
    }
    
    //打印图的存储
    void displayGraph(int (*edge)[VERTEXNUM]){
            int i,j;
            for(i=0;i<VERTEXNUM;i++){
                    for(j=0;j<VERTEXNUM;j++){
                            printf("%d ",edge[i][j]);
                    }
                    printf("
    ");
            }
    }

    程序执行结果为:

    after init:
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    after create:
    0 1 0 0 0 0 0 0 0 0
    0 0 0 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 1 0 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0


    有向图的邻接表使用c语言实现如下:

    #include <stdio.h>
    #include <malloc.h>
    //定义最多10个顶点
    #define VERTEXNUM 10
    
    typedef struct edge{
            int vertex;
            struct edge* next;
    }st_edge;
    
    void createGraph(st_edge** edge, int start, int end);
    void displayGraph(st_edge** edge);
    void delGraph(st_edge** edge)
    
    int main(void){
    		//动态创建存放边的指针数组
            st_edge** edge = (st_edge**)malloc(sizeof(st_edge*)*VERTEXNUM);
    		//初始化指针数组
            int i;
            for(i=0;i<VERTEXNUM;i++){
                    edge[i] = NULL;
            }
    
            printf("after init:
    ");
            displayGraph(edge);
    
            createGraph(edge,0,1);
            createGraph(edge,1,3);
            createGraph(edge,4,3);
            createGraph(edge,4,1);
    
            printf("after create:
    ");
            displayGraph(edge);
    	delGraph(edge);
            return 0;
    }
    
    //创建一条edge,从顶点start到顶点end 
    void createGraph(st_edge** edge, int start, int end){
            st_edge* newedge = (st_edge*)malloc(sizeof(st_edge));
            newedge->vertex = end;
            newedge->next = NULL;
            edge = edge + start;
            while(*edge != NULL){
                    edge = &((*edge)->next);
            }
            *edge = newedge;
    }
    
    //打印图的存储  
    void displayGraph(st_edge** edge){
            int i;
            st_edge** p;
            for(i=0;i<VERTEXNUM;i++){
                    printf("%d:",i);
                    p = edge+i;
                    while((*p) != NULL){
                            printf("%d ",(*p)->vertex);
                            p = &((*p)->next);
                    }
                    printf("
    ");
            }
    }
    
    //删除图
    void delGraph(st_edge** edge){
            int i;
            st_edge* p;
            st_edge* del;
            for(i=0;i<VERTEXNUM;i++){
                    p = *(edge+i);
                    while(p != NULL){
                            del = p;
                            p = p->next;
                            printf("del:%d
    ",del->vertex);
                            free(del);
                    }
                    edge[i] = NULL;
            }
            free(edge);
    }


    程序执行结果为:

    after init:
    0:
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    after create:
    0:1
    1:3
    2:
    3:
    4:3 1
    5:
    6:
    7:
    8:
    9:

  • 相关阅读:
    7
    6
    Robot Motion -- 机器人路径规划
    Delaunay Triangulation
    Voronoi Diagram -- 泰森多边形 (维诺图)
    Window query -- 区间线段包含问题
    5
    es6模块化
    js模块化编程之彻底弄懂CommonJS和AMD/CMD!
    混合开发菜鸟级别总结笔记 内容来自百度一下,你就知道
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3157124.html
Copyright © 2011-2022 走看看