#include #include #include #include "list.h" typedef struct { int hp; list_t node; char name[1]; /* must be the last member, lager than 0. */ } champion_t; static void print_champs(const char *msg, const list_t *champs) { const list_t *node; printf("%s\n", msg); list_for_each(node, champs) { const champion_t *champ = list_entry(node, champion_t, node); printf("name:%s hp:%d\n", champ->name, champ->hp); } } static champion_t *new_champ(const char *name, const int hp) { champion_t *champ = (champion_t *)malloc(sizeof(*champ) + strlen(name)); champ->hp = hp; list_init(&champ->node); strcpy(champ->name, name); return champ; } static void add_champ(champion_t *champ, list_t *list) { list_add(&champ->node, list); } static void del_champ(champion_t *champ) { list_del(&champ->node); } static void destroy_champs(list_t *champs) { while (!list_is_empty(champs)) { champion_t *champ = list_entry(champs->next, champion_t, node); del_champ(champ); free(champ); } } static void sort_champs(list_t *champs, int (*cmp)(const void *, const void *)) { list_t *node; int nr_champs = 0; list_for_each(node, champs) nr_champs++; long *array = (long *)malloc(sizeof(array[0]) * nr_champs); nr_champs = 0; list_for_each(node, champs) { champion_t *champ = list_entry(node, champion_t, node); array[nr_champs++] = (long)champ; } qsort(array, nr_champs, sizeof(array[0]), cmp); while(nr_champs-- > 0) { champion_t *champ = (champion_t *)array[nr_champs]; list_del(&champ->node); list_add(&champ->node, champs); } free(array); } static int compare_hp(const void *_a, const void *_b) { const champion_t * const a = *(const champion_t * const * const)_a; const champion_t * const b = *(const champion_t * const * const)_b; return a->hp - b->hp; } static int compare_name(const void *_a, const void *_b) { const champion_t * const a = *(const champion_t * const * const)_a; const champion_t * const b = *(const champion_t * const * const)_b; return strcmp(a->name, b->name); } int main(void) { list_t champions; list_init(&champions); add_champ(new_champ("abc", 10), &champions); add_champ(new_champ("ghi", 5), &champions); add_champ(new_champ("def", 20), &champions); print_champs("--list--", &champions); sort_champs(&champions, compare_hp); print_champs("--by hp--", &champions); sort_champs(&champions, compare_name); print_champs("--by name--", &champions); destroy_champs(&champions); return 0; }