Listas (Parte 2) Túlio Toffolo tulio@toffolo.com.br www.toffolo.com.br. BCC202 Aula 10 Algoritmos e Estruturas de Dados I

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

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

BCC202 - Estrutura de Dados I

ias.php

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

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

Pesquisa Sequencial e Binária

Métodos Computacionais. Fila

Filas: conceitos e implementações

Estruturas de Dados Aula 15: Árvores 17/05/2011

O que é um algoritmo? O que é um programa? Algoritmos. Programas. Aula 1 Tipo Abstrato de Dados

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

BCC202 - Estrutura de Dados I

ALGORITMOS E ESTRUTURAS DE DADOS Terceiro Trabalho Prático Recursividade e Pilhas

INF 1007 Programação II

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

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

Trabalho 3: Agenda de Tarefas

Busca. Pesquisa sequencial

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

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

Tipo Abstrato de Dados

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

PROGRAMAÇÃO II 3. FILA DINÂMICA

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 4

Curso de C. Memória Dinâmica 17/05/ :33 1

struct LISTA item quant

INF 1010 Estruturas de Dados Avançadas

Estruturas de Dados I

Algoritmos e Estrutura de Dados. Prof. Tiago A. E. Ferreira

2ª Lista de Exercícios

Linguagem de Programação C

Hashing (Tabela de Dispersão)

Trabalho Prático 1 Revisão de Programação, Tipos Abstratos de Dados e Combinação de Alocação Estática e Dinâmica de Memória

Lista restrita onde as operações de inserção e retirada são feitas nas extremidades. Deque (fila de final duplo).

Busca em Memória. Secundária

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 6 Filas

Métodos Computacionais. Árvores

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

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

Filas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

compreender a importância de cada estrutura de controle disponível na Linguagem C;

P r o g r a m a ç ã o d e C o m p u t a d o r e s 1 o S e m P r o f. A n d r é A m a r a n t e L u i z L A B 5 tag %2d while printf PE1:

INF 1620 P1-10/04/02 Questão 1 Nome:

FACULDADE DE TECNOLOGIA SENAC GOIÁS ADELTON HENRIQUE ABISHAI LEMES BORGES NETO HENRIQUE FERREIRA DA SILVA

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11

Aula 1 Tipo Abstrato de Dados

Este trabalho tem como objetivo praticar o uso de tipos abstratos de dados e estruturas do tipo Lista.

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

insfcanceof new public switch transient while byte continue extends for int null

INF 1007 Programação II

INTRODUÇÃO À LINGUAGEM C++

Plano de Aula. if(condição) { bloco de comandos; } else { bloco de comandos2; }

A Pilha. Aula 02. DPEE 1038 Estrutura de Dados para Automação Curso de Engenharia de Controle e Automação Universidade Federal de Santa Maria

9.1.2 Laços Controlados por Entrada: Contador

Algoritmos e Programação

DAS5102 Fundamentos da Estrutura da Informação

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Implementando uma Classe e Criando Objetos a partir dela

Curso C: Funções e Macros

7. Estrutura de Decisão

Tabela ASCII de caracteres de controle

LINGUAGEM C. Estrutura básica de um programa

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1

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

EAD Árvore árvore binária

Listas ligadas/listas encadeadas

float vantagem(float candidato[], float concorrente[], int n);

Prof. Marcelo Nogueira

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

Fundamentos de Programação

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

Estruturas (Registros)

Projeto e Desenvolvimento de Algoritmos

INF 1007 Programação II

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

Programas operam sobre dados. Dados são relacionados e possuem estrutura. Como representar e manipular dados em um computador

Fila de Prioridade. Siang Wun Song - Universidade de São Paulo - IME/USP. MAC Estruturas de Dados

Elementos de programação em C

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

10. Listas Encadeadas

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

Estruturas de Dados. Listas Dinâmicas Duplamente Encadeadas & Variantes. Listas Duplamente Encadeadas

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Figura 13.1: Um exemplo de árvore de diretório.

Filas com prioridade - Introdução (1)

Estrutura de Dados Básica

Estrutura de Dados Básica

Árvores Binárias - continuação

Tipos de Dado Abstrato: Listas, Filas e Pilhas

3.4 Representação física: alocação encadeada (dinâmica) Ptlista - variável ponteiro externa que indica o início da lista.

Tipos de Dados Avançados Vetores e Matrizes

Transcrição:

Listas (Parte 2) Túlio Toffolo tulio@toffolo.com.br www.toffolo.com.br BCC202 Aula 10 Algoritmos e Estruturas de Dados I

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 2

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 3

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

Cria Lista Vazia Cabeça NULL NULL Último 5

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

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

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

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

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

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

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

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

Estrutura da Lista typedef struct { int chave; /* outros componentes */ } TItem; typedef struct celula { struct celula *pprox; TItem item; /* outros componentes */ } TCelula; typedef struct { TCelula *pprimeiro, *pultimo; } TLista; 14

Funções Principais de Listas /* Procedimentos e funções padrões da TAD */ void TLista_Inicia(TLista *plista); int TLista_EhVazia(TLista *plista); int TLista_Insere(TLista *plista, TItem x); int TLista_RetiraPrimeiro(TLista *plista, TItem *px); void TLista_Imprime(TLista *plista); 15

Operações em Listas (com cabeça) /* Inicia as variáveis da lista */ void TLista_Inicia(TLista *plista) { plista->pprimeiro = (TCelula*) malloc(sizeof(tcelula)); plista->pultimo = plista->pprimeiro; plista->pprimeiro->pprox = NULL; } /* Retorna se a lista é vazia */ int TLista_EhVazia(TLista *plista) { return (plista->pprimeiro == plista->pultimo); } 16

Operações em Listas (com cabeça) /* Insere um item no final da lista */ int TLista_Insere(TLista *plista, TItem x) { plista->pultimo->pprox = (TCelula*) malloc(sizeof (TCelula)); plista->pultimo = plista->pultimo->pprox; plista->pultimo->item = x; plista->pultimo->pprox = NULL; } 17

Operações em Listas (com cabeça) /* Retira o primeiro item da lista */ int TLista_RetiraPrimeiro(TLista *plista, TItem *px) { if (TLista_EhVazia(pLista)) return 0; } TCelula *paux; paux = plista->pprimeiro->pprox; *px = paux->item; plista->pprimeiro->pprox = paux->pprox; free(paux); return 1; 18

Operações em Listas (com cabeça) /* Imprime os elementos da lista no terminal */ void TLista_Imprime(TLista *plista) { TCelula *paux; paux = plista->pprimeiro->pprox; while (paux!= NULL) { printf("%d\n", paux->item.chave); paux = paux->pprox; /* próxima célula */ } } 19

Listas com e sem Cabeça NULL - NULL NULL NULL NULL Primeiro NULL NULL NULL 20

Sobre a Lista sem Cabeça Uma lista tem o ponteiro para a primeiro elemento Primeiro NULL Último Uma lista pode ter um apontador para o último elemento 21

Cria Lista sem Cabeça Vazia Primeiro NULL NULL Último 22

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

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

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

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

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

Retirada do Elemento da Primeira Posição Primeiro NULL Último 28

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

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

Operações em Listas (sem cabeça) /* Inicia as variáveis da lista */ void TLista_Inicia(TLista *plista) { plista->pprimeiro = NULL; plista->pultimo = NULL; } /* Retorna se a lista é vazia */ int TLista_EhVazia(TLista *plista) { return (plista->pprimeiro == NULL); } 31

Operações em Listas (sem cabeça) /* Insere um item no final da lista */ int TLista_Insere(TLista *plista, TItem x) { if (plista->pprimeiro == NULL) { plista->pprimeiro = (TCelula*) malloc(sizeof(tcelula)); plista->pultimo = plista->pprimeiro; } else { plista->pultimo->pprox = (TCelula*) malloc(sizeof(tcelula)); plista->pultimo = plista->pultimo->pprox; } plista->pultimo->item = *pitem; plista->pultimo->pprox = NULL; } 32

Operações em Listas (sem cabeça) /* Retira o primeiro item da lista */ int TLista_RetiraPrimeiro(TLista *plista, TItem *px) { if (TLista_EhVazia(pLista)) return 0; } TCelula *paux; paux = plista->pprimeiro; *px = paux->item; plista->pprimeiro = plista->pprimeiro->pprox; free(paux); if (plista->pprimeiro == NULL) plista->pultimo = NULL; /* lista vazia */ return 1; 33

Operações em Listas (sem cabeça) /* Imprime os elementos da lista no terminal */ void TLista_Imprime(TLista *plista) { TCelula *paux; paux = plista->pprimeiro; while (paux!= NULL) { printf("%d\n", paux->item.chave); paux = paux->pprox; /* próxima célula */ } } 34

Listas Encadeadas 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). Desvantagens: Utilização de memória extra para armazenar os apontadores. Percorrer a lista, procurando o i-ésimo elemento, tem custo O(n). 35

Perguntas? 36

Exercícios Qual seria a vantagem de uma lista duplamente encadeada? Escreva uma função que retorna o elemento na posição p de uma lista encadeada: int TLista_Elemento(TLista *plista, int p, TItem *px); A função deve retornar 0 se não for possível retornar o elemento ou 1 caso contrário. 37

Perguntas? 38

Exemplo de Uso de Listas 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. 39

Exemplo de Uso de Listas 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. 40

Exemplo de Uso de Listas Solução 01 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). 41

Exemplo de Uso de Listas int main() { ordena os registros pelo campo NotaFinal; for Nota = 10 até 0 do while houver registro com mesma nota { if existe vaga em um dos cursos de opcao insere registro no conjunto de aprovados; else insere registro no conjunto de reprovados; } imprime aprovados por curso; imprime reprovados; } 42

Exemplo de Uso de Listas 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. 43

Representação da Classificação dos Alunos 44

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 dos cursos, na primeira das três opções em que houver vaga. Se não houver vaga, o registro é colocado no próximo curso ou em uma lista de reprovados. Ao final a estrutura conterá a relação de candidatos aprovados em cada curso. 45

Vestibular Classificação dos Alunos por Curso 46

Vestibular Segundo Refinamento int main() { lê número de vagas para cada curso; inicializa listas de aprovados e reprovados; lê registro; while Chave!= 0 { insere registro nas listas, conforme nota; lê registro; } } 47

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

Vestibular Estrutura Final da Lista em C #define NOPCOES 3 #define NCURSOS 7 typedef struct { int chave; char notafinal; char opcao[nopcoes]; } TItem; typedef struct Celula { TItem Item; struct Celula *pprox; } TCelula; typedef struct { TCelula *pprimeiro, *pultimo; } TLista; 49

Vestibular Estrutura Final da Lista em C /* função que lê os registros da entrada */ void LeRegistro(TipoItem *registro) { /* os valores lidos estao separados por espaços */ int i, TEMP; scanf("%d %d", &(registro->chave), &TEMP); registro->notafinal = TEMP; for (i = 0; i < NOPCOES; i++) { scanf("%d", &TEMP); registro->opcao[i] = TEMP; } scanf( %*[^\n] ); /* limpa buffer - fflush(stdin);*/ getchar(); } 50

Vestibular Estrutura Final da Lista em C /* função principal (main) do programa */ int main(int argc, char *argv[]) { /* variáves utilizadas */ TItem registro; TLista classificacao[11]; TLista aprovados[ncursos]; TLista reprovados; int vagas[ncursos]; int passou; int i, nota; for (i = 1; i <= NCURSOS; i++) scanf("%ld", &vagas[i-1]); scanf("%*[^\n]"); /* limpa buffer fflush(stdin); */ getchar(); 51

Vestibular Estrutura Final da Lista em C for (i = 0; i <= 10; i++) TLista_Inicia(&(classificacao[i])); for (i = 0; i < NCURSOS; i++) TLista_Inicia(&(aprovados[i])); TLista_Inicia(&reprovados); Leregistro(&registro); while (registro.chave!= 0) { TLista_Insere(&classificacao[registro.notaFinal], &registro); Leregistro(&registro); } /* Exercício: * Implementar o resto na aula prática * e entregar até o final da aula de amanhã. */ 52

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