圖的十字鏈表存儲(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;
    }
}

 

 

 

就這樣十字鏈表的創建就完成了。

 

 

例子如圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM