このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/589
#  [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.先頭に追加、2.先頭を削除、9.終了:1 
#  1 
#  1.先頭に追加、2.先頭を削除、9.終了:1 
#  2 1 
#  1.先頭に追加、2.先頭を削除、9.終了:2 
#  1 
#  1.先頭に追加、2.先頭を削除、9.終了:2 
#   
#  1.先頭に追加、2.先頭を削除、9.終了:2 
#  削除するデータがありません 
#  1.先頭に追加、2.先頭を削除、9.終了:9 
#  


リストの先頭にデータを追加(_データ,_リスト,[_データ|_リスト]).

先頭のデータを削除([_データ|_リスト],_取り除かれたデータ,_リスト).
先頭のデータを削除([],_,[]) :-
        write('データがありません。\n').

リストヘッドの初期化(_,[]).

実行(_現在のリスト,_実行後のリスト) :-
        メニューを表示,
        メニュー番号の入力と分岐(_現在のリスト,_メニュー番号,_実行後のリスト_1),
        リストの表示(_実行後のリスト_1),
        実行の終了診断(_メニュー番号,_実行後のリスト_1,_実行後のリスト).

実行の終了診断(9,_実行後リスト_1,_実行後のリスト) :- !.
実行の終了診断(_,_実行後リスト_1,_実行後のリスト) :-
        実行(_実行後リスト_1,_実行後のリスト).

リストの表示(_リスト) :-
        length(_リスト,_リストの長さ),
        表示パターンの生成(_リストの長さ,_表示パターン),
        writef(_表示パターン,_リスト),
        write('\n').

表示パターンの生成(_リストの長さ,_表示パターン) :-
        length(L1,_リストの長さ),
        all(L1,'%t'),
        atomic_list_concat(L1,',',_表示パターン).

メニューを表示 :-
        write('1.先頭に追加,2.先頭を削除,9.終了:').

メニュー番号の入力と分岐(_現在のリスト,_メニュー番号,_実行後のリスト) :-
        メニュー番号の入力(_メニュー番号),
        分岐(_メニュー番号,_現在のリスト,_実行後のリスト).

メニュー番号の入力(_メニュー番号) :-
        get_integer(_メニュー番号).

分岐(1,_現在のリスト,_実行後のリスト) :-
        追加するデータを得る(_データ),
        リストの先頭にデータを追加(_データ,_現在のリスト,_実行後のリスト).
分岐(2,_現在のリスト,_実行後のリスト) :-
        先頭のデータを削除(_現在のリスト,_,_実行後のリスト).
分岐(9,_リスト,_リスト).