単連結リストの整列 #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からの尻尾を付けておく。