/* dlist.c データ構造(双方向リスト):整列入力(ダミーノード2つ) */
/*問題
・双方向リスト（重連結リスト）
これまでのリストでは、自ノードの次のノードのデータには簡単にリストをたどることができるが、
自ノードの前のノードをたどることは容易ではない。そこで、次ノードへの
ポインタの他に前ノードへのポインタをもノード内に設定することによって
これを用意にするリスト構造がある。ポインタが2つの方向性を持つことから、双方向リストと呼ばれる。
以下にダミーノードを2つ持つ双方向リストのプログラムを紹介する。

void display(void)の部分を埋めて動作を可能にせよ。
*/
#include<stdio.h>
#include<stdlib.h>
#define Nmax -10000.0
#define Pmax +10000.0

struct dlist{
    float element;
	struct dlist *pred;
	struct dlist *next;
};

struct dlist *head;
sturct dlist *tail;
struct dlist *newdlist(void)
{
	return(struct dlist *)malloc(sizeof(struct dlist));
}

void insert(float val)
{
	struct dlist *p,*r;
	for(p=head->next;p->element<val;p=p->next);
	r=newldlist();
	r->element=val; r->next=p;
	(p->pred)->next=r; r->pred=p->pred; p->pred=r;
}

void delete(float val)
{
	struct dlist *p;
	for(p=head->next;p->element<val;p=p->next);
	if(p->element==val){
		(p->pred)->next=p->next;
		(p->next)->pred=p->pred;
		free(p);
	}
}

void initialize(void)
{
	head=newlist();	/*dummy node 1 */
	tail=newlist(); /*dummy node 2 */
	head->element=Nmax; head->pred=NULL; head->next=tail;
	tail->element=Pmax; tail->pred=head; tail->next=NULL;
}

void display(void){ここを埋めよ}

void main(void){
	int mode;
	float val;
	initialize();
	mode=1;
	while(mode){
		printf("list process ?insert(1) or delete(0) = ");
		scanf("%d",&mode);
		if(mode==1){
			printf("?data ="); scanf("%f",&val); insert(val);
		}else if(mode==0){
			printf("?data ="); scanf("%f",&val); delete(val);
		}
		display();
		printf("contiunue(1) or quit(0) = "); scanf("%d",&mode);
	}
}