Aula 05: Listas Encadeadas. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Documentos relacionados
Listas Encadeadas. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Listas Lineares. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1

Listas (Parte 2) Túlio Toffolo BCC202 Aula 10 Algoritmos e Estruturas de Dados I

BCC202 - Estrutura de Dados I

BCC202 - Estrutura de Dados I

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Aula 06: Pilhas

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Aula 07: Filas

Filas. Prof. Túlio Toffolo BCC202 Aula 12 Algoritmos e Estruturas de Dados I

Listas (Parte 1) Túlio Toffolo BCC202 Aula 09 Algoritmos e Estruturas de Dados I

Estruturas de Dados Básicas

Estruturas de Dados Básicas

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

Tabelas Hash. Prof. Túlio Toffolo BCC202 Aulas 23 e 24 Algoritmos e Estruturas de Dados I

Pilha. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Livro Projeto de Algoritmos Nívio Ziviani Listas Lineares Capítulo 3 Seção 3.1

LISTAS LINEARES. Estrutura de Dados

Listas Lineares. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Estruturas de Dados Básicas

Pilhas. Prof. Túlio Toffolo BCC202 Aula 11 Algoritmos e Estruturas de Dados I

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

Árvores de Pesquisa (Parte I)

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Fontes Bibliográficas. Listas Circulares. Função Imprime

REVISÃO DE PILHAS E FILAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Estruturas de Dados Aula 11: TAD Pilha

Pesquisa em memória primária: hashing. Algoritmos e Estruturas de Dados II

Aula 16: Pesquisa em Memória Primária - Árvores de Busca. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

PCC104 - Projeto e Análise de Algoritmos

Aula 15: Pesquisa em Memória Primária. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Métodos Computacionais. Listas Encadeadas

Estruturas de Dados Aula 12: Outras Implementações de Listas 18/04/2011

Tabelas Hash. Prof. Túlio Toffolo BCC202 Aula 21 Algoritmos e Estruturas de Dados I

Estruturas de Dados Básicas

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Estruturas de Dados Básicas

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

A regra de acesso aos dados de uma fila é a seguinte: O primeiro elemento que entra (na fila) é o primeiro que sai (FIFO first in, first out).

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Algoritmos e Estruturas de Dados II IEC013

ias.php

Estruturas de Dados. Módulo 12 - Filas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

Instituto de C. Filas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Algoritmos e Estruturas de dados

Listas ligadas/listas encadeadas

Lista de Exercícios 04

Pilhas e Filas. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.2 e 3.3

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Lista Encadeada (Linked List)

Aula 10 Alocação Dinâmica de Memória Listas Encadeadas. prof Leticia Winkler

BCC202 - Estrutura de Dados I

Pesquisa em Memória Primária Hashing

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

Introdução a Programação. Listas Encadeadas

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

Listas Lineares Ordenadas

Módulo 10 Listas Encadeadas

SCC 202 Prova 1. 28/9/2010 Resolução e Comentários

Linguagem C: Listas Encadeadas

Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 05 Pag.: 1

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional

Estrutura de Dados: Lista Linear. Parte I Introdução e Listas Sequenciais Estáticas

Pesquisa em Memória Primária Árvores de Busca. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Estruturas de Dados Filas

Árvore Binária de Busca. Prof. César Melo

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

Estrutura de Dados Listas

Estrutura de Dados: Lista Linear. Parte I Introdução e Listas Sequenciais Estáticas

Introdução a Programação. Tipos Abstratos de Dados Implementando Pilha e Fila

Árvores de Pesquisa (Parte II)

DAINF - Departamento de Informática

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

Árvores Binárias de Busca (ABB) 18/11

Listas Lineares. continuando...

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Tabelas Hash O Que é uma Tabela Hash? O Que é uma Tabela Hash? O Que é uma Tabela Hash? Inserindo um Novo Registro. O Que é uma Tabela Hash?

Matrizes Esparsas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

AULA 12 ESTRUTURA DE DADOS

INF 1620 P2-01/11/03 Questão 1 Nome:

Árvores de Pesquisa (Parte I)

1. Listas sequenciais versus listas ligadas. Lista sequencial

Atividade de laboratório listas encadeadas simples

Listas - Outras. Listas Circulares Nós Cabeça Listas Duplamente Ligadas/Encadeadas Aplicações

Listas Estáticas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Algoritmos e Estruturas de dados

Filas. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Prof. Jesus José de Oliveira Neto

Árvores Binárias de Busca

Fila e Deque. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Transcrição:

Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Listas Encadeadas Características: Tamanho da lista não é pré-definido Cada elemento guarda quem é o próximo Elementos não estão contíguos na memória NULL NULL NULL NULL

Sobre os Elementos da Lista Elemento: guarda as rmações sobre cada elemento. Para isso define-se cada elemento como uma estrutura que possui: Campos de rmações Ponteiro para o próximo elemento

Sobre a Lista Uma lista pode ter uma célula cabeça NULL Último Uma lista pode ter um apontador para o último elemento

Cria Lista Vazia Cabeça NULL Último

Inserção de Elementos na Lista 3 opções de posições onde pode inserir: NULL Último 1ª posição Última posição Após um elemento qualquer E

Inserção na Primeira Posição NULL NULL Último

Inserção na Última Posição NULL NULL Último

Inserção Após o Elemento E NULL NULL Último Elem E

Retirada de Elementos na Lista NULL Último 3 opções de posição de onde pode retirar: 1ª. posição última posição Um elemento qualquer E

Retirada do Elemento na Primeira Posição da Lista NULL Último

Retirada do Elemento E da Lista NULL Último Anterior Elem E

Retirada do Último Elemento da Lista NULL NULL Último Anterior

Estrutura da Lista Usando Apontadores typedef int TChave; typedef struct{ TChave chave; /* outros componentes */ TItem; typedef struct TCelula{ TItem item; struct TCelula* pprox; /* Apontador pprox; */ TCelula; typedef struct{ TCelula* pprimeiro; TCelula* pultimo; TLista;

Operações sobre Lista Usando Apontadores (com cabeça) void FLVazia(TLista *plista){ plista->pprimeiro = (TCelula*) malloc(sizeof(tcelula)); plista->pultimo = plista->pprimeiro; plista->pprimeiro->pprox = NULL; int LVazia(TLista* plista){ return (plista->pprimeiro == plista->pultimo); void Linsere(TLista* plista, TItem* pitem){ plista->pultimo->pprox = (TCelula*) malloc(sizeof(tcelula)); plista->pultimo = plista->pultimo->pprox; plista->pultimo->item = *pitem; plista->pultimo->pprox = NULL;

Operações sobre Lista Usando Apontadores (sem cabeça) void FLvazia(TLista *plista){ plista->pprimeiro = NULL; plista->pultimo = NULL; int LVazia(TLista* plista){ return (plista->pultimo == NULL); void LInsere(TLista *plista, TItem* pitem){ if(plista->pultimo == NULL){ plista->pultimo = (TCelula*) malloc(sizeof(tcelula)); plista->pprimeiro = plista->pultimo; else{ plista->pultimo->pprox = (TCelula*) malloc(sizeof(tcelula)); plista->pultimo = plista->pultimo->pprox; plista->pultimo->item = *pitem; plista->pultimo->pprox = NULL;

Operações sobre Lista Usando Apontadores (com cabeça) int LRetira(TLista* plista, TItem* pitem){ TCelula* paux; if(lvazia(plista)) return 0; *pitem = plista->pprimeiro->pprox->item; paux = plista->pprimeiro; plista->pprimeiro = plista->pprimeiro->pprox; free(paux); return 1;

Operações sobre Lista Usando Apontadores (sem cabeça) int LRetira(TLista* plista, TItem* pitem){ TCelula* paux; if(lvazia(plista)) return 0; *pitem = plista->pprimeiro->item; paux = plista->pprimeiro; plista->pprimeiro = plista->pprimeiro->pprox; free(paux); if(plista->pprimeiro == NULL) plista->pultimo = NULL; /* lista vazia */ return 1;

Operações sobre Lista Usando Apontadores (com cabeça) void LImprime(TLista* plista){ TCelula* paux; paux = plista->pprimeiro->pprox; while(paux!= NULL){ printf("%d\n", paux->item.chave); paux = paux->pprox; /* próxima célula */

Operações sobre Lista Usando Apontadores (sem cabeça) void LImprime(TLista* plista){ TCelula* paux; paux = plista->pprimeiro; while(paux!= NULL){ printf("%d\n", paux->item.chave); paux = paux->pprox; /* próxima célula */

Operações sobre Lista Usando Apontadores Vantagens: Permite inserir ou retirar itens do meio da lista a um custo constante (importante quando a lista tem de ser mantida em ordem). Bom para aplicações em que não existe previsão sobre o crescimento da lista (o tamanho máximo da lista não precisa ser definido a priori). Desvantagem: Utilização de memória extra para armazenar os apontadores. Percorrer a lista, procurando pelo i-ésimo elemento.

Exemplo de Uso Listas: Vestibular Num vestibular, cada candidato tem direito a três opções para tentar uma vaga em um dos sete cursos oferecidos. Para cada candidato é lido um registro: Chave: número de inscrição do candidato. NotaFinal: média das notas do candidato. Opção: vetor contendo a primeira, a segunda e a terceira opções de curso do candidato.

Exemplo de Uso Listas: Vestibular Problema: distribuir os candidatos entre os cursos, segundo a nota final e as opções apresentadas por candidato. Em caso de empate, os candidatos serão atendidos na ordem de inscrição para os exames.

Vestibular: Possível Solução Ordenar registros pelo campo NotaFinal, respeitando a ordem de inscrição; Percorrer cada conjunto de registros com mesma NotaFinal, começando pelo conjunto de NotaFinal 10, seguido pelo de NotaFinal 9, e assim por diante. Para um conjunto de mesma NotaFinal tenta-se encaixar cada registro desse conjunto em um dos cursos, na primeira das três opções em que houver vaga (se houver).

Vestibular: Possível Solução Primeiro refinamento: main(){ ordena os registros pelo campo NotaFinal ; for Nota = 10 até 0 do while houver registro com mesma nota do if existe vaga em um dos cursos de opcao do candidato then insere registro no conjunto de aprovados; else insere registro no conjunto de reprovados; imprime aprovados por curso; imprime reprovados;

Vestibular: Classificação dos Alunos Uma boa maneira de representar um conjunto de registros é com o uso de listas. Ao serem lidos, os registros são armazenados em listas para cada nota. Após a leitura do último registro os candidatos estão automaticamente ordenados por NotaFinal. Dentro de cada lista, os registros estão ordenados por ordem de inscrição, desde que os registros sejam lidos na ordem de inscrição de cada candidato e inseridos nesta ordem.

Vestibular: Representação da Classificação dos Alunos

Vestibular: Classificação dos Alunos por Curso As listas de registros são percorridas, iniciando-se pela de NotaFinal 10, seguida pela de NotaFinal 9, e assim sucessivamente. Cada registro é retirado e colocado em uma das listas da abaixo, na primeira das três opções em que houver vaga. Se não houver vaga, o registro é colocado em uma lista de reprovados. Ao final a estrutura acima conterá a relação de candidatos aprovados em cada curso.

Vestibular: Classificação dos Alunos por Curso

Vestibular: Segundo Refinamento main(){ lê número de vagas para cada curso; inicializa listas de classificação de aprovados e reprovados; lê registro; while Chave!= 0 do //Ou while Chave do insere registro nas listas de classificação, conforme nota final; lê registro;

Vestibular: Segundo Refinamento for Nota = 10 até 0 do{ while houver próximo registro com mesma NotaFinal do{ retira registro da lista; if existe vaga em um dos cursos de opção do candidato{ insere registro na lista de aprovados; decrementa o número de vagas para aquele curso; else insere registro na lista de reprovados; obtém próximo registro; imprime aprovados por curso; imprime reprovados;

Vestibular: Estrutura Final da Lista #define NOPCOES 3 #define NCURSOS 7 #define FALSE 0 #define TRUE 1 typedef int TipoChave; typedef struct{ TipoChave Chave; int NotaFinal; int Opcao[NOpcoes]; TipoItem; typedef struct{ TipoItem Item; struct TipoCelula* pprox; TipoCelula; typedef struct{ Celula *pprimeiro, *pultimo; TipoLista;

Vestibular: Estrutura Final da Lista TipoItem Registro; TipoLista Classificacao[11]; TipoLista Aprovados[NCURSOS]; TipoLista Reprovados; int Vagas[NCURSOS]; int Passou; int i, Nota;

Vestibular: Refinamento Final Observe que o programa é completamente independente da implementação do tipo abstrato de dados Lista. void LeRegistro(TipoItem *Registro){ /* os valores lidos devem estar separados por brancos */ long i; int TEMP; scanf("%d %d", &(Registro->Chave), &TEMP); Registro->NotaFinal = TEMP; for(i=0; i < NOPCOES; i++){ scanf("%d", &TEMP); Registro->Opcao[i] = TEMP;

Vestibular: Refinamento Final int main(int argc, char *argv[]){ /* inicializacao */ for(i = 1; i <= NCursos; i++) scanf("%d", &Vagas[i-1]); for(i = 0; i <= 10; i++) FLVazia(&(Classificacao[i])); for(i = 0; i < NCursos; i++) FLVazia(&(Aprovados[i])); FLVazia(&Reprovados); /* leitura dos registros */ LeRegistro(&Registro); while(registro.chave!= 0){ Linsere(&Classificacao[Registro.NotaFinal],&Registro); LeRegistro(&Registro);

Vestibular: Refinamento Final for(nota = 10; Nota >= 0; Nota--) while(!lvazia(&classificacao[nota])){ LRetira(&Classificacao[Nota], &Registro); Passou = FALSE; for(i = 0; i < NOpcoes &&!Passou; i++) if(vagas[ Registro.Opcao[i]-1 ] > 0){ Linsere(&(Aprovados[ Registro.Opcao[i]-1 ]), &Registro ); Vagas[ Registro.Opcao[i]-1 ]--; Passou = TRUE; if(!passou) LInsere(&Reprovados, &Registro); for(i = 0; i < NCursos; i++){ printf("relacao dos aprovados no Curso %d\n", i+1); Imprime(Aprovados[i]); printf("relacao dos reprovados\n"); Imprime(Reprovados); return 0;

Vestibular: Refinamento Final O exemplo mostra a importância de utilizar tipos abstratos de dados para escrever programas, em vez de utilizar detalhes particulares de implementação. Altera-se a implementação rapidamente. Não é necessário procurar as referências diretas às estruturas de dados por todo o código. Este aspecto é particularmente importante em programas de grande porte.

Lista duplamente encadeada

Lista duplamente encadeada: Inserção de elemento Algoritmo insertafter(p,e): Cria um novo nodo v v.element e v.prev p v.next p.next (p.next).prev v p.next v retorne v

Lista duplamente encadeada: Remoção de elemento Algoritmo remove(p): t p.element (p.prev).next p.next (p.prev).prev p.prev libere p retorne t