このディレクトリの索引
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] その他の制限: よろしくお願いします。 
# 

'終了の 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,_ならび,_,_削除後のならび).

先頭に要素を加える(_要素,_ならび,[_要素|_ならび]).

末尾に要素を加える(_要素,_ならび,_末尾に要素を加えたならび) :-
        append(_ならび,[_要素],_末尾に要素を加えたならび).

先頭の要素を取り除く([_先頭の要素|_先頭の要素を除いたならび],_先頭の要素,_先頭の要素を除いたならび).

末尾の要素を取り除く(_ならび,_末尾の要素,_末尾の要素を除いたならび) :-
        append(_末尾の要素を除いたならび,[_末尾の要素],_ならび).

n番目の要素を表示(_n,_ならび,_n番目の要素) :-
        length([_|L0],_n),
        append(L0,[_n番目の要素|_],_ならび),


n番目の要素を取り除く(_n,_ならび,_n番目の要素,_n番目の要素を除いたならび) :-
        length([_|L0],_n),
        append(L0,[_n番目の要素|R],_ならび),
        append(L0,R,_n番目の要素を除いたならび).

要素をn番目に挿入(_要素,_n,_ならび,_要素をn番目に挿入されたならび) :-
        length([_|L1],_n),
        append(L1,L2,_ならび),
        append(L1,[_要素|L2],_要素をn番目に挿入されたならび).

n番目の要素の置換(_n,_置換要素,_ならび,_n番目の要素を置換されたならび) :-
        length([_|L0],_n),
        append(L0,[_|R],_ならび),
        append(L0,[_置換要素|R],_n番目の要素を置換されたならび).