1

これは、最初にノードを追加する私のコードです。

void screate(ll *node)
{
  ll *newNode=(ll *)malloc(sizeof(ll));
  printf("Enter number :\t");
  scanf("%d",&newNode->data);
  if(newNode->data != NULL)
  {
    newNode->next=node;
    node= newNode;
    screate(node);
  }
  else
  {
    free(newNode);
    newNode=NULL;
  }
}

ここで同じコードを見つけても、なぜ間違った出力が得られるのかわかりません。

これが現在のノードです

56->78->77->NULL

しかし、最初に新しいノードを追加しようとしても、同じ出力が得られます56->78->77->NULL. 助けが必要 !!

アップデート

void show(ll *node){
while(node->next != NULL)
 {
  printf("%d->",node->data);
  node=node->next;
 }
printf("NULL");
}
4

4 に答える 4

4

node関数へのパラメーターにすぎません。値で渡されるため、呼び出し元の関数が保持するバージョンは更新されません。

代わりにポインタを渡し(つまりll **node)、コードを変更して に割り当てる必要があります。*nodeまた、呼び出し元を変更し&て、引数の前に a を追加してそのアドレスを取得する必要があります。

void screate(ll **node)
{
  ll *newNode=malloc(sizeof(ll));
  printf("Enter number :\t");
  scanf("%d",&newNode->data);
  if(newNode->data != NULL)
  {
    newNode->next=*node;
    *node= newNode;
    screate(node);
  }
  else
  {
    free(newNode);
  }
}

何かへのポインターを関数に渡すと、何かを変更できますが、ポインター自体は変更できません。したがって、自然な結論は、何か自体をポインターにすることです。つまり、ポインターへのポインターです。

原則として、このポインター連鎖は好きなだけ深くすることができますが、実際には、通常、「ポインターからポインターへのポインター」以上のものは必要ありません。

他のいくつかのポイント。小文字の L は、多くのフォントで数字の 1 (および大文字の I) と混同されやすいためl、 andのような変数名は避けるようにしてください。llまた、再帰呼び出しを再度使用すると、代わりにループscreate()としてより効率的になる可能性があります。while一部のコンパイラは、それが末尾再帰であることを発見し、とにかくループに最適化しますが、最初からループを使用することが明らかな場合、私はそのようなことに頼りたくありません。

于 2013-01-20T09:33:11.713 に答える
3
newNode->next=node;
node = newNode;

問題は、呼び出し元が変更を認識しないことを意味するnode = newNodeローカル コピーのみを変更することです。node呼び出し元にとっては、関数を呼び出したことがないかのように、node以前に指していた場所をまだ指しています。

ll **nodea を渡して変更したい場合*nodeや、何か他のものを使用したい場合があります。

于 2013-01-20T09:31:08.310 に答える
1

リンクされたリストポインターへのポインターとしてパラメーターを使用して署名を変更する必要があります

void screate(ll **node);

そして、関数内の対応するポインターの変更は、次のようにする必要があります

newNode->next=*node;
*node= newNode;
screate(&node);
于 2013-01-20T09:39:54.710 に答える
0

を返すように screate 関数を変更することをお勧めしますstruct ll *。戻り値は、新しいヘッド ノードに対応します。

if(newNode->data != NULL)scanf からの入力エラーを検出する賢明な方法ではありません。実際、そのコード行は賢明ではありません。NULL は、NULL ポインターのセットのメンバーとして識別されます。newNode->data は int であり、ポインターではありません。それを0と比較すると、より意味があります。[ここ][1] は、標準化された scanf リファレンスです。これを注意深く読み、次の質問に答えてください。そうすれば、scanf の成功と失敗を区別する方法がわかります。

int x, y;
int z = scanf("%d%d", &x, &y);
int c = getchar();
  1. stdin から "abcd{enter}" を送信すると、z は何になりますか?
  2. stdin から "abcd{enter}" を送信すると、c は何になりますか?
  3. stdin を介して EOF シグナルを送信すると、scanf は何を返しますか?
  4. 正常に読み取り、2 つの変数 x と y に値を入れると、z はどの値になるでしょうか?
于 2013-01-20T12:21:35.490 に答える