Listas duplamente vinculadas

Uma lista encadeada ou lista ligada é uma estrutura de dados linear e dinâmica. Ela é composta por vários elementos que estão interligados através de ponteiros, ou seja, cada elemento da lista possui um ponteiro que aponta para o endereço de memória da próxima célula. Desse modo, os elementos da lista não precisam estar em posições contíguas da memória. Isso faz com que a estrutura se torne dinâmica, pois a qualquer momento, é possível incluir uma novo elemento na lista, bastando ajustar os ponteiros das células já existentes, de modo que a nova célula seja inserida na estrutura com êxito, na posição desejada pelo programador.

Você pode declarar listas usando a seguinte sintaxe:

A Bíblia é uma lista com uns versos.
Um verso é uma lista com uma string.

O compilador irá, internamente, converter as declarações acima, no código abaixo:

Um verso é um ponteiro para uma estrutura de versos.

Uma estrutura de versos é uma estrutura com
  Um verso denominado próximo verso,
  Um verso denominado verso anterior e 
  Uma string.
  
Uns versos são uma lista com
  Um verso denominado primeiro verso e
  Um verso denominado último verso.

Na Biblioteca padrão existem rotinas diversas para trabalhar com listas.

Exemplos:

ACRESCENTE uma lista para umas listas. 
ACRESCENTE umas listas para umas outras listas. 
INSIRA uma lista em umas listas APÓS uma outra lista. 
INSIRA umas listas em umas outras listas APÓS uma lista.
INSIRA uma lista em umas listas ANTES DE uma outra lista. 
INSIRA umas listas em umas outras listas ANTES DE uma lista. 
MOVA uma lista de umas listas para outras listas. 
MOVA umas listas para umas outras listas. 
ANTEPONHA uma lista para umas listas. 
ANTEPONHA umas listas para umas outras listas. 
REVERTA umas listas.
REMOVA uma lista desde umas listas. 

Exemplo de utilização:

Acrescente o verso para os versos.

Insira o verso após os outros versos.

Remova o verso desde os versos.

A Biblioteca padrão também aceita o comando

"Atribua aquantidade de elementosde uma lista para uma contagem."

As listas são alocadas dinamicamente então é necessário efetuar a alocação e desalocação de memória das listas manualmente, de forma explícita.

Exemplos de alocação:

Crie a Bíblia.

Aloque memória para a Bíblia.

Exemplos de desalocação:

Destrua a Bíblia.

Desaloque a Bíblia.

Perceba que ao destruir uma lista, todos os seus elementos são destruídos juntamente com ela.

Para evitar este comportamento, utilize a palavra-chave "(referência)" após o nome do elemento. Isto indicará ao compilador que o campo trata-se de um ponteiro apenas.

Exemplos:

Um campo de estrutura é uma estrutura com
  Um sinalizador de redirecionamento,
  Um campo (referência),
  Uma rotina de função (referência),
  Um sinalizador de empilhamento.

Uma unidade semântica é uma lista com
  Uma string,
  Um tipo (referência),
  Uma variável (referência),
  Um tipo atual (referência),
  Um subtexto atual.

Atualizado