INE5408 Estruturas de Dados Listas Encadeadas Simples.

Slides:



Advertisements
Apresentações semelhantes
Estruturas de Dados Marcio Gonçalves.
Advertisements

N Rainhas Descrição do Problema Satisfação de Restrições (CSP)
Listas Encadeadas CONTEÚDO (1) Motivação (2) Definição (3) Operações
Pilhas e Filas CONTEÚDO (1) Pilhas (2) Filas.
TADS – Tipos Abstratos de Dados
Alocação Dinâmida de Memória
Listas duplamente encadeadas
Algoritmos BUSCA E INSERÇÃO
1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária
Pesquisa em Memória Primária
Listas lineares Listas Lineares Fila Dupla Pilha Fila Saída restrita
Estruturas de Dados e Algoritmos
LPG - I: Alocação Dinâmica de Memória - Ponteiros
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Listas com Ponteiros Listas encadeadas Listas circulares.
COMO FUNCIONA A SIMULAÇÃO
Robson Godoi / Sandra Siebra
Listas Encadeadas.
Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados
Algoritmos e Estruturas de Dados
Listas Simplesmente Encadeadas
ALGORITMOS E ESTRUTURAS DE DADOS
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Aula prática 12 Listas Encadeadas
Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba
Alocação Dinâmica de Memória Professor Mário Dantas
© 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice.
Estrutura de Dados Unidade 9 Simulação do exercício 9.2 CASO 02a Roberto Ferrari Mauricio Falvo.
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Aula prática 8 Ponteiros Monitoria de Introdução à Programação
Prof. Natalia Castro Fernandes Engenharia de Telecomunicações – UFF 2º semestre/2012.
Linguagem de Programação II Parte IX
Aula 11 LISTAS LIGADAS.
Estrutura de Dados Unidade 9 Simulação do exercício 9.2 CASO 02b Roberto Ferrari Mauricio Falvo.
Estrutura de Dados Unidade 9 Simulação do exercício 9.2 CASO 04b Roberto Ferrari Mauricio Falvo.
INTELIGÊNCIA ARTIFICIAL
Estruturas de Dados com Jogos
Estrutura de Dados Unidade 9 Simulação do exercício 9.2 CASO 03a
Aula 3 Vetores e Listas. Arrays (vetores) Array – sequência de elementos do mesmo tipo. Tamanho do Array – seu número de elementos (número fixo) Consequência:
Listas, Filas e Pilhas Katia Guimarães.
Aula 3 Listas, pilhas, filas.
Estruturas de Dados Aula 9: Listas (parte 1)
Algoritmos e Estruturas de Dados I – Recursão
Algoritmos e Estruturas de Dados I – Ponteiros
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática Disciplina: Estrutura de Dados Professor: Cheli dos S. Mendes da Costa Listas.
Capítulo VIII Ambientes de Execução
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Pilhas e Filas usando Alocação Estática e Dinâmica de Memória
Vetores Bidimensionais – Debug - Ponteiros – Listas Encadeadas Simples
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Prof. Alessandro Gonçalves
Estrutura de Dados Aula 02 1.
INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 1 Estruturas de Dados - T.332 Capítulo 3 Parte 1: Ponteiros, Passagem.
INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica.
INE5408 Estruturas de Dados
© Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados Estruturas de Dados Dinâmicas IF672 - Algoritmos e Estruturas de Dados.
Ponteiros em C Prof. Kariston Pereira
Estruturas de Dados Murilo Salgado Razoli.
Estrutura de Dados Aula 3 - Listas
11 Pilhas, Filas e Listas Duplamente Encadeadas Prof. Kariston Pereira Adaptado de Material gentilmente fornecido pelo Prof. Rui Tramontin (DCC/UDESC)
Lista Ligada Estrutura de Dados II Prof. Gale. Vantagens  Crescem (ou decrescem) à medida que elementos são inseridos (ou removidos)  seqüência encadeada.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
INE5408 Estruturas de Dados Passagem por Referência.
INE5408 Estruturas de Dados Estruturas de Dados básicas utilizando Vetores - Listas.
INE5408 Estruturas de Dados Estruturas de Dados básicas utilizando Vetores - Introdução - Pilhas usando Vetores - Filas usando Vetores.
INE5408 Estruturas de Dados Listas Encadeadas - Pilhas encadeadas - Filas encadeadas - Listas duplamente encadeadas.
INE5408 Estruturas de Dados Listas Encadeadas - Pilhas encadeadas - Filas encadeadas - Listas duplamente encadeadas.
INE5408 Estruturas de Dados
Transcrição da apresentação:

INE5408 Estruturas de Dados Listas Encadeadas Simples

Listas com Vetores: Desvantagens 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 elementos, teremos 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.

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.

Listas Encadeadas 5 melão info próximo maçã info próximo uva info próximo nro dados Cabeça de Lista Elemento de Lista

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; };

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; };

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 nrodados Elemento de Informaçã o (tipoInfo) melão doce caro maçã azeda cara uva irkh barata

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.

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

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

Modelagem: Aspecto Funcional 3 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 5 melão doce caro maçã azeda cara uva irkh barata

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)

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()

Algoritmo CriaLista Lista* 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 SE RETORNE(aLista); fim;

Algoritmo CriaLista Lista* 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 SE RETORNE(aLista); fim;

Algoritmo CriaLista Lista* 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 SE RETORNE(aLista); fim;

Algoritmo ListaVazia Booleano MÉTODO listaVazia() início SE (tamanho = 0) ENTÃO RETORNE(Verdadeiro) SENÃO RETORNE(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.

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;

Algoritmo AdicionaNoInício 2 maçã azeda cara uva irkh barata melão doce caro novo

Algoritmo AdicionaNoInício 2 maçã azeda cara uva irkh barata melão doce caro 3

Algoritmo AdicionaNoInício Inteiro 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;

Algoritmo AdicionaNoInício Inteiro 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;

Algoritmo AdicionaNoInício Inteiro 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;

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

Algoritmo RetiraDoInício 3 maçã azeda cara uva irkh barata melão doce caro saiu volta

Algoritmo RetiraDoInício 3 maçã azeda cara uva irkh barata melão doce caro saiu volta

Algoritmo RetiraDoInício 2 maçã azeda cara uva irkh barata melão doce caro saiu volta

Algoritmo RetiraDoInício TipoInfo* 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 info; dados próximo; tamanho <- tamanho - 1; LIBERE(saiu); RETORNE(volta); FIM SE fim;

Algoritmo EliminaDoInício Inteiro 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 próximo; tamanho <- tamanho - 1; LIBERE(saiu->info); LIBERE(saiu); RETORNE(tamanho + 1); FIM SE fim;

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.

Exemplo simplificado: Programa Principal #inclua listaEnc.h variáveis tLista *devedores, *credores, *listaEscolhida; TipoInfo *dado; caracter opção; 1 Programa Principal 2início 3devedores <- criaLista(); 4credores <- criaLista(); 5opção <- ´´; 6ENQUANTO (opção ~= ´f´) ENTÃO 7escreveMenu(); 8leia(opção); 9CASO opção SEJA 10 ´c´: listaEscolhida <- credores; 11 ´d´: listaEscolhida <- devedores; 12 ´i´: dado <- leiaInfo(); 13listaEscolhida.adicionaNoInício(dado); FIM CASO --FIM ENQUANTO --fim;

Memória logo após o início do programa, quando o fluxo de execução se encontra na linha #2. Sist.Operacional devedores, credores, listaEscolhida, dado, opção HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Base da Memória Variáveis estáticas (globais) Código objeto do Programa

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.Operacional devedores, credores, listaEscolhida, dado, opção HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Base da Memória Variáveis estáticas (globais) Código objeto do Programa Lista

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.Operacional devedores, credores, listaEscolhida, dado, opção HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Base da Memória Variáveis estáticas (globais) Código objeto do Programa Lista &progr. #13 lista dado novo TipoInfo Elemento

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;

Algoritmo AdicionaNaPosição 3 melão doce caro novo maçã azeda cara uva irkh barata maçã azeda cara anterior

Algoritmo AdicionaNaPosição 4 melão doce caro novo maçã azeda cara uva irkh barata maçã azeda cara anterior

Algoritmo AdicionaNaPosição Inteiro 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ÃO RETORNE(ErroPosição) SENÃO SE (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) VEZES anterior próximo; novo->próximo próximo; novo->info <- info; anterior->próximo <- novo; tamanho <- tamanho + 1; RETORNE(aLista->tamanho); FIM SE fim;

Algoritmo AdicionaNaPosição Inteiro 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ÃO RETORNE(ErroPosição) SENÃO SE (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) VEZES anterior próximo; novo->próximo próximo; novo->info <- info; anterior->próximo <- novo; tamanho <- tamanho + 1; RETORNE(tamanho); FIM SE fim;

Algoritmo AdicionaNaPosição Inteiro 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ÃO RETORNE(ErroPosição) SENÃO SE (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) VEZES anterior próximo; novo->próximo próximo; novo->info <- info; anterior->próximo <- novo; tamanho <- tamanho + 1; RETORNE(tamanho); FIM SE fim;

Algoritmo AdicionaNaPosição Inteiro 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ÃO RETORNE(ErroPosição) SENÃO SE (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) VEZES anterior próximo; novo->próximo próximo; novo->info <- info; anterior->próximo <- novo; tamanho <- tamanho + 1; RETORNE(tamanho); FIM SE fim;

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;

Algoritmo RetiraDaPosição 4 maçã azeda cara uva irkh barata melão doce caro anterior jaca irkh barata eliminar Posições > 1

Algoritmo RetiraDaPosição 4 maçã azeda cara uva irkh barata melão doce caro anterior jaca irkh barata eliminar Posições > 1

Algoritmo RetiraDaPosição 4 maçã azeda cara melão doce caro anterior jaca irkh barata eliminar Posições > 1

Algoritmo RetiraDaPosição 3 maçã azeda cara melão doce caro anterior jaca irkh barata eliminar Posições > 1

Algoritmo RetiraDaPosição 3 maçã azeda cara melão doce caro jaca irkh barata Posições > 1

Algoritmo RetiraDaPosição TipoInfo* 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ÃO RETORNE(NULO); SENÃO SE (posição = 1) ENTÃO RETORNE(retiraDoInício(aLista)); SENÃO anterior <- dados; REPITA (posição - 2) VEZES anterior próximo; eliminar próximo; volta info; anterior->próximo próximo; tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta); FIM SE fim;

Algoritmo RetiraDaPosição TipoInfo* 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ÃO RETORNE(NULO); SENÃO SE (posição = 1) ENTÃO RETORNE(retiraDoInício()); SENÃO anterior <- dados; REPITA (posição - 2) VEZES anterior próximo; eliminar próximo; volta info; anterior->próximo próximo; tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta); FIM SE fim;

Algoritmo RetiraDaPosição TipoInfo* 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ÃO RETORNE(NULO); SENÃO SE (posição = 1) ENTÃO RETORNE(retiraDoInício()); SENÃO anterior <- dados; REPITA (posição - 2) VEZES anterior próximo; eliminar próximo; volta info; anterior->próximo próximo; tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta); FIM SE fim;

Algoritmo RetiraDaPosição TipoInfo* 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ÃO RETORNE(NULO); SENÃO SE (posição = 1) ENTÃO RETORNE(retiraDoInício(aLista)); SENÃO anterior <- dados; REPITA (posição - 2) VEZES anterior próximo; eliminar próximo; volta info; anterior->próximo próximo; tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta); FIM SE fim;

Algoritmo RetiraDaPosição TipoInfo* 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ÃO RETORNE(NULO); SENÃO SE (posição = 1) ENTÃO RETORNE(retiraDoInício(aLista)); SENÃO anterior <- dados; REPITA (posição - 2) VEZES anterior próximo; eliminar próximo; volta info; anterior->próximo próximo; tamanho <- tamanho - 1; LIBERE(eliminar); RETORNE(volta); FIM SE fim;

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)

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;

Algoritmo AdicionaEmOrdem Inteiro 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 próximo; posição <- posição + 1; FIM ENQUANTO SE 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;

Algoritmos Restantes Por conta do aluno: –Adiciona(dado) –Retira() –RetiraEspecífico(dado) Operações - inicializar ou limpar: –DestróiLista()

Algoritmo DestróiLista FUNÇÃ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 dados; ENQUANTO (atual ~= NULO) FAÇA //Eliminar até o fim. anterior <- atual; //Vou para o próximo mesmo que seja nulo. atual próximo; //Liberar primeiro a Info. LIBERE(anterior->info); //Liberar o elemento que acabei de visitar. LIBERE(anterior); FIM ENQUANTO LIBERE(aLista); FIM SE fim;