#include <stdio.h>
#include <malloc.h>
#include <string.h>

#define REGISTER(n, number, name) \
    do { \
        printf(" %d 番目の学生の学籍番号と氏名を登録します。\n", n); \
        pointer_root = register_student(pointer_root, number, name); \
    } while(0)
#define TAIL 0

struct student {
    int number; //学生番号
    char name[10]; //苗字
    struct student *next;
};

struct student *register_student(struct student *head, int number, char *name)
{
    struct student *new = (struct student *)malloc(sizeof (struct student));
    new->number = number;
    strcpy(new->name, name);
    new->next = head;
    return new;
}

int main(void)
{
    int in_number;
    char in_name[10];
    struct student *pointer_root = TAIL;
    struct student *pointer_student;

    printf("今からデータを自動的に登録して、リスト構造を作成します。\n");

    REGISTER(1, 175, "tanaka");
    REGISTER(2, 176, "yamada");
    REGISTER(3, 177, "nakamura");
    REGISTER(4, 178, "aoki");
    REGISTER(5, 179, "katoh");

    printf("\n");
    printf("名簿に登録された学生のリストを表示します。\n");
    pointer_student = pointer_root;

    while (pointer_student != TAIL) {
        printf("%d  %s\n", pointer_student->number , pointer_student->name);
        pointer_student = pointer_student->next;
    }

    printf("\n");
    printf("リスト構造の最初に新しい学生を追加します。\n");
    printf("追加する学生番号と氏名を入力してください。");
    scanf("%d %s", &in_number , in_name);

    pointer_root = register_student(pointer_root, in_number, in_name);

    printf("\n");
    printf("学生が追加登録されたので、名簿に登録された学生のリストを表示します。\n");
    pointer_student = pointer_root;

    while (pointer_student != TAIL) {
        printf("%d  %s\n", pointer_student->number, pointer_student->name);
        pointer_student = pointer_student->next;
    }
    return 0;
}