/* Definition of Linked List*/
struct Node
{
  item data;
  struct Node* next;
};

/* Insert Operation */
void list_insert(struct Node** head, struct Node* prev, item data)
{
  struct Node* new = (struct Node*) malloc (sizeof(struct Node));
  new -> data = data;
   
  if(prev == NULL) /* INSERTING A HEAD NODE */
    {
      new -> next = *head;
      *head = new;
    }
  else             /* INSERTING A NON-HEAD NODE */
    {
      new -> next = prev -> next;
      prev -> next = new;
    }

  return;
}

/* Remove Operation */
void list_remove(struct Node** head, struct Node* prev)
{
  if(*head == NULL || ( prev != NULL && prev->next == NULL) )
    return; 

  struct Node* victim;

  if( prev == NULL)      /* REMOVING A HEAD NODE */
    {
      victim = *head;
      *head = victim -> next;
    }
  else /* IN CASE PREV IS A TAIL NODE */
    {
      victim = prev -> next;
      prev -> next = victim -> next;
    }  
  free(victim);
 

  return;
}