単連結リストの整列 #105 さらに分割

成績の評点に関する部分を独立させて、不必要に複雑度を増やし分かりにくくしてみる。

grade.h
#ifndef GRADE_H_INCLUDED
#define GRADE_H_INCLUDED

typedef struct tag_grade grade_t;

extern const grade_t * const GRADE_A;
extern const grade_t * const GRADE_B;
extern const grade_t * const GRADE_C;
extern const grade_t * const GRADE_D;
extern const grade_t * const GRADE_F;

/*
compares g1 with g2 for order.
returns a positive, zero, or a negative value as g1 > g2, g1 == g2, or g1 < g2.
*/
int grade_compare(const grade_t *g1, const grade_t *g2);

#endif /* GRADE_H_INCLUDED */
grade.c
#include "grade.h"

struct tag_grade {
    enum {GRADE_VAL_A = 5, GRADE_VAL_B = 4, GRADE_VAL_C = 3, GRADE_VAL_D = 2, GRADE_VAL_F = 1} grade;
};

grade_t grades[] = {{GRADE_VAL_A}, {GRADE_VAL_B}, {GRADE_VAL_C}, {GRADE_VAL_D}, {GRADE_VAL_F}};
const grade_t * const GRADE_A = &grades[0];
const grade_t * const GRADE_B = &grades[1];
const grade_t * const GRADE_C = &grades[2];
const grade_t * const GRADE_D = &grades[3];
const grade_t * const GRADE_F = &grades[4];

int grade_compare(const grade_t *g1, const grade_t *g2)
{
    if (g1->grade > g2->grade) return 1;
    else if (g1->grade == g2->grade) return 0;
    else return -1;
}