単連結リストの整列 #103 成績記録の実装の誤り

二教科の成績記録の#100での実装に間違いがあった。
school_record_t型の実体を生成する関数school_record_newにおいて、
生徒の名前p->nameのための領域の割り当てに失敗したときに、
既に割り当てていたschool_record_t型の領域を解放しているものの、
解放済みのその領域を指すポインタをそのまま関数の戻り値として返していた。
修正はシンプルに、

school_record.c
...snip
school_record_t *school_record_new(const char *name, const grade_t *maths, const grade_t *physics)
{
    school_record_t *p = NULL;
    if (name != NULL) {
        p = malloc(sizeof(school_record_t));
        if (p != NULL) {
            p->name = malloc(strlen(name) + 1);
            if (p->name != NULL) {
                strcpy(p->name, name);
                p->maths = maths;
                p->physics = physics;
            } else {
                free(p);
                p = NULL;
            }
        }
    }
    return p;
}
...snip