2016-04-07 1 views
2

私は、次の構造体作成する場合:Cはどのようにポインタが二重リンクリストで動作するのですか?

typedef struct node { 
    int a; 
    char b[100][15]; 
    struct node *prev; 
    struct node *next; 
} Scope; 

は私head_nodeを初期化するために、ポインタを使用する必要がありますか?現在、これは私の初期化関数である:いくつかの機能で

Scope initScope() { 
    Scope head; 
    head.a = 1; 
    head.prev = NULL; 
    head.next = NULL; 
    return head; 
} 

私は

Scope head = initScope(); 

を言うとこれはこれまでのところ私には大丈夫そうですが、私は新しいノードを作成するかどうかはわかりません。私はScope型のポインタが必要であると推測しています。 Scopeのサイズをmallocしてから、その値を初期化する必要があります。頭を作るときも同じことをするべきですか?私が答えようとしている根本的な問題は、ここでポインタの目的は何ですか?私の構造体の定義の中で、私は

*Scope 

代わりの

Scope 

を書いていた場合はどう?私はノードを作成するためにポインタを使用する必要がある場合、なぜ構造体をポインタにしないのですか?私の理解から、ポインタを使ってメモリを操作できるようになりました。ノードを作成して移動するときに残されるのは何ですか?

答えて

0

これまでのところ大丈夫ですが、どのように新しいノードを作成するのか分かりません。 Scopeオブジェクトの

prevnextメンバーは、リンクリストを作成するために、他のScopeのオブジェクトを指している必要があります。

これらのオブジェクトは、静的に割り当てられたオブジェクトの配列または動的に割り当てられたオブジェクトに存在することがあります。

  1. あなたはまた、動的に1つのコールを使用して、すべてのオブジェクトを割り当てることができ

    Scope* node = malloc(sizeof(*node)); 
    node->next = node->prev = NULL; 
    for (int i = 0; i < 9; ++i) 
    { 
        Scope* temp = malloc(sizeof(*temp)); 
        temp->prev = NULL; 
        temp->next = node; 
        node->prev = temp; 
        node = temp; 
    } 
    

    動的に割り当てられたオブジェクトからのリンクリストを作成する静的に割り当てられた配列

    Scope scopes[10]; 
    scopes[0].prev = NULL; 
    scopes[9].next = NULL; 
    for (int i = 0; i < 9; ++i) 
    { 
        scopes[i].next = &(scopes[i+1]); 
        scopes[i+1].pref = &(scopes[i]); 
    } 
    
  2. からリンクリストを作成します。

    Scope* scopes = malloc(10*sizeof(*scopes)); 
    

    このようにして静的に割り当てられた配列と同様に扱います。

    オブジェクトを割り当てる方法によっては、freeへの適切な呼び出しが必要です。

+0

私はノードを作成するためのポインタを使用していますか?最初のノードにはヌルポインタがあり、その後のすべてのノードは次のポインタにリンクされますか?だから、私は構造体を使って特定のサイズのメモリブロックを割り当てていますか? – Pareod

+0

ポインタがオブジェクトを指しています。私はあなたが何を意味するのか分かりません*ノードを作成するためのポインタを使用していますか?*ノードが1つだけの場合、それは 'next'と' prev'メンバーはNULLになります。さもなければ、彼らはしません。はい、特定のサイズのメモリブロックを割り当てるために 'struct'を使用しています。 –

+0

私は、 'int = 5'というより、' int * ptr = malloc(sizeof(int));と言っています。 &ptr = 5; '本質的に私はsize intのメモリを切り離しています。このアイデアをリンクリストに適用すると、私はそれをこのようにする必要があります。そうしないと、すべてのノードに固有の変数名を持つことになります。あるいは、それぞれに固有のインデックスを持つノードの配列を持っていますか?なぜ私は頭の後にノード用のポインタを使う必要があるのか​​理解し始めていると思います。 – Pareod

関連する問題