 #include<stido.h>
#include<stido.h>
 #include<stdlib.h>
#include<stdlib.h>
 #ifndef _Lish_h
#ifndef _Lish_h
 struct Node;
struct Node;
 typedef struct Node *PtrToNode;
typedef struct Node *PtrToNode;
 typedef PtrToNode List;
typedef PtrToNode List;
 typedef PtrToNode Position;
typedef PtrToNode Position; 
 void MakeEmpty(List l);
void MakeEmpty(List l);
 int IsEmpty(List l);
int IsEmpty(List l);
 int IsLast(Position p,List l);
int IsLast(Position p,List l);
 Position Find(ElementType x,List l);
Position Find(ElementType x,List l);
 void Delte(ElementType x,List l);
void Delte(ElementType x,List l);
 Position FindPrevious(ElementType x,List l);
Position FindPrevious(ElementType x,List l);
 void Insert(ElementType x,List l,Position p);
void Insert(ElementType x,List l,Position p);
 void DelList(List l);
void DelList(List l);
 Position Header(List l);
Position Header(List l);
 Position First(List l);
Position First(List l);
 Position Advance(Position p);
Position Advance(Position p);
 ElementType Retrieve(Position p);
ElementType Retrieve(Position p);
 #endif
#endif 

 struct Node
struct Node


 {
{
 ElementType Element;
  ElementType Element;
 Position Next;
  Position Next;
 };
       };
 
    
 void MakeEmpty(List l)
  void MakeEmpty(List l)

 
   {
{
 Position p=l->Next;
    Position p=l->Next;
 while(!IsLast(p,l))
    while(!IsLast(p,l))

 
          {
{
 tmp=p;
           tmp=p;
 p=p->Next;
           p=p->Next;
 free(tmp);
           free(tmp);
 }
         }
 l->Next=NULL;
         l->Next=NULL;
 free(p);
         free(p);
 }
  }
 
 
 int IsEmpty(List l)
  int IsEmpty(List l)

 
   {
{
 return l->Next==NULL;
     return l->Next==NULL;
 }
  }
 
 
 int IsLast(Position p,List l)
  int IsLast(Position p,List l) 

 
   {
{
 Position pt=l->Next;
     Position pt=l->Next;
 while(pt!=p&&pt->Next!=NULL)
     while(pt!=p&&pt->Next!=NULL)
 pt=pt->Next;
          pt=pt->Next;
 if(pt==p&&pt->Next==NULL)
     if(pt==p&&pt->Next==NULL)
 return 1;
       return 1;
 return 0;
     return 0;
 }
  }
 
 
 Position Find(Element x,List l)
  Position Find(Element x,List l)

 
   {
{
 Position p=l->Next;
     Position p=l->Next;
 while(p!=NULL&&p->Element!=x)
     while(p!=NULL&&p->Element!=x)  
 p=p->Next;
          p=p->Next;
 return p;
     return p;    
 }
  }
 
 
 void Delete(Element x,List l)
  void Delete(Element x,List l)

 
   {
{
 Position p=FindPrevious(x,l);
     Position p=FindPrevious(x,l);
 if(p!=NULL)
     if(p!=NULL)

 
      {
{
 Position tmp=p->Next;
        Position tmp=p->Next;
 p->Next=tmp->Next;
        p->Next=tmp->Next;
 free(tmp);
        free(tmp);
 }
     }  
 }
  }
 
 
 Position FindPrevious(Element x,List l)
  Position FindPrevious(Element x,List l)

 
   {
{
 Position p=l->Next;
    Position p=l->Next;
 while(p!=NULL&&p->Next->Element!=x)
    while(p!=NULL&&p->Next->Element!=x)
 p=p->Next;
        p=p->Next;
 return p;
    return p;
 }
  }
 
 
 void Insert(Element x,List l,Position p)
  void Insert(Element x,List l,Position p)

 
   {
{
 Position tmp=(Position)malloc(sizeof(List));
    Position tmp=(Position)malloc(sizeof(List));
 if(tmp==NULL)
    if(tmp==NULL)

 
        {printf("Out of space !"); exit(1);}
{printf("Out of space !"); exit(1);}
 tmp->Element=x;
    tmp->Element=x;
 tmp->Next=p->Next;
    tmp->Next=p->Next;
 p->Next=tmp;
    p->Next=tmp;
 }
  }
 
 
 void DeleteList(List l)
  void DeleteList(List l)

 
   {
{
 MakeEmpty(l);
    MakeEmpty(l);
 free(l);
    free(l);
 }
  }
