3

リンクリストの最後に要素を追加するためのこのコードを書いていました:

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 ;
}
}

そして、次のように追加関数を呼び出します。 リンクされたリストへのポインターはappend(&list, 10);どこですかlist

このコードは機能しますが、追加関数で単一のポインターを使用し (**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 ;
}
}
4

2 に答える 2

3

2 番目の例でqは、呼び出し元から渡されたポインターのコピーであるためです。呼び出し元の元のポインターが変更されることはありません。

于 2012-04-06T12:15:37.577 に答える
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 ...

于 2012-04-06T14:58:11.243 に答える