2012-04-06 21 views
3

で実装リンクされたリストの中に二重のポインタに対して単一の使用:私はリンクリストの末尾に要素を追加するために、このコードを書いていたC

struct node{ 
    int info; 
    struct node* link; 
}; 

void append (struct node **q, int num) 
{ 

struct node *temp, *r ; 

if (*q == NULL)  // if the list is empty, create first node 
{ 
    temp = (struct node*) malloc (sizeof (struct node)) ; 
    temp -> info = num ; 
    temp -> link = NULL ; 
    *q = temp ;   
} 
else{ 
    temp = *q ;   

    /* go to last node */ 
    while (temp -> link != NULL) 
     temp = temp -> link ; 

    /* add node at the end */ 
    r = (struct node *)malloc (sizeof (struct node)) ; 
    r -> info = num ; 
    r -> link = NULL ; 
    temp -> link = r ; 
} 
} 

と私はこのような機能を追加呼び出す:listがある append(&list, 10);リンクリストへのポインタ

このコードは機能しますが、単一ポインタを追加機能(** qの代わりに* qを使用)で使用し、それに応じて変更しますそれは動作しません。そのため第二の例では?:

void append (struct node *q, int num) 
{ 

struct node *temp, *r ; 

if (q == NULL)  // if the list is empty, create first node 
{ 
    temp = (struct node*) malloc (sizeof (struct node)) ; 
    temp -> info = num ; 
    temp -> link = NULL ; 
    q = temp ;   
} 
else{ 
    temp = q ;   

    /* go to last node */ 
    while (temp -> link != NULL) 
     temp = temp -> link ; 

    /* add node at the end */ 
    r = (struct node *)malloc (sizeof (struct node)) ; 
    r -> info = num ; 
    r -> link = NULL ; 
    temp -> link = r ; 
} 
} 
+1

なぜこれはC++とタグ付けされていますか? – iammilind

+1

CとC++は密接に関連しているので、私はC++の知識を持つ人が私をここで助けてくれるかもしれないと仮定していました。 – Jatin

+1

ちなみに、これは、ランタイムが要素の数に比例して増加するため、要素をリストに追加する悪い方法です。従来のアプローチでは、リストの両端へのポインターを維持することで、一定時間内に追加を行うことができます。 –

答えて

3

以下のコードが間違っている何、qは、呼び出し側によって渡されたポインタのコピーです。呼び出し元の元のポインタは決して変更されません。

+0

しかし 'list'はノードへのポインタです。したがって、アドレスを格納します。だから、私が 'append(list、10);を呼び出すと、アドレスを渡しているので、元のリンクリストを変更してはいけません。 – Jatin

+0

@Jatin: "リストが空の場合は、最初のノードを作成してください"というラベルのコード部分ではありません。 –

+0

リストに少なくとも1つの要素があると仮定すると、2番目のコードが正しく機能しますか? – Jatin

1

あなたの最初のスニペット(正しい)では、あまりにも多くのことをしています。

void append (struct node **q, int num) 
{ 

struct node *new ; 

    /* go to last node */ 
    for (; *q; q = &(*q)->link) {;} 

    /* add node at the end */ 
    new = malloc (sizeof *new); 
    if (!new) { barf_now(); return; } 

    new->info = num ; 
    new->link = NULL ; 
    *q = new; ; 
    } 
} 

基本的な考えは、リストの末尾に追加することです。あなたがする必要があります。

  • 最初のNULLポインタを見つける
  • セットそれは「空のリスト」の場合は特別なものではありません、それはちょうどあなたができることを意味し、新たなポインタの値

に値ですNULLポインタをゼロステップで見つけます。このようにして符号化する特別なケースはありませんとなり、if (...) ... else ...構造は必要ありません。

関連する問題