#include <malloc.h>
#include <conio.h>
#include <stdio.h>
#include <process.h>  
#include <stdlib.h>
typedef struct nodetype{
	 char data;
	 struct nodetype *lp;
	 struct nodetype *rp;
	 }node;
node *hnode,*nnode,*wnode;
/*****   Prototype section *******/
node *newnode(void);
void delnode(node *p);
node *firstnode(node *head,char data);
void insertnode(node *start,char data);
void deletenode(node *before);
void clearnode(void);

/******   Module section ********/

void main(void)
{
  int select;
  node *a;
  FILE *text;
  char *ch;
  char filename[50];
  int  i=-1;

  ch=(char*)malloc(sizeof(char));
    printf("Input file : ");
    scanf("%s",filename);
    if((text=fopen(filename,"rt"))==NULL)
      {
	printf("file is null");
	exit(1);
      }
	fgets(ch,100,text);
  hnode = NULL;
  wnode = hnode;
  do{
    i++;
    a = hnode;
     
    while(a!=NULL)
      {
	if(a==wnode)
	  printf("->");
	else
	  printf("  ");
	printf("%p|%c|lp->%p|rp->%p|\n",
		  a,a->data,a->lp,a->rp);
	printf("          |______|____________|____________|\n");
	a = a->rp;
      }

    printf("------------------------------------\n");
    printf("Please select menu\n\n");
    printf("1.insert node\n");
    printf("2.delete next node\n");
    printf("3.shift pointer up\n");
    printf("4.shift pointer down\n");
    printf("5.exit\n");
    select = getch();


    switch(select)
      {
        case '1':
                 if(hnode==NULL)
                 {
                   hnode = firstnode(hnode,ch[i]);
                   wnode = hnode;
                 }
                 else
                 insertnode(wnode,ch[i]);
                 break;
        case '2':if(hnode==NULL) break; // no node left
			     if((wnode==hnode)&&(hnode->lp==hnode->rp))
				 {
					 delnode(hnode);
					 wnode=hnode=NULL;
					 break;
				 }
                 deletenode(wnode);
                 break;
    	case '3':if(hnode==NULL)
				 {
					 printf("Opp ! not call me \n");
			         break;
				 }
  				 if(wnode->lp != NULL)
                    wnode = wnode->lp;break;
        case '4':if(hnode==NULL)
				 {
					 printf("Oh  my god \n");
					 break;
				 }
			     if(wnode->rp != NULL)
                    wnode = wnode->rp;break;
        case '5':if(hnode!=NULL) 
					clearnode();    exit(1);
      }
  }while(1);
}
/************************/

node *newnode(void)
{
  return (node *)malloc(sizeof(node));
}

void delnode(node *p)
{
  free((void *)p);
}

node *firstnode(node *head,char data)
{
  head       = newnode();
  head->data = data;
  head->lp   = NULL;
  head->rp   = NULL;
  return head;
}
void insertnode(node *start,char data)
{
  node *newn;

  newn         = newnode();
  newn->data   = data;

  if (start->rp == NULL)
    {
      /* append mode */
       newn->rp = NULL;
    }
  else
    {
      /* Insert mode */
       newn->rp = start->rp;
       newn->rp->lp = newn;
    }

  newn->lp     = start;
  start->rp    = newn;

}

void deletenode(node *before)
{
  node *after;

  if(before->rp == NULL) return;

  if(before->rp->rp != NULL)
  {
      after      = before->rp->rp;
      delnode(before->rp);
      before->rp = after;
      after->lp  = before;
  }
  else 
  {
	  delnode(before->rp);
	  before->rp = NULL;
  }
}
void clearnode(void)
{
  wnode = hnode;
  nnode = wnode->rp;
  while(wnode!=NULL)
    {
      delnode(wnode);
      wnode = nnode;
	  if(nnode==NULL)break;
      nnode = nnode->rp;
    }
}
