このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/617
#  [1] 授業単元:アルゴリズムとデータ構造  
#  [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0  
#  このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。  
#  /*------------------------------------------------
#  	連結リストの実装例(リストヘッドによる方法)
#   ------------------------------------------------*/
#  #include 
#  #include 
#  
#  //DATA型を定義(正体は int 型)
#  typedef int DATA;
#  
#  //NODE型の構造体定義
#  typedef struct node {
#  	struct node	*next;	// 次のノードへのポインタ
#  	DATA		data;	// データ部
#  } NODE;
#  
#  //リストの先頭ポインタを保持する変数の宣言
#  NODE	list_head;
#  
#  //関数のプロトタイプ宣言
#  void addNewNodeToHead( DATA* );	// 先頭ノードを追加
#  void deleteFirstNode();			// 先頭ノードを削除
#  void showList();				//リストの表示
#  
#  /*---------------------------------------
#  	メイン関数
#  ---------------------------------------*/
#  int main()
#  {
#  	int		key; 
#  	DATA	value = 1;	//格納する値を生成するための変数
#  	
#  	// リストヘッドの初期化
#  	list_head.next = NULL;
#  	
#  	//終了の 9 が入力されるまで繰り返す
#  	while( key != 9 ) {
#  		
#  		//リストの表示
#  		showList();
#  		
#  		//メニューを表示
#  		printf("1.先頭に追加,2.先頭を削除,9.終了:");
#  		
#  		//メニュー番号の入力と分岐
#  		scanf("%d",&key);		
#  		switch( key ) {
#  			
#  			case 1: //リストの先頭にデータを追加
#  
#  				//追加するDATA(いまは整数値)を引数に追加関数をよぶ
#  				addNewNodeToHead( &value );	//注意:ノードを追加後,ついでに value をインクリメントしている
#  				break;
#  				
#  			case 2: //先頭のデータを削除
#  
#  				//先頭の要素を削除する関数をよぶ
#  				deleteFirstNode();
#  				break;
#  		}		
#  	}
#  	
#  	return 0;
#  }
#  
#  //リストの先頭にノードを追加する
#  void addNewNodeToHead( DATA *d )
#  {
#  	NODE *newNode, *pos;
#  	
#  	
#  }
#  
#  // リストの先頭ノードを削除する
#  void deleteFirstNode()
#  {
#  	NODE *pos, *prevNode;
#  	
#  
#  }
#  
#  //連結リストの状態を表示する
#  void showList()
#  {
#  	NODE *pos;	//読み出し位置にあるノードへのポインタ変数
#  	
#  	//最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている)
#  	pos = list_head.next;
#  
#  	//末尾のノードまで繰り返す
#  	while ( pos != NULL ) {
#  		printf("%d ", pos->data);	//データ参照して表示
#  		pos = pos->next;			//次のノードに進む
#  	}
#  	
#  	printf("\n\n");
#  }
#  実行結果  
#  1.n番目を追加、2.n番目を削除、9.終了:1  
#  何番目を追加しますか:1 
#  1: 1 
#  1.n番目を追加、2.n番目を削除、9.終了:1  
#  何番目を追加しますか:2 
#  2: 1 2 
#  1.n番目を追加、2.n番目を削除、9.終了:1 
#  何番目を追加しますか:2 
#  3: 1 3 2 
#  1.n番目を追加、2.n番目を削除、9.終了:2 
#  何番目を削除しますか:2 
#  2: 1 3 
#  1.n番目を追加、2.n番目を削除、9.終了:2 
#  何番目を削除しますか:3 
#  3番目の要素はありません。 
#  2: 1 3 
#  1.n番目を追加、2.n番目を削除、9.終了:2  
#  何番目を削除しますか:2 
#  1: 1 
#  1.n番目を追加、2.n番目を削除、9.終了:9 
#  [3.3] 言語: C言語 [4] 期限:5月25日 [5] その他の制限: よろしくお願いします。 
# 

結び目(0,0,_).

'終了の 9 が入力されるまで繰り返す'(_初期ならび,_実行終了時ならび) :-
        write('1.n番目を追加、2.n番目を削除、9.終了:1 \n'),
        get_integer(_メニュー番号),
        実行の選択(_メニュー番号,_初期ならび,_実行終了時ならび).

実行の選択(9,_ならび,_ならび) :- !.
実行の選択(1,_実行前ならび,_実行終了時ならび) :-
        '1.n番目を追加'(_実行前ならび,_追加後のならび),
        '終了の 9 が入力されるまで繰り返す'(_追加後のならび,_実行終了時ならび).
実行の選択(2,_実行前ならび,_実行終了時ならび) :-
        '2.n番目を削除'(_実行前ならび,_削除後のならび),
        '終了の 9 が入力されるまで繰り返す'(_削除後のならび,_実行終了時ならび).

'1.n番目を追加'(_実行前ならび,_追加後のならび) :-
        write('追加する要素番号を入力してください : '),
        get_integer(_n),
        write('追加する要素値を入力してください : '),
        get_line(_要素),
        要素をn番目に挿入(_要素,_n).

'2.n番目を削除'(_実行前ならび,_削除後のならび) :-
        write('追加する要素番号を入力してください : '),
        get_integer(_n),
        n番目の要素を取り除く(_n,_削除後のならび).


先頭に結び目を加える(_要素) :-
        新しい結び目を得る(_新しい結び目),
        retract(結び目(0,_次の結び目,_)),
        asserta(結び目(_新しい結び目,_次の結び目,_要素)),
        assertz(結び目(0,_新しい結び目,_)).

末尾に結び目を加える(_要素) :-
        新しい結びを得る(_新しい結び目),
        retract(結び目(_末尾の結び目,0,_末尾の要素)),
        asserta(結び目(_末尾の結び目,_新しい結び目,_末尾の要素)),
        asserta(結び目(_新しい結び目,0,_要素)).

先頭の結び目を取り除く :-
        retract(結び目(0,_先頭の結び目,_)),
        retract(結び目(_先頭の結び目,_次の結び目,_要素)),
        asserta(結び目(0,_次の結び目,_)).

末尾の結び目を取り除く(_ならび,_末尾の要素,_末尾の要素を除いたならび) :-
        retract(結び目(_末尾の結び目,0,_末尾の要素)),
        retract(結び目(_末尾の一つ前の結び目,_末尾の結び目,_末尾の一つ前の要素)),
        asserta(結び目(_末尾の一つ前の結び目,0,_末尾の一つ前の要素)).

n番目の要素を表示(_n,_n番目の要素) :-
        結び目(0,_最初の結び目,_),
        n番目の要素を得る(1,_n,_最初の結び目,_n番目の要素).

n番目の要素を得る(_n,_n,_n番目の結び目,_n番目の要素) :-
        結び目(_n番目の結び目,_,_n番目の要素),!.
n番目の要素を得る(_n_1,_n,_n_1番目の結び目,_n番目の要素) :-
        _n_1 < _n,
        結び目(_n_1番目の結び目,_n_2番目の結び目,_n番目の要素),
        _n_2 is _n_1 + 1,
        n番目の要素を得る(_n_2,_n,_n_2番目の結び目,_n番目の要素).

n番目の要素を取り除く(_n,_n番目の要素) :-
        結び目(0,_最初の結び目,_),
        n番目の結び目を取り除く(1,_n,_最初の結び目).        

n番目の結び目を取り除く(_n,_n,_n番目の結び目) :-
        retract(結び目(_n番目の結び目,_n_2番目の結び目,_n番目の要素)),
        retract(結び目(_n_1番目の結び,_n番目の結び目,_n_1番目の要素)),
        asserta(結び目(_n_1番目の結び,_n_2番目の結び目,_n_1番目の要素)),!.
n番目の結び目を取り除く(_n_1,_n,_n_1番目の結び目) :-
        _n_1 < _n,
        結び目(_n_1番目の結び目,_n_2番目の結び目,_),
        _n_2 is _n_1 + 1,
        n番目の結び目を取り除く(_n_2,_n,_n_2番目の結び目,_n番目の要素).

n番目の結び目を挿入(_n,_n番目の要素) :-
        結び目(0,_最初の結び目,_),
        n番目の結び目を挿入(1,_n,_最初の結び目,_n番目の要素).

n番目の結び目を挿入(_n,_n,_現在のn番目の結び目,_n番目の要素) :-
        retract(結び目(_n_1番目の結び目,_現在のn番目の結び目,_n_1番目の要素)),
        新しい結び目(_新しい結び目),
        asserta(結び目(_新しい結び目,_現在のn番目の結び目,_新しい要素)),
        asserta(結び目(_n_1番目の結び目,_新しい結び目,_n_1番目の要素)),!.
n番目の結び目を挿入(_n_1,_n,_n_1番目の結び目,_n番目の要素) :-
        _n_1 < _n,
        結び目(_n_1番目の結び目,_n_2番目の結び目,_),
        _n_2 is _n_1 + 1,
        n番目の結び目を挿入(_n_2,_n,_n_2番目の結び目,_n番目の要素).

新しい結び目(_新しい結び目) :-
        _新しい結び目 is (random(40000)+1) * (random(40000)+1),
        \+(結び目(_新しい結び目,_,_)),!.
新しい結び目(_新しい結び目) :-
        新しい結び目(_新しい結び目).