Capítulo 4
Listas Encadeadas

 Listas Encadeadas Simples



4.1 Listas Encadeadas

4.1.1 Modelagem de Dados
4.1.2 Listas Encadeadas: Modelagem de Dados Genérica
4.1.3 Modelagem Funcional


4.0 Listas com Vetores: Desvantagens

4.1 Listas Encadeadas

4.1.1 Modelagem de Dados

Cabeça de Lista

tipo Lista {
    Elemento *dados;
    inteiro tamanho;
};

Elemento de Lista

  • Necessitamos:
  • 4.1.2 Listas Encadeadas: Modelagem de Dados Genérica

    Modelagem: Elemento de Lista II

    tipo Elemento {
        Elemento *próximo;
        TipoInfo *info;
    };

    tipo TipoInfo {
        tipo-do-campo1 campo1;
        tipo-do-campo2 campo2;
        ?
        tipo-do-campoN campoN;
    }

    4.1.3 Modelagem Funcional


    Algoritmo CriaLista

    Lista* FUNÇÃO criaLista() "Retorna ponteiro para uma nova cabeça de lista ou NULO"
    variáveis Lista *aLista; início aLista <- aloque(Lista);
    SE (aLista ~= NULO) ENTÃO "So posso inicializar se consegui alocar"
    aLista->tamanho <- 0;
    aLista->dados <- nulo;
    FIM SE
    RETORNE(aLista);
    fim;
     

    Algoritmo ListaVazia

    Booleano FUNÇÃO listaVazia(Lista *aLista) início SE (aLista->tamanho = 0) ENTÃO RETORNE(Verdade) SENÃO RETORNE(Falso); fim;

    Algoritmo AdicionaNoInício

    Inteiro FUNÇÃO adicionaNoInício(  Lista *aLista,                             TipoInfo *dado )
    variáveis Elemento *novo; "Var. auxiliar para o novo elemento" início novo <- aloque(Elemento);
    SE (novo = NULO) ENTÃO RETORNE( ErroListaCheia ); SENÃO novo->proximo <- aLista->dados;
    novo->info <- dado;
    aLista->dados <- novo;
    aLista->tamanho <- aLista->tamanho + 1;
    RETORNE(1);
    FIM SE
    fim;
     


    Algoritmo RetiraDoInício

    TipoInfo* FUNÇÃO retiraDoInício( Lista *aLista )

    "Elimina o 1. Elemento de uma lista.
     Retorna a informação do elemento eliminado ou NULO."
    variáveis Elemento *saiu; "Var. auxiliar para o 1. elemento"
    TipoInfo *volta; "Var. auxiliar para o dado retornado"
    início SE (listaVazia(aLista)) ENTÃO RETORNE( NULO ); SENÃO saiu <- aLista->dados;
    volta <- saiu->info;
    aLista->dados <- saiu->proximo;
    aLista->tamanho <- aLista->tamanho - 1;
    LIBERE(saiu);
    RETORNE(volta);
    FIM SE
    fim;


    Algoritmo EliminaDoInício

    inteiro FUNÇÃO eliminaDoInício( Lista *aLista ) "Elimina o 1. Elemento de uma lista e sua respectiva informação.
     Retorna a posição do elemento eliminado ou erro."
    variáveis Elemento *saiu; "Var. auxiliar para o 1. elemento" início SE (listaVazia(aLista)) ENTÃO RETORNE( ErroListaVazia ); SENÃO saiu <- aLista->dados;
    aLista->dados <- saiu->proximo;
    aLista->tamanho <- aLista->tamanho - 1;
    LIBERE(saiu->info);
    LIBERE(saiu);
    RETORNE(1);
    FIM SE
    fim;


    Exemplo simplificado: Programa Principal

     

     
     
     
     
     
     

    #inclua listaEnc.h

    variáveis
        Lista *devedores, *credores, *listaEscolhida;
        TipoInfo *dado;
        caracter opção;

    1 Programa Principal
    2     início
    3         devedores <- criaLista();
    4         credores <- criaLista();
    5         opção <- ´´;
    6         ENQUANTO (opção ~= ´f´) ENTÃO
    7             escreveMenu();
    8             leia(opção);
    9             CASO opção SEJA
    10             ´c´: listaEscolhida <- credores;
    11             ´d´: listaEscolhida <- devedores;
    12             ´i´: dado <- leiaInfo(); "P/tipoInfo leitura espec."
    13                  adicionaNoInício(listaEscolhida,dado);
    --             - - - -
    --             - - - -
    --             FIM CASO
    --         FIM ENQUANTO
    --    fim;
     
     
    • Memória logo após 

    • o início do programa, 
      quando o fluxo de execução 
      do programa se encontra na 
      linha #2.
    • Memória logo após as 

    • 2 chamadas às funções 
      criaLista(), quando o 
      fluxo de execução do 
      programa se encontra 
      na linha #5.
    • Memória imediatamente 

    • antes de retornar de uma 
      chamada à função 
      adicionaNoInício(), 
      quando a listaEscolhida 
      é a dos credores e o 
      fluxo de execução do 
      programa se encontra 
      na última linha da função 
      adicionaNoInício e retornará 
      ao programa principal para a 
      linha #13.

     


    Algoritmo AdicionaNaPosição

     


    Algoritmo RetiraDaPosição

     


    Modelagem do Tipo Info


    Algoritmo AdicionaEmOrdem

    Inteiro FUNÇÃO adicionaEmOrdem(Lista *aLista, TipoInfo dado)
    variáveis
        Elemento *atual; "Variável auxiliar para caminhar"
        inteiro posição;
    início
    SE (listaVazia(aLista)) ENTÃO
        RETORNE(adicionaNoInício(aLista, dado));
    SENÃO
        atual <- aLista->dados;
        posição <- 1;
        ENQUANTO (atual->proximo ~= NULO E maior(dado, atual->info)) FAÇA
            "Encontrar posição para inserir"
            atual <- atual->proximo;
            posição <- posição + 1;
        FIM ENQUANTO
        SE maior(dado, atual->info) ENTÃO "Parou porque acabou lista"
            RETORNE(adicionaNaPosição(aLista, dado, posição + 1));
        SENÃO
            RETORNE(adicionaNaPosição(aLista, dado, posição));
        FIM SE
    FIM SE
    fim;


    Algoritmo DestroiLista

    FUNÇÃO destroiLista(Lista *aLista) variáveis Elemento *atual, *anterior; "Variável auxiliar para caminhar" início
    SE (listaVazia(aLista)) ENTÃO LIBERE(aLista); SENÃO atual <- aLista->dados;
    ENQUANTO (atual ~= NULO) FAÇA "Eliminar até o fim"
    anterior <- atual;
    "Vou para o próximo mesmo que seja nulo."
    atual <- atual->proximo;
    "Liberar primeiro a Info"
    LIBERE(anterior->info);
    "Liberar o elemento que acabei de visitar."
    LIBERE(anterior);
    FIM ENQUANTO
    LIBERE(aLista);
    FIM SE
    fim;


    Algoritmos Restantes