/* ******************************
   "list.h"
   Listクラス−インタフェイス部
   生成元の積で表現されたブレイド
   ****************************** */

#if !defined(___Class_List)
#define ___Class_List 

class Cell{

  friend class List;
  friend class Canonical;

  int element; // 要素
  Cell* pre;   // 前のセルへのポインタ
  Cell* next;  // 次のセルへのポインタ
};

// 双方向連結リスト
class List{

  int num;    // 紐の本数
  Cell* init; // 最初のセルへのポインタ
  Cell* last; // 最後のセルへのポインタ

public:

  List(void); // 最初と最後のダミーセルを作成
  List(int);  // 最初と最後のダミーセルを作成,numを設定

  int Num(void){ return num; }               // 紐の本数を返す
  int Element(Cell* p){ return p->element; } // pの指すセルの要素を返す
  Cell* Init(void){ return init; }           // 最初のセルへのポインタを返す
  Cell* Last(void){ return last; }           // 最後のセルへのポインタを返す
  Cell* Pre(Cell* p){ return p->pre; }       // 前のセルへのポインタを返す
  Cell* Next(Cell* p){ return p->next; }     // 次のセルへのポインタを返す

  void Set_num(int n){ num=n; }                    // numを設定
  void Set_element(Cell* p,int x){ p->element=x; } // pの指すセルの要素を設定

  void Ref_init(Cell*); // リストの参照:initの指すセルを設定
  void Ref_last(Cell*); // リストの参照:lastの指すセルを設定

  void Insert(Cell*,int);       // セルを挿入
  void Insert(Cell*,List&);     // 複数のセルを挿入
  void Delete(Cell*);           // セルを削除
  void Delete(Cell* p,Cell* q); // 複数のセルを削除
  void Clear(void);             // リストの全要素を削除
  void Swap(Cell*,Cell*);       // セルの要素を交換
  bool Empty(void);             // リストが空であるかどうかの判定
};

#endif