图的存储

定义:图形结构是一种比树形结构更复杂的非线性结构。在树形结构中,结点间具有分支层次关系,每一层上的结点只能和上一层中的至多一个结点相关,但可能和下一层的多个结点相关。而在图形结构中,任意两个结点之间都可能相关,即结点之间的邻接关系可以是任意的 。

图的结构有无向图,有向图,网图

无向图.png
有向图.png
网图.png

上面三张图分别是不同的结构图像

而实现图的存储结构有两种:
一、邻接矩阵
二、邻接表

下面通过分别通过两种方式去实现图的结构

一、邻接矩阵:

邻接矩阵使用而为数组来描述图的结构,如果是无向图,邻接矩阵与主对角对称。

截屏2020-04-30 上午11.32.06.png
typedef int Status;         //函数状态值
typedef char VertexType;    //顶点类型
typedef int EdgeType;       //边上的权值

typedef struct {
    VertexType vexs[MAXVEX];//顶点表
    EdgeType arc[MAXVEX][MAXVEX];//w    q图中当前的顶点数和边数
    int numNodes,numEdges;//图中当钱的顶点数和边数
}MGraph;

void CreateMGraph(MGraph *G){
    int i,j,k,w;
    printf("输入顶点数和边数:\n");
    //1、输入顶点数/边数
    scanf("%d,%d",&G->numNodes,&G->numEdges);
    printf("顶点数:%d,边数:%d\n",G->numNodes,G->numEdges);
    //2、输入顶点信息/顶点表
    for (i = 0; i<=G->numNodes; i++) {
        scanf("%c",&G->vexs[i]);
    }
    //3、初始化邻接矩阵
    for (i = 0; i<G->numNodes; i++) {
        for (j = 0; j<G->numNodes; j++) {
            G->arc[i][j] = INFINITYC;
        }
    }
    //4、输入边表信息
    for (k = 0; k<G->numEdges; k++) {
        printf("输入边(vi,vj)上的下标i,下标j,权值w\n");
        scanf("%d,%d,%d",&i,&j,&w);
        
        G->arc[i][j] = w;
        //如果无向图,矩阵对称(可以自己对是否为有向图或无向图进行设置判断)
        G->arc[j][i] = G->arc[i][j];
        
    }
    //5、打印邻接矩阵
    for (i = 0; i<G->numNodes; i++) {
        printf("\n");
        for (j = 0; j<G->numNodes; j++) {
            printf("%d ",G->arc[i][j]);
        }
    }
    printf("\n");
}

打印输出

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"邻接矩阵实现图的存储!");
        MGraph G;
        CreateMGraph(&G);
    }
    return 0;
}

/*
2020-04-30 11:22:01.704420+0800 图的存储[1483:78312] 邻接矩阵实现图的存储!
输入顶点数和边数:
5,6
顶点数:5,边数:6
abcde
输入边(vi,vj)上的下标i,下标j,权值w
0,4,6
输入边(vi,vj)上的下标i,下标j,权值w
1,0,9
输入边(vi,vj)上的下标i,下标j,权值w
1,2,3
输入边(vi,vj)上的下标i,下标j,权值w
2,0,2
输入边(vi,vj)上的下标i,下标j,权值w
2,3,5
输入边(vi,vj)上的下标i,下标j,权值w
3,4,1

0 9 2 0 6 
9 0 3 0 0 
2 3 0 5 0 
0 0 5 0 1 
6 0 0 1 0 
*/

二、邻接表

[图片上传失败...(image-bee723-1588218029752)]

看上图中的结构,我们可以创建n个链表,(n为节点的数量),然后将所有链表添加进去数组当中,然后对数组中的每一个链表的下一个值插入该节点连接的节点,进行遍历,将他们连接起来

#define M 100
#define FALSE 0
#define TRUE 1

typedef char Element;
typedef int BOOl;

typedef struct Node{
    int adj_vex_index;//弧头的下标,也就是被指向的下标
    Element data;//权重值
    struct Node *next; //边指针
}EdgeNode;

//顶点节点表
typedef struct VNode{
    Element data;//顶点的权值
    EdgeNode *firstedge;//顶点的下一个是谁
}VertexNode,Adjlist[M];

//总图的一些信息
typedef struct Graph{
    Adjlist adjlist;//顶点表
    int arc_num;//边的个数
    int node_num;//节点个数
    BOOl is_directed;//是不是有向图
}Graph,*GraphLink;

void CreateGraph(GraphLink *g){
    int i,j,k;
    EdgeNode *p;
    //1、顶点,边,是否有向
    printf("输入顶点数目,边数和有向:\n");
    scanf("%d,%d,%d",&(*g)->node_num,&(*g)->arc_num,&(*g)->is_directed);
    
    //2、顶点表
    printf("输入顶点信息:\n");
    for (i = 0; i<(*g)->node_num; i++) {
        getchar();
        scanf("%c",&(*g)->adjlist[i].data);
        (*g)->adjlist[i].firstedge = NULL;
    }
    //3、输入边的信息
    printf("输入边的信息:\n");
    for (k = 0; k<(*g)->arc_num; k++) {
        getchar();
        scanf("%d,%d",&i,&j);
        
        //1、新建一个节点
        p = (EdgeNode *)malloc(sizeof(EdgeNode));
        //2、弧头的下标
        p->adj_vex_index = j;
        //3、头插法插进去,插的时候要找弧尾,那就是顶点数组的下标i
        p->next = (*g)->adjlist[i].firstedge;
        //4、将顶点数组[i].firstedge设置为p
        (*g)->adjlist[i].firstedge = p;
        
        //j->i
        if(!(*g)->is_directed){
            //1、新建一个节点
            p = (EdgeNode *)malloc(sizeof(EdgeNode));
            //2、弧头的下标i
            p->adj_vex_index = i;
            //3、头插法插进去,插的时候找到弧尾,那就是顶点数组的下标i
            p->next = (*g)->adjlist[j].firstedge;
            //4、将顶点数组[i].firstedge设置为p
            (*g)->adjlist[j].firstedge = p;
        }
    }
    
}
//打印输出
void putGraph(GraphLink g){
    int i;
    printf("邻接表中存储信息\n");
    //遍历一遍顶点坐标,每个再进去走一次
    for (i = 0; i<g->node_num; i++) {
        EdgeNode *p = g->adjlist[i].firstedge;
        while (p) {
            printf("%c->%c  ",g->adjlist[i].data,g->adjlist[p->adj_vex_index].data);
            p = p->next;
        }
        printf("\n");
    }
}

打印结果

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"邻接表实现图的存储!");
        GraphLink g = (Graph *)malloc(sizeof(Graph));
        CreateGraph(&g);
        putGraph(g);
    }
    return 0;
}

/*
打印结果
2020-04-30 11:24:44.034591+0800 邻接表[1490:80421] 邻接表实现图的存储!
输入顶点数目,边数和有向:
4,5,0
输入顶点信息:
0 1 2 3
输入边的信息:
0,1 
0,2
0,3
2,1
2,3
邻接表中存储信息
0->3  0->2  0->1  
1->2  1->0  
2->3  2->1  2->0  
3->2  3->0  
Program ended with exit code: 0
*/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354