このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/546
#  [1]  データ構造とアルゴリズム 
#  [2] (1)双方向リストについて、領域の確保、確保した領域をリストの先頭に追加、要素の削除を行うプログラムを作成しなさい。    
#      (2)配列により、キューを実現するプログラムを作成しなさい。  
#  [3.1]  Linux  
#  [3.2]  gcc  
#  [3.3]  C  
#  [4] 期限: 7月19日 
# 
# 

キュー先頭要素番号(キュー1,0).
キュー末尾要素番号(キュー1,0).

キューから取り出す(_キュー名,_値) :-
        キュー先頭要素番号(_キュー名,_先頭要素番号),
        \+(_先頭要素番号=0),
        retract(キュー(_キュー名,_先頭要素番号,_次の要素番号,_値)),
        retract(キュー先頭要素番号(_キュー名,_先頭要素番号)),
        assertz(キュー先頭要素番号(_キュー名,_次の要素番号)),!.
キューから取り出す(_キュー名,_値) :-
        キュー先頭要素番号(_キュー名,_先頭要素番号),
        _先頭要素番号=0,
        fail.

キューに追加する(_キュー名,_値) :-
        retract(キュー末尾要素番号(_キュー名,_末尾要素番号)),
        \+(_末尾要素番号=0),
        retract(キュー(_キュー名,_末尾要素番号,_,_値1)),
        新しいキュー要素番号を得る(_キュー名,_新しい要素番号),
        assertz(キュー(_キュー名,_末尾要素番号,_新しい要素番号,_値1)),
        assertz(キュー(_キュー名,_新しい要素番号,0,_値)),
        assertz(キュー末尾要素番号(_キュー名,_新しい要素番号)),!.
キューに追加する(_キュー名,_値) :-
        retract(キュー末尾要素番号(_キュー名,_末尾要素番号)),
        末尾要素番号=0,
        新しいキュー要素番号を得る(_キュー名,_新しい要素番号),
        assertz(キュー(_キュー名,_新しい要素番号,0,_値)),
        assertz(キュー先頭要素番号(_キュー名,_新しい要素番号)),
        assertz(キュー末尾要素番号(_キュー名,_新しい要素番号)),!.

キューから削除する(_キュー名,_要素番号) :-
        キュー先頭要素番号(_キュー名,_先頭要素番号),
        キューを辿り要素番号を削除する(_キュー名,_先頭要素番号,_要素番号).

キューを辿り要素番号を削除する(_キュー名,_要素番号1,_要素番号) :-
        キュー(_キュー名,_要素番号1,_要素番号,_値1),
        retract(キュー(_キュー名,_要素番号1,_要素番号,_値1)),
        retract(キュー(_キュー名,_要素番号,_要素番号2,_)),
        assertz(_キュー(_キュー名,要素番号1,要素番号2,_値1)),
        先頭要素番号・末尾要素番号の更新(_キュー名,_要素番号,_要素番号1,_要素番号2).

キューを辿り要素番号を削除する(_キュー名,_要素番号1,_要素番号) :-
        キュー(_キュー名,_要素番号1,_要素番号2,_),

        キューを辿り要素番号を削除する(_キュー名,_要素番号2,_要素番号).

先頭要素番号・末尾要素番号の更新(_キュー名,_要素番号,_要素番号1,0) :-
        retract(キュー末尾要素番号(_キュー名,_要素番号)),
        assertz(キュー末尾要素番号(_キュー名,_要素番号1)),!.
先頭要素番号・末尾要素番号の更新(_キュー名,_要素番号,0,_) :-
        retract(キュー先頭要素番号(_キュー名,_要素番号)),
        assertz(キュー先頭要素番号(_キュー名,0)),!.
先頭要素番号・末尾要素番号の更新(_キュー名,_,_,_).