ine5408 estruturas de dados listas encadeadas simples · listas encadeadas simples. listas com...

56
INE5408 Estruturas de Dados Listas Encadeadas Simples

Upload: lehuong

Post on 24-Sep-2018

255 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

INE5408Estruturas de Dados

Listas EncadeadasSimples

Page 2: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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 preveruma lista de 10.000 elementos, teremos 40.000 bytes desperdiçados;

• operações podem envolver muitosdeslocamentos 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 Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Listas Encadeadas• São listas onde cada elemento

está armazenado em um TAD chamado elemento de lista;

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

• para referenciar o primeiro elemento utilizamos um TAD cabeça de lista.

Page 4: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Listas Encadeadas

5

melão

info próximo

maçã

info próximo

uva

info próximo

nro dados Cabeçade Lista

Elemento de Lista

Page 5: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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:tipo tLista {

tElemento *dados;inteiro tamanho;

};

Page 6: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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:tipo tElemento {

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

};

Page 7: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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ão

doce

caro

maçã

azeda

cara

uva

irkh

barata

Page 8: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Modelagem: Elemento de Lista II• Pseudo-código II:tipo tElemento {

tElemento *próximo;TipoInfo *info;

};

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

}

Page 9: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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

– vamos na maioria dos algoritmos trabalhar com algum elemento de infomaçã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 muitasaplicações diferentes simplesmente recompilando.

• Desvantagens:– o algoritmo de destruição da lista torna-se mais

complexo.

Page 10: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Modelagem• Aspecto funcional:

– 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ão

doce

caro

maçã

azeda

cara

uva

irkh

barata

Page 11: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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

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

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

Page 12: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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

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

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

Page 13: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo CriaListaLista* 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

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

FIM SERETORNE(aLista);

fim;

Page 14: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo CriaListaLista* 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

//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 · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo CriaListaLista* 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

//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 · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo ListaVaziaBooleano FUNÇÃO listaVazia(Lista *aLista)início

SE (aLista->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çãode adição.

Page 17: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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;– a Lista.

Page 18: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNoInício

2

maçã

azeda

cara

uva

irkh

barata

melão

doce

caro

novo

Page 19: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNoInício

2

maçã

azeda

cara

uva

irkh

barata

melão

doce

caro

3

Page 20: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNoInícioInteiro FUNÇÃO adicionaNoInício(Lista *aLista,

TipoInfo *dado)variáveis

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

novo <- aloque(tElemento);SE (novo = NULO) ENTÃORETORNE(ErroListaCheia);

SENÃOnovo->próximo <- aLista->dados;novo->info <- dado;aLista->dados <- novo;aLista->tamanho <- aLista->tamanho + 1;RETORNE(1);

FIM SEfim;

Page 21: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNoInícioInteiro FUNÇÃO adicionaNoInício(Lista *aLista,

TipoInfo *dado)variáveis

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

novo <- aloque(tElemento);SE (novo = NULO) ENTÃORETORNE(ErroListaCheia);

SENÃOnovo->próximo <- aLista->dados;novo->info <- dado;aLista->dados <- novo;aLista->tamanho <- aLista->tamanho + 1;RETORNE(1);

FIM SEfim;

Page 22: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNoInícioInteiro FUNÇÃO adicionaNoInício(Lista *aLista,

TipoInfo *dado)variáveis

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

novo <- aloque(tElemento);SE (novo = NULO) ENTÃORETORNE(ErroListaCheia);

SENÃOnovo->próximo <- aLista->dados;novo->info <- dado;aLista->dados <- novo;aLista->tamanho <- aLista->tamanho + 1;RETORNE(1);

FIM SEfim;

Page 23: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDoInício• Procedimento:

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

• Parâmetros:– a Lista.

Page 24: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDoInício

3

maçã

azeda

cara

uva

irkh

barata

melão

doce

caro

saiu

volta

Page 25: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDoInício

3

maçã

azeda

cara

uva

irkh

barata

melão

doce

caro

saiu

volta

Page 26: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDoInício

2

maçã

azeda

cara

uva

irkh

barata

melão

doce

caro

saiu

volta

Page 27: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDoInícioTipoInfo* FUNÇÃO retiraDoInício(Lista *aLista)

//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(aLista)) ENTÃORETORNE(NULO);

SENÃOsaiu <- aLista->dados;volta <- saiu->info;aLista->dados <- saiu->próximo;aLista->tamanho <- aLista->tamanho - 1;LIBERE(saiu);RETORNE(volta);

FIM SEfim;

Page 28: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo EliminaDoIníciointeiro FUNÇÃO eliminaDoInício(Lista *aLista)

//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ícioSE (listaVazia(aLista)) ENTÃORETORNE(ErroListaVazia);

SENÃOsaiu <- aLista->dados;aLista->dados <- saiu->próximo;aLista->tamanho <- aLista->tamanho - 1;LIBERE(saiu->info);LIBERE(saiu);RETORNE(aLista->tamanho + 1);

FIM SEfim;

Page 29: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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 internasatravés de ponteiros (outra lista, por exemplo), a chamada à função LIBERE(saiu->info) só liberaráo primeiro nível da estrutura (aquele apontadodiretamente);

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

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

Page 30: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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 adicionaNoInício(listaEscolhida, dado);-- - - - --- - - - --- FIM CASO-- FIM ENQUANTO-- fim;

Page 31: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

• 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 32: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

• 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 33: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

• 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. #13listadadonovo

TipoInfo

Elemento

Page 34: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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;– a Lista.

Page 35: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNaPosição

3

melão

doce

caro

novo

maçã

azeda

cara

uva

irkh

barata

maçã

azeda

cara

anterior

Page 36: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNaPosição

4

melão

doce

caro

novo

maçã

azeda

cara

uva

irkh

barata

maçã

azeda

cara

anterior

Page 37: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNaPosiçãoInteiro FUNÇÃO adicionaNaPosição(tLista *aLista, TipoInfo *info,

inteiro posição)//Adiciona novo elemento na posição informada.//Retorna o novo número de elementos da lista ou erro.variáveistElemento *novo, *anterior; //Ponteiros auxiliares.

inícioSE (posição > aLista->tamanho + 1) ENTÃO

RETORNE(ErroPosição)SENÃO

SE (posição = 1) ENTÃORETORNE(adicionaNoInício(aLista, info);

SENÃOnovo <- aloque(tElemento);SE (novo = NULO) ENTÃORETORNE(ErroListaCheia);

SENÃOanterior <- aLista->dados;REPITA (posição - 2) VEZES

anterior <- anterior->próximo;novo->próximo <- anterior->próximo;novo->info <- info;anterior->próximo <- novo;aLista->tamanho <- aLista->tamanho + 1;RETORNE(aLista->tamanho);

FIM SEFIM SE

FIM SEfim;

Page 38: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNaPosiçãoInteiro FUNÇÃO adicionaNaPosição(tLista *aLista, TipoInfo *info,

inteiro posição)//Adiciona novo elemento na posição informada.//Retorna o novo número de elementos da lista ou erro.variáveistElemento *novo, *anterior; //Ponteiros auxiliares.

inícioSE (posição > aLista->tamanho + 1) ENTÃO

RETORNE(ErroPosição)SENÃO

SE (posição = 1) ENTÃORETORNE(adicionaNoInício(aLista, info);

SENÃOnovo <- aloque(tElemento);SE (novo = NULO) ENTÃORETORNE(ErroListaCheia);

SENÃOanterior <- aLista->dados;REPITA (posição - 2) VEZES

anterior <- anterior->próximo;novo->próximo <- anterior->próximo;novo->info <- info;anterior->próximo <- novo;aLista->tamanho <- aLista->tamanho + 1;RETORNE(aLista->tamanho);

FIM SEFIM SE

FIM SEfim;

Page 39: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNaPosiçãoInteiro FUNÇÃO adicionaNaPosição(tLista *aLista, TipoInfo *info,

inteiro posição)//Adiciona novo elemento na posição informada.//Retorna o novo número de elementos da lista ou erro.variáveistElemento *novo, *anterior; //Ponteiros auxiliares.

inícioSE (posição > aLista->tamanho + 1) ENTÃO

RETORNE(ErroPosição)SENÃO

SE (posição = 1) ENTÃORETORNE(adicionaNoInício(aLista, info);

SENÃOnovo <- aloque(tElemento);SE (novo = NULO) ENTÃORETORNE(ErroListaCheia);

SENÃOanterior <- aLista->dados;REPITA (posição - 2) VEZES

anterior <- anterior->próximo;novo->próximo <- anterior->próximo;novo->info <- info;anterior->próximo <- novo;aLista->tamanho <- aLista->tamanho + 1;RETORNE(aLista->tamanho);

FIM SEFIM SE

FIM SEfim;

Page 40: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaNaPosiçãoInteiro FUNÇÃO adicionaNaPosição(tLista *aLista, TipoInfo *info,

inteiro posição)//Adiciona novo elemento na posição informada.//Retorna o novo número de elementos da lista ou erro.variáveistElemento *novo, *anterior; //Ponteiros auxiliares.

inícioSE (posição > aLista->tamanho + 1) ENTÃO

RETORNE(ErroPosição)SENÃO

SE (posição = 1) ENTÃORETORNE(adicionaNoInício(aLista, info);

SENÃOnovo <- aloque(tElemento);SE (novo = NULO) ENTÃORETORNE(ErroListaCheia);

SENÃOanterior <- aLista->dados;REPITA (posição - 2) VEZES

anterior <- anterior->próximo;novo->próximo <- anterior->próximo;novo->info <- info;anterior->próximo <- novo;aLista->tamanho <- aLista->tamanho + 1;RETORNE(aLista->tamanho);

FIM SEFIM SE

FIM SEfim;

Page 41: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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;– a Lista.

Page 42: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDaPosição

4

maçã

azeda

cara

uva

irkh

barata

melão

doce

caro

anterior

jaca

irkh

barata

eliminar

Posições > 1

Page 43: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDaPosição

4

maçã

azeda

cara

uva

irkh

barata

melão

doce

caro

anterior

jaca

irkh

barata

eliminar

Posições > 1

Page 44: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDaPosição

4

maçã

azeda

cara

melão

doce

caro

anterior

jaca

irkh

barata

eliminar

Posições > 1

Page 45: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDaPosição

3

maçã

azeda

cara

melão

doce

caro

anterior

jaca

irkh

barata

eliminar

Posições > 1

Page 46: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDaPosição

3

maçã

azeda

cara

melão

doce

caro

jaca

irkh

barata

Posições > 1

Page 47: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDaPosiçãoTipoInfo* FUNÇÃO retiraDaPosição(tLista *aLista, 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ícioSE (posição > aLista->tamanho) ENTÃO

RETORNE(NULO);SENÃO

SE (posição = 1) ENTÃORETORNE(retiraDoInício(aLista));

SENÃOanterior <- aLista->dados;REPITA (posição - 2) VEZES

anterior <- anterior->próximo;eliminar <- anterior->próximo;volta <- eliminar->info;anterior->próximo <- eliminar->próximo;aLista->tamanho <- aLista->tamanho - 1;LIBERE(eliminar);RETORNE(volta);

FIM SEFIM SE

fim;

Page 48: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDaPosiçãoTipoInfo* FUNÇÃO retiraDaPosição(tLista *aLista, 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ícioSE (posição > aLista->tamanho) ENTÃO

RETORNE(NULO);SENÃO

SE (posição = 1) ENTÃORETORNE(retiraDoInício(aLista));

SENÃOanterior <- aLista->dados;REPITA (posição - 2) VEZES

anterior <- anterior->próximo;eliminar <- anterior->próximo;volta <- eliminar->info;anterior->próximo <- eliminar->próximo;aLista->tamanho <- aLista->tamanho - 1;LIBERE(eliminar);RETORNE(volta);

FIM SEFIM SE

fim;

Page 49: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDaPosiçãoTipoInfo* FUNÇÃO retiraDaPosição(tLista *aLista, 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ícioSE (posição > aLista->tamanho) ENTÃO

RETORNE(NULO);SENÃO

SE (posição = 1) ENTÃORETORNE(retiraDoInício(aLista));

SENÃOanterior <- aLista->dados;REPITA (posição - 2) VEZES

anterior <- anterior->próximo;eliminar <- anterior->próximo;volta <- eliminar->info;anterior->próximo <- eliminar->próximo;aLista->tamanho <- aLista->tamanho - 1;LIBERE(eliminar);RETORNE(volta);

FIM SEFIM SE

fim;

Page 50: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDaPosiçãoTipoInfo* FUNÇÃO retiraDaPosição(tLista *aLista, 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ícioSE (posição > aLista->tamanho) ENTÃO

RETORNE(NULO);SENÃO

SE (posição = 1) ENTÃORETORNE(retiraDoInício(aLista));

SENÃOanterior <- aLista->dados;REPITA (posição - 2) VEZES

anterior <- anterior->próximo;eliminar <- anterior->próximo;volta <- eliminar->info;anterior->próximo <- eliminar->próximo;aLista->tamanho <- aLista->tamanho - 1;LIBERE(eliminar);RETORNE(volta);

FIM SEFIM SE

fim;

Page 51: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo RetiraDaPosiçãoTipoInfo* FUNÇÃO retiraDaPosição(tLista *aLista, 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ícioSE (posição > aLista->tamanho) ENTÃO

RETORNE(NULO);SENÃO

SE (posição = 1) ENTÃORETORNE(retiraDoInício(aLista));

SENÃOanterior <- aLista->dados;REPITA (posição - 2) VEZES

anterior <- anterior->próximo;eliminar <- anterior->próximo;volta <- eliminar->info;anterior->próximo <- eliminar->próximo;aLista->tamanho <- aLista->tamanho - 1;LIBERE(eliminar);RETORNE(volta);

FIM SEFIM SE

fim;

Page 52: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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

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

TAD 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 53: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaEmOrdem• Procedimento:

– necessitamos de uma função para comparar os dados (maior);

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

– chamamos adicionaNaPosição().

• Parâmetros:– o dado a ser inserido;– a Lista.

Page 54: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmo AdicionaEmOrdemInteiro FUNÇÃO adicionaEmOrdem(tLista *aLista, TipoInfo dado)

variáveistElemento *atual; //Variável auxiliar para caminhar.inteiro posição;

inícioSE (listaVazia(aLista)) ENTÃORETORNE(adicionaNoInício(aLista, dado));

SENÃOatual <- aLista->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(aLista, dado, posição + 1));

SENÃORETORNE(adicionaNaPosição(aLista, dado, posição));

FIM SEFIM SE

fim;

Page 55: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

Algoritmos Restantes• Por conta do aluno:

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

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

Page 56: INE5408 Estruturas de Dados Listas Encadeadas Simples · Listas Encadeadas Simples. Listas com Vetores: Desvantagens 4 55 4 12 89 24 5 55 4 12 89 24 20 • Tamanho máximo fixo; •

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

variáveistElemento *atual, *anterior; //Variável auxiliar para caminhar.

inícioSE (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;