0

リンクされたリストのコードを理解しようとしています。それらがどのように機能するかを理解しています。動的メモリとリンクされたリストを処理するコードを見ています。ここで簡略化しました。

 #include <stdio.h>
 #include <stdlib.h>

 typedef struct node {
     char *word;
     struct node *next;
 } node;

 void display_word(node *start) {
     node *start_node = start;
     puts("");
     for(; start_node != NULL; start_node = start_node->next) {
         printf("%s", start_node->word);
     }
 }

 node* create_node(char *input) {
     node *n = malloc(sizeof(node));;
     n->word = strdup(input);
     n->next = NULL;
     return n;
 }

 int main() {
     node *start_node = NULL;
     node *n = NULL;
     node *next_node = NULL;
     char word_holder[20];
     for(; fgets(word_holder,80,stdin) != NULL; n = next_node) {
         next_node = create_node(word_holder);
         if(start_node == NULL)
            start_node = next_node;
    if(n != NULL)
        n->next = next_node;
    }
    display_word(start);
 }

したがって、プログラムはユーザーが入力した各単語のリンクされたリストを作成し、それを出力します。私が理解していないのは、新しいノードを作成するために毎回 next_node が新しいノードに割り当てられる main() 関数にありますが、start_node は next_node を指しているため、毎回 next_node が作成するすべての新しいノードを指しますか? では、どうすればリストを維持できるのでしょうか? 毎回古いノードを失うべきではありませんか?

誰か説明してください。

4

3 に答える 3

2

最初のノードが作成されると、そのノードへのポインターが start に保存されます。

for ループの最後の部分 (;n = next) がループの反復ごとに実行されるため、ループの反復ごとに "n" が作成されたばかりのノードに設定されます。そのため、ミッドループ実行 "n" は常に前のノードを指します。したがって、ステートメント n->next = next は、前のノードの「次の」ポインタを新しいノードに設定しています。

したがって、ループの 2 回目の繰り返しでは、n = start であり、start->next は作成したばかりのノードの「next」に設定されます。

于 2013-06-19T18:46:20.343 に答える
2
  1. 最初のノードが作成されると、そのノードへのポインタが に保存されstartます。

  2. 後続のノードが作成されると、それらはリストの最後startに追加されるため、引き続き最初のノードを指し、それを介してリストの残りを指します。

デバッガーでコードをステップ実行するか、鉛筆と紙を取り出して、脳内でステップ実行するときに何が起こっているかを描画すると、すべてがどのようにまとめられるかがわかります。

于 2013-06-19T18:21:06.883 に答える
1

これがあなたの質問に答えてくれることを願っています-「次」を更新するたびに、それをさらに別の新しいノードに設定しています。各ノードには、次のノードにつながる独自の「次」があるため、この方法で何も失うことはありません。コードを実際にテストしたわけではありませんが、「開始」は常に最初のノードを指しているため、途中でノードを失うことはありません。これがどのように機能するかについて詳しく知りたい場合は、デバッガーが役立ちます。

于 2013-06-19T18:22:54.800 に答える