Top Banner
INE5408 Estruturas de Dados Listas Encadeadas Simples
57

INE5408 Estruturas de Dados Listas Encadeadas Simples.

Apr 07, 2016

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: INE5408 Estruturas de Dados Listas Encadeadas Simples.

INE5408Estruturas de Dados

Listas EncadeadasSimples

Page 2: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Listas com Vetores: Desvantagens

4

554128924 5

55412892420

• Tamanho máximo fixo;• mesmo vazias ocupam um grande

espaço de memória:– mesmo que utilizemos um vetor de

ponteiros, se quisermos prever uma lista de 10.000 elementos, teremos 40.000 bytes desperdiçados;

• operações podem envolver muitos deslocamentos de dados:– inclusão em uma posição ou no

início;– exclusão em uma posição ou no

início.

Page 3: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Listas Encadeadas• São listas onde cada elemento

está armazenado em uma Classe chamada elemento de lista;

• cada elemento de lista referencia o próximo e só é alocado dinamicamente quando necessário;

• para referenciar o primeiro elemento utilizamos uma Classe cabeça de lista.

Page 4: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Listas Encadeadas

5

melãoinfo próximo

maçãinfo próximo

uvainfo próximo

nro dados Cabeçade Lista

Elemento de Lista

Page 5: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Modelagem: Cabeça de Lista• Necessitamos:

– um ponteiro para o primeiro elemento da lista;– um inteiro para indicar quantos elementos a lista

possui.

• Pseudo-código:classe tLista {

tElemento *dados;inteiro tamanho;

};

Page 6: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Modelagem: Elemento de Lista• Necessitamos:

– um ponteiro para o próximo elemento da lista;– um campo do tipo da informação que vamos

armazenar.

• Pseudo-código:class tElemento {

tElemento *próximo;tipo-que-eu-vou-usar-nesta-aplicação info;

};

Page 7: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Listas Encadeadas: Modelagem• Para tornar todos os algoritmos da lista mais genéricos, fazemos

o campo info ser um ponteiro para um elemento de informação.

3

info próximo info próximo info próximo

nro dados

Elemento de Informação(tipoInfo)

melãodocecaro

maçãazedacara

uvairkh

barata

Page 8: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Modelagem: Elemento de Lista• Pseudo-código da Classe elemento de

lista:

class tElemento {tElemento *próximo;TipoInfo *info;

};

• Local: lista.h

Ao invés de colocar a Informação no elemento de lista, usamos um ponteiro para ela.

Page 9: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Modelagem: Elemento de Dados• Pseudo-código da Classe TipoInfo:

class TipoInfo {tipo-do-campo1 campo1;tipo-do-campo2 campo2;…tipo-do-campoN campoN;

}

• Local: info.h

Page 10: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Modelagem: Elemento de Dados• Razões para a modelagem do TipoInfo:

– vamos na maioria dos algoritmos trabalhar com algum elemento de informação;

– se este elemento é somente um ponteiro para um TipoInfo, não importando o que este seja, teremos algoritmos totalmente genéricos:

• posso usar o mesmo código de lista para muitas aplicações diferentes simplesmente recompilando.

• somente modifico um único headerfile: info.h

• Desvantagens:– o algoritmo de destruição da lista

torna-se mais complexo.– TipoInfo necessita de um destrutor próprio

Page 11: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Modelagem: Aspecto Funcional3 Categorias de Operações:• colocar e retirar dados da lista;• testar se a lista está vazia e outros testes;• inicializá-la e garantir a ordem dos elementos.

5

melãodocecaro

maçãazedacara

uvairkh

barata

Page 12: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Modelagem: Operações da Lista• Operações - colocar e retirar dados da lista:

– Adiciona(dado)– AdicionaNoInício(dado)– AdicionaNaPosição(dado, posição)– AdicionaEmOrdem(dado)

– Retira()– RetiraDoInício()– RetiraDaPosição(posição)– RetiraEspecífico(dado)

Page 13: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Modelagem: Operações da Lista• Operações - testar a lista e outros testes:

– ListaVazia()– Posição(dado)– Contém(dado)

• Operações - inicializar ou limpar:– CriaLista()– DestróiLista()

Page 14: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo CriaListaLista* MÉTODO 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

//Só posso inicializar se consegui alocar.aLista->tamanho <- 0;aLista->dados <- NULO;

FIM SERETORNE(aLista);

fim;

Page 15: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo CriaListaLista* MÉTODO 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

//Só posso inicializar se consegui alocar.aLista->tamanho <- 0;aLista->dados <- NULO;

FIM SERETORNE(aLista);

fim;

Page 16: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo CriaListaLista* MÉTODO 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

//Só posso inicializar se consegui alocar.aLista->tamanho <- 0;aLista->dados <- NULO;

FIM SERETORNE(aLista);

fim;

Page 17: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo ListaVaziaBooleano MÉTODO listaVazia()início

SE (tamanho = 0) ENTÃORETORNE(Verdadeiro)

SENÃORETORNE(Falso);

fim;

• Um algoritmo ListaCheia não existe aqui;• verificar se houve espaço na memória para um novo

elemento será responsabilidade de cada operação de adição.

Page 18: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNoInício• Procedimento:

– testamos se é possível alocar um elemento;

– fazemos o próximo deste novo elemento ser o primeiro da lista;

– fazemos a cabeça de lista apontar para o novo elemento.

• Parâmetros:– O tipo info (dado) a ser inserido;

Page 19: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNoInício

2

maçãazedacara

uvairkh

barata

melãodocecaro

novo

Page 20: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNoInício

2

maçãazedacara

uvairkh

barata

melãodocecaro

3

Page 21: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNoInícioInteiro MÉTODO adicionaNoInício(TipoInfo *dado)

variáveis tElemento *novo; //Variável auxiliar.início

novo <- aloque(tElemento);SE (novo = NULO) ENTÃO RETORNE(ErroListaCheia);SENÃO novo->próximo <- dados; novo->info <- dado;

dados <- novo; tamanho <- tamanho + 1;

RETORNE(1); FIM SE

fim;

Page 22: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNoInícioInteiro MÉTODO adicionaNoInício(TipoInfo *dado)

variáveis tElemento *novo; //Variável auxiliar.início

novo <- aloque(tElemento);SE (novo = NULO) ENTÃO RETORNE(ErroListaCheia);SENÃO novo->próximo <- dados; novo->info <- dado;

dados <- novo; tamanho <- tamanho + 1;

RETORNE(1); FIM SE

fim;

Page 23: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNoInícioInteiro MÉTODO adicionaNoInício(TipoInfo *dado)

variáveis tElemento *novo; //Variável auxiliar.início

novo <- aloque(tElemento);SE (novo = NULO) ENTÃO RETORNE(ErroListaCheia);SENÃO novo->próximo <- dados; novo->info <- dado;

dados <- novo; tamanho <- tamanho + 1;

RETORNE(1); FIM SE

fim;

Page 24: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDoInício

• Procedimento:– testamos se há elementos;– decrementamos o tamanho;– liberamos a memória do elemento;– devolvemos a informação.

Page 25: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDoInício

3

maçãazedacara

uvairkh

barata

melãodocecaro

saiu

volta

Page 26: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDoInício

3

maçãazedacara

uvairkh

barata

melãodocecaro

saiu

volta

Page 27: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDoInício

2

maçãazedacara

uvairkh

barata

melãodocecaro

saiu

volta

Page 28: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDoInícioTipoInfo* MÉTODO retiraDoInício()

//Elimina o primeiro elemento de uma lista.//Retorna a informação do elemento eliminado ou NULO.variáveis tElemento *saiu; //Variável auxiliar para o primeiro elemento.

TipoInfo *volta; //Variável auxiliar para o dado retornado.início

SE (listaVazia()) ENTÃO RETORNE(NULO);SENÃO saiu <- dados; volta <- saiu->info; dados <- saiu->próximo; tamanho <- tamanho - 1; LIBERE(saiu); RETORNE(volta);FIM SE

fim;

Page 29: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo EliminaDoInícioInteiro MÉTODO eliminaDoInício()

//Elimina o primeiro elemento de uma lista e sua respectiva informação.//Retorna a posição do elemento eliminado ou erro.variáveis tElemento *saiu; //Variável auxiliar para o primeiro elemento.início

SE (listaVazia()) ENTÃO RETORNE(ErroListaVazia);SENÃO saiu <- dados; dados <- saiu->próximo; tamanho <- tamanho - 1; LIBERE(saiu->info); LIBERE(saiu); RETORNE(tamanho + 1);FIM SE

fim;

Page 30: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo EliminaDoInício• Observe que a linha LIBERE(saiu->info)

possui um perigo:– se o TipoInfo for por sua vez um conjunto estruturado

de dados com referências internas através de ponteiros (outra lista, por exemplo), a chamada à função LIBERE(saiu->info) só liberará o primeiro nível da estrutura (aquele apontado diretamente);

– tudo o que for referenciado através de ponteiros em info permanecerá em algum lugar da memória, provavelmente inatingível (garbage);

– para evitar isto pode-se criar uma função destrói(info) para o TipoInfo que será chamada no lugar de LIBERE.

Page 31: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Exemplo simplificado: Programa Principal#inclua listaEnc.hvariáveis

tLista *devedores, *credores, *listaEscolhida;TipoInfo *dado;caracter opção;

1 Programa Principal2 início3 devedores <- criaLista();4 credores <- criaLista();5 opção <- ´´;6 ENQUANTO (opção ~= ´f´) ENTÃO7 escreveMenu();8 leia(opção);9 CASO opção SEJA10 ´c´: listaEscolhida <- credores;11 ´d´: listaEscolhida <- devedores;12 ´i´: dado <- leiaInfo();13 listaEscolhida.adicionaNoInício(dado);-- - - - - -- - - - - -- FIM CASO-- FIM ENQUANTO -- fim;

Page 32: INE5408 Estruturas de Dados Listas Encadeadas Simples.

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

Sist.OperacionalSist.Operacional

10010101...10010101...

devedores, credores,

listaEscolhida, dado, opção

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Base da Memória

Variáveis estáticas(globais)

Código objetodo Programa

Page 33: INE5408 Estruturas de Dados Listas Encadeadas Simples.

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

Sist.OperacionalSist.Operacional

10010101...10010101...

devedores, credores,

listaEscolhida, dado, opção

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Base da Memória

Variáveis estáticas(globais)

Código objetodo Programa

Lista

Lista

Page 34: INE5408 Estruturas de Dados Listas Encadeadas Simples.

• 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.

Sist.OperacionalSist.Operacional

10010101...10010101...

devedores, credores,

listaEscolhida, dado, opção

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Base da Memória

Variáveis estáticas(globais)

Código objetodo Programa

Lista

Lista

&progr. #13 lista dado novo

TipoInfo

Elemento

Page 35: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNaPosição• Procedimento:

– testamos se a posição existe e se é possível alocar elemento;

– caminhamos até a posição;– adicionamos o novo dado na posição;– incrementamos o tamanho.

• Parâmetros:– o dado a ser inserido;– a posição onde inserir;

Page 36: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNaPosição

3

melãodocecaro

novo

maçãazedacara

uvairkh

barata

maçãazedacara

anterior

Page 37: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNaPosição

4

melãodocecaro

novo

maçãazedacara

uvairkh

barata

maçãazedacara

anterior

Page 38: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNaPosiçãoInteiro MÉTODO adicionaNaPosição(TipoInfo *info,

inteiro posição)//Adiciona novo elemento na posição informada.//Retorna o novo número de elementos da lista ou erro.variáveis tElemento *novo, *anterior; //Ponteiros auxiliares.início SE (posição > tamanho + 1) ENTÃORETORNE(ErroPosição) SENÃOSE (posição = 1) ENTÃO RETORNE(adicionaNoInício(info);SENÃO novo <- aloque(tElemento); SE (novo = NULO) ENTÃO RETORNE(ErroListaCheia); SENÃO anterior <- dados; REPITA (posição - 2) VEZESanterior <- anterior->próximo; novo->próximo <- anterior->próximo; novo->info <- info; anterior->próximo <- novo; tamanho <- tamanho + 1; RETORNE(aLista->tamanho); FIM SE FIM SE FIM SEfim;

Page 39: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNaPosiçãoInteiro MÉTODO adicionaNaPosição(TipoInfo *info,

inteiro posição)//Adiciona novo elemento na posição informada.//Retorna o novo número de elementos da lista ou erro.variáveis tElemento *novo, *anterior; //Ponteiros auxiliares.início SE (posição > tamanho + 1) ENTÃORETORNE(ErroPosição) SENÃOSE (posição = 1) ENTÃO RETORNE(adicionaNoInício(aLista, info);SENÃO novo <- aloque(tElemento); SE (novo = NULO) ENTÃO RETORNE(ErroListaCheia); SENÃO anterior <- dados; REPITA (posição - 2) VEZESanterior <- anterior->próximo; novo->próximo <- anterior->próximo; novo->info <- info; anterior->próximo <- novo; tamanho <- tamanho + 1; RETORNE(tamanho); FIM SE FIM SE FIM SEfim;

Page 40: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNaPosiçãoInteiro MÉTODO adicionaNaPosição(TipoInfo *info,

inteiro posição)//Adiciona novo elemento na posição informada.//Retorna o novo número de elementos da lista ou erro.variáveis tElemento *novo, *anterior; //Ponteiros auxiliares.início SE (posição > tamanho + 1) ENTÃORETORNE(ErroPosição) SENÃOSE (posição = 1) ENTÃO RETORNE(adicionaNoInício(info);SENÃO novo <- aloque(tElemento); SE (novo = NULO) ENTÃO RETORNE(ErroListaCheia); SENÃO anterior <- dados; REPITA (posição - 2) VEZESanterior <- anterior->próximo; novo->próximo <- anterior->próximo; novo->info <- info; anterior->próximo <- novo; tamanho <- tamanho + 1; RETORNE(tamanho); FIM SE FIM SE FIM SEfim;

Page 41: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaNaPosiçãoInteiro MÉTODO adicionaNaPosição(TipoInfo *info,

inteiro posição)//Adiciona novo elemento na posição informada.//Retorna o novo número de elementos da lista ou erro.variáveis tElemento *novo, *anterior; //Ponteiros auxiliares.início SE (posição > tamanho + 1) ENTÃORETORNE(ErroPosição) SENÃOSE (posição = 1) ENTÃO RETORNE(adicionaNoInício(info);SENÃO novo <- aloque(tElemento); SE (novo = NULO) ENTÃO RETORNE(ErroListaCheia); SENÃO anterior <- dados; REPITA (posição - 2) VEZESanterior <- anterior->próximo; novo->próximo <- anterior->próximo; novo->info <- info; anterior->próximo <- novo; tamanho <- tamanho + 1; RETORNE(tamanho); FIM SE FIM SE FIM SEfim;

Page 42: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosição• Procedimento:

– testamos se a posição existe;– caminhamos até a posição;– retiramos o dado da posição;– decrementamos o tamanho.

• Parâmetros:– a posição de onde retirar;

Page 43: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosição

4

maçãazedacara

uvairkh

barata

melãodocecaro

anterior

jacairkh

barata

eliminar

Posições > 1

Page 44: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosição

4

maçãazedacara

uvairkh

barata

melãodocecaro

anterior

jacairkh

barata

eliminar

Posições > 1

Page 45: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosição

4

maçãazedacara

melãodocecaro

anterior

jacairkh

barata

eliminar

Posições > 1

Page 46: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosição

3

maçãazedacara

melãodocecaro

anterior

jacairkh

barata

eliminar

Posições > 1

Page 47: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosição

3

maçãazedacara

melãodocecaro

jacairkh

barata

Posições > 1

Page 48: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosiçãoTipoInfo* MÉTODO retiraDaPosição(inteiro posição)

//Elimina o elemento da posição de uma lista.//Retorna a informação do elemento eliminado ou NULO.variáveis tElemento *anterior, *eliminar; //Variável auxiliar para elemento.TipoInfo *volta; //Variável auxiliar para o dado retornado.início SE (posição > tamanho) ENTÃORETORNE(NULO); SENÃOSE (posição = 1) ENTÃO RETORNE(retiraDoInício(aLista));SENÃO anterior <- dados; REPITA (posição - 2) VEZESanterior <- anterior->próximo; eliminar <- anterior->próximo; volta <- eliminar->info; anterior->próximo <- eliminar->próximo; tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta);FIM SE FIM SEfim;

Page 49: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosiçãoTipoInfo* MÉTODO retiraDaPosição(inteiro posição)

//Elimina o elemento da posição de uma lista.//Retorna a informação do elemento eliminado ou NULO.variáveis tElemento *anterior, *eliminar; //Variável auxiliar para elemento.TipoInfo *volta; //Variável auxiliar para o dado retornado.início SE (posição > tamanho) ENTÃORETORNE(NULO); SENÃOSE (posição = 1) ENTÃO RETORNE(retiraDoInício());SENÃO anterior <- dados; REPITA (posição - 2) VEZESanterior <- anterior->próximo; eliminar <- anterior->próximo; volta <- eliminar->info; anterior->próximo <- eliminar->próximo; tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta);FIM SE FIM SEfim;

Page 50: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosiçãoTipoInfo* MÉTODO retiraDaPosição(inteiro posição)

//Elimina o elemento da posição de uma lista.//Retorna a informação do elemento eliminado ou NULO.variáveis tElemento *anterior, *eliminar; //Variável auxiliar para elemento.TipoInfo *volta; //Variável auxiliar para o dado retornado.início SE (posição > tamanho) ENTÃORETORNE(NULO); SENÃOSE (posição = 1) ENTÃO RETORNE(retiraDoInício());SENÃO anterior <- dados; REPITA (posição - 2) VEZESanterior <- anterior->próximo; eliminar <- anterior->próximo; volta <- eliminar->info; anterior->próximo <- eliminar->próximo; tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta);FIM SE FIM SEfim;

Page 51: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosiçãoTipoInfo* MÉTODO retiraDaPosição(inteiro posição)

//Elimina o elemento da posição de uma lista.//Retorna a informação do elemento eliminado ou NULO.variáveis tElemento *anterior, *eliminar; //Variável auxiliar para elemento.TipoInfo *volta; //Variável auxiliar para o dado retornado.início SE (posição > tamanho) ENTÃORETORNE(NULO); SENÃOSE (posição = 1) ENTÃO RETORNE(retiraDoInício(aLista));SENÃO anterior <- dados; REPITA (posição - 2) VEZESanterior <- anterior->próximo; eliminar <- anterior->próximo; volta <- eliminar->info; anterior->próximo <- eliminar->próximo; tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta);FIM SE FIM SEfim;

Page 52: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo RetiraDaPosiçãoTipoInfo* MÉTODO retiraDaPosição(inteiro posição)

//Elimina o elemento da posição de uma lista.//Retorna a informação do elemento eliminado ou NULO.variáveis tElemento *anterior, *eliminar; //Variável auxiliar para elemento.TipoInfo *volta; //Variável auxiliar para o dado retornado.início SE (posição > tamanho) ENTÃORETORNE(NULO); SENÃOSE (posição = 1) ENTÃO RETORNE(retiraDoInício(aLista));SENÃO anterior <- dados; REPITA (posição - 2) VEZESanterior <- anterior->próximo; eliminar <- anterior->próximo; volta <- eliminar->info; anterior->próximo <- eliminar->próximo; tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta);FIM SE FIM SEfim;

Page 53: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Modelagem do Tipo Info• Para inserção em ordem e para achar um

elemento determinado, necessitamos da capacidade de comparar informações associadas aos elementos;– estas operações de comparação fazem parte do

Classe TipoInfo e não da lista;– devem ser implementadas como tal.

• Operações: testar AS INFORMAÇÕES:– Igual(dado1, dado2)– Maior(dado1, dado2)– Menor(dado1, dado2)

Page 54: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaEmOrdem• Procedimento:

– necessitamos de um método para comparar os dados (maior);

– procuramos pela posição onde inserir comparando dados;

– chamamos adicionaNaPosição().• Parâmetros:

– o dado a ser inserido;

Page 55: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo AdicionaEmOrdemInteiro MÉTODO adicionaEmOrdem(TipoInfo dado)

variáveis tElemento *atual; //Variável auxiliar para caminhar. inteiro posição;início SE (listaVazia(aLista)) ENTÃO RETORNE(adicionaNoInício(dado)); SENÃO atual <- dados; posição <- 1; ENQUANTO (atual->próximo ~= NULO E maior(dado, atual->info)) FAÇA //Encontrar posição para inserir. atual <- atual->próximo; posição <- posição + 1;FIM ENQUANTOSE maior(dado, atual->info) ENTÃO //Parou porque acabou a lista. RETORNE(adicionaNaPosição(dado, posição + 1));SENÃO RETORNE(adicionaNaPosição(dado, posição));FIM SE

FIM SEfim;

Page 56: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmos Restantes• Por conta do aluno:

– Adiciona(dado)– Retira()– RetiraEspecífico(dado)

• Operações - inicializar ou limpar:– DestróiLista()

Page 57: INE5408 Estruturas de Dados Listas Encadeadas Simples.

Algoritmo DestróiListaFUNÇÃO destróiLista(tLista *aLista)

variáveis tElemento *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->próximo; //Liberar primeiro a Info. LIBERE(anterior->info); //Liberar o elemento que acabei de visitar. LIBERE(anterior);FIM ENQUANTOLIBERE(aLista);

FIM SEfim;