データを読み込んだ後、それが最初のデータか、2番目以降のデータかで
場合分けをしているため、malloc によるノードの確保が 2個所に必要です。
[1] データを読み込む
[2] ノードを作る
[3] リストにつなぐ
このようにすると、malloc は [2] で行い、場合分けは [3] だけで済みます。
コード:
#include <stdio.h> // scanf, puts, printf
#include <stdlib.h> // malloc, free
struct ListNode {
struct ListNode *next;
int data;
};
int main(void)
{
int count, temp;
struct ListNode *head = NULL, *tail = NULL, *node;
for (count = 0; ; count++) {
puts("データを入力してください");
scanf("%d", &temp);
if (temp == 0) break;
node = (struct ListNode *)malloc(sizeof *node);
node->next = NULL;
node->data = temp;
if (head == NULL) tail = head = node;
else tail = tail->next = node;
}
if (count < 5)
puts("入力数が足りません");
else
for (node = head; node != NULL; node = node->next)
printf("%d\n", node->data);
// 2番目と 3番目をノードを入れ替えて表示する処理をここに書く
while (head != NULL)
node = head, head = node->next, free(node);
return 0;
}
プログラムが終了してしまえば、メモリはすべて解放されるので
free は不要なのですが、malloc の実行回数と同数の free をプログラム
中で行うのが行儀のよいプログラムとなるので、追加しました。