listas encadeadas

37
Listas Encadeadas David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP

Upload: argus

Post on 12-Feb-2016

66 views

Category:

Documents


0 download

DESCRIPTION

Listas Encadeadas. David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP. info. info. info. info. prox. NULL. NULL. NULL. 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. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Listas Encadeadas

Listas Encadeadas

David MenottiAlgoritmos e Estruturas de Dados IDECOM – UFOP

Page 2: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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

infoinfo

prox

info

NULL

info

NULL

info

NULL

prox

prox

Raquel Prates
Vetor x Listas:Vetor: tamanho pré-definido, sabe qual o próximo, contíguo na memóriaLista: não tem tamanho pré-definido, cada um guarda quem é o próximo, espalhados pela memóriaFigura- Cada elemento armazenado numa lista guarda um ponteiro para o próximo elemento. - O último elemento da lista possui um ponteiro inválido, indicando o término da estrutura. - Com isto, a partir do primeiro elemento e percorrendo-se os ponteiros, pode-se acessar todos os elementos da lista.- Portanto, numa lista encadeada, as informações não estão armazenadas de forma contínua na memória. Cada informação tem seu espaço de memória e é ligada à outra através de um enlace (ponteiro). - Cada elemento é uma estrutura: informações + próximo da fila.Filas e pilhas dividem características comuns: Primeiro, ambas têm regras específicas para referenciar elementos às estruturas de dados. Segundo, operações de restauração são por natureza destrutivas, isto é, acessar um elemento em uma pilha ou fila requer sua retirada.
Page 3: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Sobre os Elementos da Lista

Elemento: guarda as informações sobre cada elemento.

Para isso define-se cada elemento como uma estrutura que possui: campos de informações ponteiro para o próximo elemento

info

prox

Page 4: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Sobre a Lista Uma lista pode ter uma célula cabeça

info

proxprox

info

prox

info

NULL

Uma lista pode ter um apontador para o último elemento

Último

Page 5: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Cria Lista Vazia

NULL

Cabeça

Último

Page 6: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Inserção de Elementos na Lista

info

proxprox

info

prox

info

NULL

Último

3 opções de posição onde pode inserir: 1ª. posição última posição Após um elemento qualquer E

Page 7: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Inserção na Primeira Posição

info

proxprox

info

prox

info

NULL

Último

info

NULLprox

Page 8: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Inserção na Última Posição

info

proxprox

info

prox

info

NULL

Último

info

NULLprox

Page 9: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Inserção Após o Elemento E

prox

info

prox

info

NULL

Último

info

NULLprox

Elem E

info

prox

Page 10: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Retirada de Elementos na Lista

info

proxprox

info

prox

info

NULL

Último

3 opções de posição de onde pode retirar: 1ª. posição última posição Um elemento qualquer E

Page 11: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Retirada do Elemento na Primeira Posição da Lista

info

proxprox

info

prox

info

NULL

Último

Page 12: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Retirada do Elemento E da Lista

info

proxprox

info

prox

info

NULL

Último

Elem E

Anterior

Page 13: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Retirada do Último Elemento da Lista

info

proxprox

info

prox

info

NULL

Último

Anterior

NULL

Page 14: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Estrutura da Lista Usando Apontadorestypedef int TipoChave;

typedef struct { int Chave; /* outros componentes */} TipoItem;

typedef struct Celula_str *Apontador;

typedef struct Celula_str { TipoItem Item; Apontador Prox;} Celula;

typedef struct { Apontador Primeiro; Apontador Ultimo;} TipoLista;

Page 15: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Operações sobre Lista Usando Apontadores

void FLVazia(TipoLista *Lista){ Lista->Primeiro = (Apontador) malloc(sizeof(Celula)); Lista->Ultimo = Lista->Primeiro; Lista->Primeiro->Prox = NULL;}

int Vazia(TipoLista Lista){ return (Lista.Primeiro == Lista.Ultimo);}

void Insere(TipoItem x, TipoLista *Lista){ Lista->Ultimo->Prox = (Apontador) malloc(sizeof(Celula)); Lista->Ultimo = Lista->Ultimo->Prox; Lista->Ultimo->Item = x; Lista->Ultimo->Prox = NULL;}

Page 16: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Operações sobre Lista Usando Apontadores

void Imprime(TipoLista Lista){ Apontador Aux; Aux = Lista.Primeiro->Prox; while (Aux != NULL) { printf("%d\n", Aux->Item.Chave); Aux = Aux->Prox; }}

Page 17: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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.

Page 18: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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.

Page 19: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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.

Page 20: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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

Page 21: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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

Page 22: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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.

Page 23: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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

Page 24: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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.

Page 25: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Vestibular - Classificação dos Alunos por Curso

Page 26: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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

Page 27: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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

Page 28: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Vestibular - Estrutura Final da Lista#define NOpcoes 3

#define NCursos 7#define FALSE 0#define TRUE 1

typedef short TipoChave;

typedef struct TipoItem { TipoChave Chave; char NotaFinal; char Opcao[NOpcoes];} TipoItem;

typedef struct Celula { TipoItem Item; struct Celula *Prox;} Celula;

typedef struct TipoLista { Celula *Primeiro, *Ultimo;} TipoLista;

Page 29: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Vestibular - Estrutura Final da Lista

TipoItem Registro;TipoLista Classificacao[11];TipoLista Aprovados[NCursos];TipoLista Reprovados;long Vagas[NCursos];short Passou;long i, Nota;

Page 30: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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("%hd %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();}

Page 31: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Vestibular - Refinamento Finalint main(int argc, char *argv[]){ /*---Programa principal---*/ for (i = 1; i <= NCursos; i++) scanf("%ld", &Vagas[i-1]); scanf("%*[^\n]"); /* limpa buffer – fflush(stdin); */ getchar(); for (i = 0; i <= 10; i++) FLVazia(&Classificacao[i]); for (i = 0; i < NCursos; i++) FLVazia(&Aprovados[i]); FLVazia(&Reprovados); LeRegistro(&Registro); while (Registro.Chave != 0) { Insere(Registro, &Classificacao[Registro.NotaFinal]); LeRegistro(&Registro); } return 0;}

Page 32: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Vestibular - Refinamento Final for (Nota = 10; Nota >= 0; Nota--) { while (!Vazia(Classificacao[Nota])) { Retira(Classificacao[Nota].Primeiro, &Classificacao[Nota], &Registro); i = 0; Passou = FALSE;

while (i < NOpcoes && !Passou) { if (Vagas[Registro.Opcao[i]-1] > 0) { Insere(Registro, &Aprovados[Registro.Opcao[i]-1]); Vagas[Registro.Opcao[i]-1]--; Passou = TRUE; } i++; } if (!Passou) Insere(Registro, &Reprovados); }

} for (i = 0; i < NCursos; i++) { printf("Relacao dos aprovados no Curso%ld\n", i+1); Imprime(Aprovados[i]); } printf("Relacao dos reprovados\n"); Imprime(Reprovados); return 0;}

Page 33: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

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.

Page 34: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Exercícios O que precisa ser feito para criar um novo

elemento para a lista? Escreva uma função que receba uma lista

como parâmetro e retira o seu primeiro elemento, apagando-o.

Escreva uma função que receba uma lista e um ponteiro para uma célula como parâmetros e insira a célula na primeira posição da lista.

Imagine uma lista duplamente encadeada

Page 35: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Pilhas e Filas Pilha:

Fila:

Quem entra por último sai primeiro

Quem entra primeiro sai primeiro

Page 36: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Pilha – Apontadores#define max 10

typedef int TipoChave;typedef struct { int Chave; /* --- outros componentes --- */} TipoItem;

typedef struct Celula_str *Apontador;

typedef struct Celula_str { TipoItem Item; Apontador Prox;} Celula;

typedef struct { Apontador Fundo, Topo; int Tamanho;} TipoPilha;

Page 37: Listas Encadeadas

Algoritmos e Estrutura de Dados I© David Menotti

Fila – Apontadores#include <stdlib.h>#include <sys/time.h>#include <stdio.h>#define max 10

typedef int TipoChave;

typedef struct TipoItem { TipoChave Chave; /* outros componentes */} TipoItem;

typedef struct Celula_str *Apontador;

typedef struct Celula_str { TipoItem Item; Apontador Prox;} Celula;

typedef struct TipoFila { Apontador Frente, Tras;} TipoFila;