>>30

struct ListElement {
 struct ListElement *prev, *next;
 struct data *body;
};

struct ListElement head = {&head, &head, NULL};

void insert(struct ListElement *e)
{
 e->prev = head;
 e->next = head.next;
 head.next->prev = e;
 head.next = e;
}

void remove(struct ListElement *e)
{
 e->prev->next = e->next;
 e->next->prev = e->prev;
}

int empty(void)
{
 return head.next == &head;
}

void search(struct data *x)
{
 struct ListElement *l = head.next;

 while (l != &head)
  if (l->body == x)
   return l;

 return NULL;
}