連結リスト / ノードを動的に作る

参考: 日経ソフトウエア 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;
}

f:id:ti-nspire:20191029080454p:plain:h150 f:id:ti-nspire:20191029080528p:plain:h150
f:id:ti-nspire:20191029084540p:plain