1

リスト(より正確にはリストへのポインタ)を取得し、リストの最後に値を挿入するリンクリスト挿入関数を作成しようとしています。

void ll_insert(struct ll **l, int n){
  struct ll *temp=NULL;
  while ( (*l) != NULL){
    temp= (*l);
    (*l) = (*l)->next;
  }
  (*l)= (struct ll*)malloc(sizeof(struct ll));
  (*l)->n=n;
  (*l)->next=NULL;
  if (temp) temp->next= (*l);
}


int main(void){
  struct ll *l=NULL;                                                                                                                                                         
  ll_insert(&l, 1);
  printf("%d ", l->n);
  ll_insert(&l, 1);
  ll_insert(&l, 2);
  ll_insert(&l, 3);
  printf("%d ", l->n); 

}

上記のコードを実行した後の出力は13です。

(*l) = (*l)->next;

エンドノードを指すようにリストを更新し、insert(...)を実行するたびに、リストのヘッドが最後を指すように更新されます(間違っていない場合)。これを回避する方法は何ですか?

4

3 に答える 3

3

ポインタを正しく使用していません:whileループ内のこの行

(*l) = (*l)->next;

する必要があります

l = &((*l)->next);

そのように使用すれば、temp変数はまったく必要ありません。

これはC++ではなくCなので、キャストしなくても問題ありませんmalloc

于 2012-07-17T01:19:06.407 に答える
1

関数は、空のリストに挿入している場合にのみ* lを変更する必要があります。これは、リストの最初の要素が変更される唯一のケースだからです。これは、これらの場合に関数内で* lの代わりにローカル変数を使用することで実現できます(* lに初期化されます)。

于 2012-07-17T01:18:50.427 に答える
0

ポインタlを動かさないと、リストの先頭に残ります。最初にlをtempに割り当て、次にtempをリストに沿って移動しますが、ポインタlはそのままにしておきます。

于 2012-07-17T01:27:16.977 に答える