単連結リストの整列 #104 成績リストの生成と廃棄

リストの生成と廃棄を行う関数を書く。
ここでは循環リストで実装してみる。

school_record_list.h
#ifndef SCHOOL_RECORD_LIST_H_INCLUDED
#define SCHOOL_RECORD_LIST_H_INCLUDED

#include "school_record.h"

typedef struct tag_school_record_list school_record_list_t;

school_record_list_t *school_record_list_new(void);
void school_record_list_dispose(school_record_list_t *list);

#endif /* SCHOOL_RECORD_LIST_H_INCLUDED */
school_record_list.c
#include <stdlib.h>
#include "school_record_list.h"

typedef struct tag_school_record_node school_record_node_t;

struct tag_school_record_node {
    school_record_t *rec;
    school_record_node_t *next;
    school_record_node_t *prev;
};

struct tag_school_record_list {
    school_record_node_t *dummy;
};

school_record_list_t *school_record_list_new(void)
{
    school_record_list_t *list = malloc(sizeof(school_record_list_t));
    if (list == NULL || (list->dummy = malloc(sizeof(school_record_node_t))) == NULL) {
        free(list);
        return NULL;
    }
    list->dummy->rec = NULL;
    list->dummy->prev = list->dummy->next = list->dummy;
    return list;
}

void school_record_list_dispose(school_record_list_t *list)
{
    school_record_node_t *p;
    if (list == NULL) return;
    p = list->dummy->next;
    while (p != list->dummy) {
        school_record_node_t *q = p->next;
        school_record_dispose(p->rec);
        free(p);
        p = q;
    }
    free(p);
    free(list);
}

循環リストにはダミーノードを組み入れて、これにschool_record_list_tからの尻尾を付けておく。