#ifndef DOUBLY_LINKED_LIST_2CH_1307166756_378
#define DOUBLY_LINKED_LIST_2CH_1307166756_378
#define LIST_ERROR_NO_ERROR 1
#define LIST_ERROR_OUT_OF_MEMORY 0
#define LIST_ERROR_OUT_OF_RANGE (-1)
typedef struct list_element list_element;
typedef struct doubly_linked_list doubly_linked_list;
// リストの要素(データはint型で固定)
struct list_element
{
int data; // データ
list_element *prev; // 前の要素へのポインタ
list_element *next; // 次の要素へのポインタ
};
// リスト構造体
struct doubly_linked_list
{
int size; // 要素数
list_element *head; // 先頭のダミー要素
list_element *tail; // 末尾のダミー要素
};
// リストを作成する
// 戻り値 != NULL : 成功
// 戻り値 == NULL : 失敗(メモリ確保に失敗)
doubly_linked_list *list_create();
// リストを破棄する
void list_destroy(doubly_linked_list *L);
// リストの末尾に指定した値を追加する
// 戻り値 == LIST_ERROR_NO_ERROR : 成功
// 戻り値 == LIST_ERROR_OUT_OF_MEMORY : 失敗(メモリ確保に失敗)
int list_push(doubly_linked_list *L, int value);
// リストの末尾から値を削除する
void list_pop(doubly_linked_list *L);
// リストの要素をすべて表示する
void list_print(const doubly_linked_list *L);
// リストから指定した値を削除する(最初に見つかった要素がひとつだけ削除される)
void list_remove(doubly_linked_list *L, int value);
// リストの指定した位置に値を挿入する
// 戻り値 == LIST_ERROR_NO_ERROR : 成功
// 戻り値 == LIST_ERROR_OUT_OF_MEMORY : 失敗(メモリ確保に失敗)
// 戻り値 == LIST_ERROR_OUT_OF_RANGE : 失敗(挿入位置が不正)
int list_insert(doubly_linked_list *L, int position, int value);
#endif