2016-08-14 5 views
1

Iは、次のデータ構造を有する:C - リンクされたリストのような行列の表現

enter image description here

リンクリストとして行列を表します。

マトリックスの新しい行を一番下に追加し、そのリストの値をゼロで初期化する必要があります。

質問:ノードごとに2つのリンクを持つ単一のリストを使用することはできますか?そうすれば、新しいリストを水平ポインタ(リンク)の下に追加することができます。

しかし、私はどのように垂直ポインタ(リンク)を次のリストにリンクするのか分かりません。

誰かが下部リストの垂直ポインタをリンクする方法を説明できますか?

+2

その図は間違いなく何の配列でもありません。私はあなたが2Dのリンクされたリストとしてそれを記述できると思います。 –

+1

なぜ2Dリンクリストは行列の良いデータ構造だと思いますか? –

+0

@Oliver Charlesworthあなたは、このデータ構造は2Dリンクリストとして記述できると言っていますが、それを平らにすることはできないでしょうか?これを平らにすることはできないようです。 – ufo

答えて

2

は、私が質問を理解していれば、[はいその可能性、そしてあなたは、ポインタ対を使用したので、反復的に行うことができますポインタとフォワードチェイン、入力トラバーサル順序でリンクリストを構築するための一般的なテクニックです。

は次のようにノード構造を考える:

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

あなたは「マトリックス」の下部に1対1のマッチングノードがハングアップすることができます(意味、あなたの現在の一番下の行は、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(空のテーブル)に行を追加します。 newNoderight pointerとしてその行のセーブbottomLeft->rightnewNode

  • bottomLeftへの追加行の newNode
  • リンクup pointerを新しい要素を作成します

    1. non-NULL要素bottomLeftに行を追加するには

    2. 設定値に戻る
    3. 0から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; 
        } 
    } 
    
  • 関連する問題