zoukankan      html  css  js  c++  java
  • 图的十字链表存储(C语言)

    时间一晃已经大二下了,学校也开了数据结构的课,想起了自己大一刚会C语言,自学数据结构的时候,那时候很无助啊,不懂就只有拼命看,改bug改很久。

    老师一节课讲完了邻接表,十字链表,邻接多重表。然而感觉他好像在自己讲自己的,一点也不认真。

    但是依托老师是不行的,只懂理论也不行,或许学生认为邻接矩阵,邻接表不就那种东西吗?很简单啊。

    大一的时候我也觉得C语言很简单啊,然后一写不都是错?

    不写代码的数据结构不叫数据结构。

    不多说,开始吧。

    邻接表固然优秀,但也有不足,例如对有向图的处理上,有时候需要再建立一个逆邻接表。

    而这个十字链表就是把邻接表和逆邻接表结合的玩意。

    所以重新定义节点的数据结构

    对比邻接表(参看:http://www.cnblogs.com/You0/p/4477538.html)

    我们看到顶点表多了一个指针。多了一个In的指针。

    描述成代码就是这样

    typedef struct VexNode{
        int data;
        ArcBox *firIn;
        ArcBox *firOut; 
    }VexNode;

    假设此时我们保存的是v1 -> v0 这条边,此时headVex就是1,tailvex就是0,

    至于headLink,如果v1还指向v2,v1 -> v2那么headLink就指向 “v1->v2这条边”。

    就是headlink指向弧头相同的下一条弧。

    taillink指向弧尾相同的下一条弧。

    不明白的话,下面有图。

    那么其数据结构就为:

    typedef struct ArcBox{
        int headVex,tailVex;
        ArcBox *hLink;*tLink;
    }ArcBox;

    还需要一个管理这2个数据结构的结构

    typedef struct{
        VexNode List[100];
        int vexnums,arcnums;
    }Graph;

    然后就是创建的Create函数:

    int LocalVex(int data,Graph* G){
        for(int i=0;i<G->vexnums;i++){  
            if(G->List[i].data==data)
                return i;  
        }  
        return -1;  
    }
    
    
    void create(Graph* G)
    {
        int x,y;
        printf("请输入顶点的个数的边的数量:");
        scanf("%d%d",&G->vexnums,&G->arcnums);
    
        for(int i = 0;i<G->vexnums;i++)
        {
            printf("输入顶点,建立顶点表:");
            //建立顶点表
            scanf("%d",&G->List[i].data);
            //初始化in和out指针
            G->List[i].firIn=G->List.firOut=NULL;
        }
    
        int x,y;
        for(int i=0;i<G->arcnums;i++)
        {
            printf("读入(vi-vj):");
            scanf("%d%d",&x,&y);
            ArcBox *A = (ArcBox)malloc(sizeof(ArcBox));
            int k,j;
            k = LocalVex(x,G);//k是弧尾的位置
            j = LocalVex(y,G);//j是弧头的位置
    
            A->headVex = j;
            A->tailVex = k;
            A->hLink = G->List[j].firIn;
            A->tLink = G->List[k].firOut;
            G->List[k].firOut = A;
            G->List[j].firIn = A;
        }
    }

    就这样十字链表的创建就完成了。

    例子如图:

  • 相关阅读:
    HDU 3081 Marriage Match II
    HDU 4292 Food
    HDU 4322 Candy
    HDU 4183 Pahom on Water
    POJ 1966 Cable TV Network
    HDU 3605 Escape
    HDU 3338 Kakuro Extension
    HDU 3572 Task Schedule
    HDU 3998 Sequence
    Burning Midnight Oil
  • 原文地址:https://www.cnblogs.com/You0/p/5462505.html
Copyright © 2011-2022 走看看