/* ******************************
   "list.cpp"
   Listクラス−実現部
   生成元の積で表現されたブレイド
   ****************************** */

#include <stdio.h>
#include "list.h"

// 最初と最後のダミーセルを作成
List::List(void){
  init=new Cell;
  last=new Cell;
  init->pre=NULL; init->next=last;
  init->element=0;
  last->pre=init; last->next=NULL;
  last->element=0;
  num=0;
}

// 最初と最後のダミーセルを作成,numを設定
List::List(int n){
  init=new Cell;
  last=new Cell;
  init->pre=NULL; init->next=last;
  init->element=0;
  last->pre=init; last->next=NULL;
  last->element=0;
  num=n;
}

// リストの参照:initの指すセルを設定,initに繋がるセルの最後をlastが指す
void List::Ref_init(Cell* p){
  init=p;
  do{ p=p->next; }while(p->element!=0);
  last=p;
}

// リストの参照:lastの指すセルを設定,lastに繋がるセルの最後をinitが指す
void List::Ref_last(Cell* p){
  last=p;
  do{ p=p->pre; }while(p->element!=0);
  init=p;
}

// pの指すセルの次に要素xのセルを挿入
void List::Insert(Cell* p,int x){
  Cell* q=p->next;
  Cell* r=new Cell;
  r->element=x;
  p->next=r; r->pre=p;
  r->next=q; q->pre=r;
}

// pの指すセルの次にリストLを挿入
void List::Insert(Cell* p,List& L){
  Cell* q=L.Next(L.Init());
  while(q!=L.Last()){
    Insert(p,q->element);
    p=p->next; q=q->next;
  }
}

// pの指すセルを削除
void List::Delete(Cell* p){
  Cell* q=p->pre;
  Cell* r=p->next;
  q->next=r; r->pre=q;
  delete p;
}

// pの指すセルからqの指すセルまでを削除
void List::Delete(Cell* p,Cell* q){
  Cell* r=p->pre;
  Cell* s=q->next;
  r->next=s; s->pre=r;
  while(p->next!=q){ Delete(p->next); }
  delete p; delete q;
}

// リストの全要素を削除
void List::Clear(void){
  while(init->next!=last){ Delete(init->next); }
}

// セルの要素を交換
void List::Swap(Cell* p,Cell* q){
  int tmp=p->element;
  p->element=q->element;
  q->element=tmp;
}

// リストが空であるかどうかの判定
bool List::Empty(void){
  if(init->next==last) return true;
}