2017-06-27 11 views
1

は、我々は、タスクとリンクリストの構造体を与えられています利点となぜ機能を作成するときに頭にダブルポインタを使用するだろうか?リンクされたリストの先頭にシングルまたはダブルポインタ

+0

私はこのデザインに反対することを勧めます。最初と最後の "ノード"へのポインタを持つ "リスト"構造体を持つ方が良いでしょう。これにより、ノードを直接扱うのではなく、ノードを直接渡すことでリストを変更することができます – Alexander

+0

通常は、 'bool add_dnodeint(dlistint_t ** head、int n)'とポインタ引数へのポインタと非ポインタ単純なポインタ引数と一致するポインタ戻り値( 'head = add_nodeint(head、newval)として使用される)を持つ' dlistint_t * add_nodeint(dlistint_t * head、int n) ; ')。通常は、一度に両方を実行することはありません - ポインタ引数へのポインタを使用し、ポインタ値を返します。 'const int n'は' n'がポインタではないのでかなり無意味です。 –

答えて

6

headへのポインタへのポインタを渡す理由は、ポインタheadへの変更が呼び出し側関数に見られ、関数から頭を返す必要はないということです。我々は返す代わりlistからnew_nodeを割り当てる必要がある場合は、フロント

struct Node *add_node (struct Node *list, int n){ 
    struct Node *new_node = malloc(sizeof(struct Node)); 
    if(new_node == NULL){ 
     printf("Memory allocation failed\n"); 
     exit(EXIT_FAILURE); 
    } 
    new_node->data = n; 
    new_node->next = list; 
    return new_node; 
} 

でリストにノードを追加する

struct Node{ 
    int data; 
    struct Node *next; 
}; 

機能:

たとえば、この単純なノードを考えます上記の関数を修正し、return文を削除して文を入れる必要があります。

list = new_node; 

ただし、動作しない
これは、Cではすべての引数と同様に、ポインタが値渡しされるためです。 つまり、listには、add_node関数に渡されたポインタ値のコピーが含まれ、この関数自体に渡されるポインタは含まれません。
これでポインタへのポインタが必要です。

void add_node (struct Node **list, int n){ 
    struct Node *new_node = malloc(sizeof(struct Node)); 
    if(new_node == NULL){ 
     printf("Memory allocation failed\n"); 
     exit(EXIT_FAILURE); 
    } 
    new_node->data = n; 
    new_node->next = *list; 
    *list = new_node; 
} 
0

あなたがdlistint_t *head変数を使用しての代わりに、関数パラメータにdlistint_t **head変数を使用している場合ので、その後、機能dlistint_t *add_dnodeint(dlistint_t **head, const int n);に変数headで行われた変更は、このメソッドにローカルになります。 Node*を使用しているため、変数headで行われた変更は、その関数に対してローカルです。関数呼び出し後でもこれらの変更を反映させたい場合は、dlistint_t **headを使用します。

2

ダブルポインタを使用する場合は、頭のアドレスを渡すことができますので、関数で実際のポインタを変更できます。あなたは新しい頭を返す必要はありませんこのように。

関連する問題