/* Rotinas básicas para manipulação de listas com cabeças de lista e cauda. */

typedef struct no_struct {
  int chave;
  struct nodo *prox;
} No;

No *z; /* esta é a cauda de todas as listas */ 

/* inicialize_cauda: esta rotina deve ser chamada antes de começarmos
   a manipular as nossas listas */

void inicialize_cauda()
{
  z=(No *)malloc(sizeof(No));
  z->prox=z;
}

/*  inicialize_lista: precisamos gerar um No novo para ser a cabeça desta 
    lista.  Devolvemos um ponteiro para esta cabeça. */

No *inicialize_lista()
{
  No *cabeca;
  cabeca=(No *)malloc(sizeof(No));
  cabeca->prox=z;
  return cabeca;
}

/* remova_prox: para remover o nó seguinte ao apontado por t. */
/*  Importante: não fazemos free dentro desta rotina; isto deve ser feito
    fora. */ 

void remova_prox(No *t)
{
  t->prox=t->prox->prox;
}
  
/* insira_prox: inserimos após o elemento apontado por t.  Devido a existência
   da cabeça de lista, funciona bem mesmo quando queremos inserir no começo da
   lista.  Devolve um ponteiro para o elemento inserido. */

No *insira_prox(int v, No *t)
{
  No *x;
  x=(No *)malloc(sizeof(No));
  x->chave=v;
  x->prox=t->prox;
  t->prox=x;
  return x;
}

