// (Doubly-linked List)

#include  <stdio.h>
#include  <stdlib.h>

typedef struct CELL {
  struct CELL *prev;
  struct CELL *next;
  int value;
} cell;

cell head;


/*
   Nama: list_init
   Fungsi: inisialisasi list
*/

void  list_init()
{
  head.prev=head.next=&head;
}

/*

   Nama: fatal_error
   Fungsi: menampilkan error message, kemudian exit 
   Input: error message

*/

void	fatal_error(char *s)
{

	fprintf(stderr,s);
	exit(1);
}

/* 

   Nama: cell_insert
   Fungsi: menambahkan sel baru ke list
   Input : value dari sel yang akan ditambahkan 
   
*/

void cell_insert(int a)
{
  cell  *p, *new_cell;
  
    // Selesaikan bagian ini
}

/* 
   Nama: cell_delete
   Fungsi: menghapus sel dari list
   Input: value dari sel yang akan dihapus
*/


void  cell_delete(int a)
{
  cell *p;


  p=head.next;
  while (p!=&head && p->value != a)    p=p->next;
  if(p!=&head) {
    p->prev->next    = p->next;
    p->next->prev    = p->prev;
    free(p);
  }
  else printf("Sel yang ingin dihapus tidak dapat ditemukan\n");

}
/* 
   Nama: print_list
   Fungsi: menampilkan isi (address dan isi) list
   Input: tidak ada
*/


void print_list()
{
  cell *p;

  printf("\n");
  printf("\t\tAddressList head: %p\n",&head);  
  printf("\t\tIsi\t[previous cell\tcurrent cell\tnext cell]\n\t\t------------------------------------------------\n");
  for(p=head.next;p!=&head;p=p->next)    printf("\t\t%d\t[%p\t%p\t%p]\n",p->value,p->prev,p,p->next);
  printf("\n");
}

/* 
   Main
*/


main()
{

  int    mode,value;  

  list_init();
  printf("*****************************\n\t Doubly linked list\n*****************************\n");
  printf("Pilihlah operasi yang dilakukan:   1:menambahkan sel \t2:menghapus sel \t3:selesai\t");
  while(scanf("%d",&mode)){
    switch(mode){
    case 1:  printf("Operasi yang dipilihFmenambahkan sel\n");
             printf("Value dari sel yang akan ditambahkan: \t");
             scanf("%d",&value);
	     cell_insert(value);

             break;
    case 2:  printf("Operasi yang dipilihFmenghapus sel\n");
             printf("Value dari sel yang akan dihapus: \t");
             scanf("%d",&value);
	     cell_delete(value);
             break;
    case 3:  exit(0);
    default: break;
    }
    print_list();
    printf("Pilihlah operasi yang dilakukan:   1:menambahkan sel \t2:menghapus sel \t3:selesai\t");

  }
}

