参考: 日経ソフトウエア 2019年 9 月号, pp.77-83
標準入力から文字列が入力されるたびにその文字列を新たなノードとして作成する。
#include <stdio.h> #include <stdlib.h> #include <string.h> struct Node{ char data[20]; Node* next; // 次ノードアドレス }; int main(){ char s[80]; Node* top; // 先頭ノードアドレスを格納するためのポインタ変数 Node* current; // 現在ノードアドレスを格納するためのポインタ変数 top = NULL; for(;;){ scanf("%s", s); if(strcmp(s, "exit") == 0){ break; } else if(top == NULL){ // 先頭ノードアドレスが空であったら(すなわち初めて作成するノードであったら)、 top = (Node*)malloc(sizeof(Node)); // ノード1個分に必要なメモリを確保し、そのメモリの先頭アドレスを先頭ノードアドレスに設定するとともに(イ)、 current = top; // 今作ろうとしているノード(すなわち先頭ノード)のアドレスに設定する(イ)。 } else{ // すでにいくつかノードが作成済みであったら、 current->next = (Node*)malloc(sizeof(Node)); // ノード1個分に必要なメモリを確保し、そのメモリの先頭アドレスを現在ノードの次ノードアドレスに設定するとともに(ロ)、 current = current->next; // 今作ろうとしているノードのアドレスに設定する(ハ)。 } strcpy(current->data, s); // 入力された文字列を現在ノードのdataメンバーに代入し、 current->next = NULL; // 現在ノードの次ノードアドレスを空にする(ニ)。すなわちこれが現時点で末尾のノードとなる。 } // 先頭から順番にたどる。 current = top; while(current != NULL){ printf("[%s]\n", current->data); // 表示し終えたら、 free(current); // そのノード用に動的に確保したメモリを解放する。 current = current->next; } return 0; }