2016-08-14 55 views
1

我有以下的數據結構:Ç - 一個矩陣的表示作爲鏈接列表

enter image description here

表示一個矩陣作爲一個鏈表。

我需要在底部添加一個矩陣的新行並用零初始化該列表的值。

問題:是否有可能爲每個節點使用帶有兩個鏈接的單獨列表?這樣,我們可以在底部添加一個新的列表,並帶有水平指針(鏈接)。

但我不明白如何將垂直指針(鏈接)鏈接到下一個列表。

有人可以解釋如何鏈接底部列表的垂直指針?

+2

該圖絕對不是任何數組。我想你可以把它描述成二維鏈表。 –

+1

爲什麼認爲2D鏈表是一個矩陣的良好數據結構? –

+0

@Oliver Charlesworth你說這個數據結構可以被描述爲二維鏈表,但是這不是說它可以被展平嗎?看起來這不能被平息。 – ufo

回答

2

如果我理解這個問題,然後是它的可能,你可以這樣做反覆使用指針TO-指針和正向鏈接,這是一種在輸入遍歷順序中構建鏈表的常用技巧。

給定的節點結構是這樣的:

struct Node 
{ 
    struct Node *up; 
    struct Node *right; 
    int value; 
}; 

您可以在「黑客帝國」的底部掛一個換一個匹配節點(意思是,你目前的底部行有N個節點,增加行同樣會做這個有N個節點):

struct Node *addRow(struct Node *mat) 
{ 
    struct Node *res = NULL, **pp = &res; 
    for (; mat; mat = mat->right) 
    { 
     *pp = malloc(sizeof **pp); 
     (*pp)->value = 0; 
     (*pp)->up = mat; 
     pp = &(*pp)->right; 
    } 
    *pp = NULL; 
    return res; 
} 

這是通過走指針到指針在列表中創建,總是有它解決將被設置爲指向下一個指針新節點。當列表完成時,最後的right指針必須設置爲NULL來終止右鏈表(*pp = NULL;完成此操作)。

執行簡直變成

mat = addRow(mat); 

就是這樣。

1

使用遞歸:

要添加行NULL(佔空表)返回NULL(空表)。

要添加行non-NULL元素bottomLeft

  1. 創建新的元素newNodebottomLeft
  2. 追加行newNode
  3. 鏈接up pointerbottomLeft->right保存該行作爲newNoderight pointer
  4. 設定值0
  5. 返回newNode

例子:

struct Node; 

struct Node { 
    struct Node *up; 
    struct Node *right; 
    int value; 
}; 

struct Node *addRow(struct Node *bottomLeft) { 
    if(bottomLeft == NULL) { 
     return NULL; 
    } else { 
     struct Node* newNode = malloc(sizeof(struct Node)); 
     newNode->value = 0; 
     newNode->up = bottomLeft; 
     newNode->right = addRow(bottomLeft->right); 
     return newNode; 
    } 
}