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

Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

  • Upload
    others

  • View
    29

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Aula 05: Listas Encadeadas

Bruno HottAlgoritmos e Estruturas de Dados IDECSI – UFOP

Page 2: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 2

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

info

prox

info

NULL

info

NULLprox

info

NULLprox

NULL

Page 3: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 3

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: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 4

Sobre a Lista

● Uma lista pode ter uma célula cabeça

● Uma lista pode ter um apontador para o último elemento

info

proxprox

info

prox

info

NULL

Último

Page 5: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 5

Cria Lista Vazia

NULL

Cabeça

Último

Page 6: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 6

Inserção de Elementos na Lista

● 3 opções de posições onde pode inserir:

– 1ª posição

– Última posição

– Após um elemento qualquer E

info

proxprox

info

prox

info

NULL

Último

Page 7: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 7

Inserção na Primeira Posição

info

proxprox

info

prox

info

NULL

Último

info

NULLprox

Page 8: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 8

Inserção na Última Posição

info

proxprox

info

prox

info

NULL

Último

info

NULLprox

Page 9: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 9

Inserção Após o Elemento E

prox

info

prox

info

NULL

Último

info

NULLprox

Elem E

info

prox

Page 10: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 10

Retirada de Elementos na Lista

● 3 opções de posição de onde pode retirar:

– 1ª. posição

– última posição

– Um elemento qualquer E

info

proxprox

info

prox

info

NULL

Último

Page 11: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 11

Retirada do Elemento na Primeira Posição da Lista

prox

info

prox

info

NULL

Último

info

prox

Page 12: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 12

Retirada do Elemento E da Lista

info

proxprox

info

prox

info

NULL

Último

Elem E

Anterior

Page 13: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 13

Retirada do Último Elemento da Lista

info

proxprox

info

prox

info

NULL

Último

Anterior

NULL

Page 14: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 14

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;

Page 15: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 15

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

Page 16: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 16

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

Page 17: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 17

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

Page 18: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 18

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

Page 19: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 19

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 */ }}

Page 20: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 20

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 */ }}

Page 21: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 21

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.

Page 22: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 22

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 23: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 23

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 24: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 24

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 25: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 25

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 26: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 26

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 27: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 27

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

Page 28: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 28

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 29: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 29

Vestibular:Classificação dos Alunos por Curso

Page 30: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 30

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 31: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 31

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 32: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 32

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;

Page 33: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 33

Vestibular:Estrutura Final da Lista

TipoItem Registro;TipoLista Classificacao[11];TipoLista Aprovados[NCURSOS];TipoLista Reprovados;int Vagas[NCURSOS];int Passou;int i, Nota;

Page 34: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 34

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

Page 35: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 35

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

Page 36: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 36

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

Page 37: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 37

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 38: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 38

Lista duplamente encadeada

Page 39: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 39

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

Page 40: Aula 05: Listas Encadeadas - WordPress.com...Aula 05: Listas Encadeadas Bruno Hott Algoritmos e Estruturas de Dados I DECSI – UFOP Bruno Hott 2 Listas Encadeadas Características:

Bruno Hott 40

Lista duplamente encadeada:Remoção de elemento

Algoritmo remove(p): t ← p.element (p.prev).next ← p.next (p.next).prev ← p.prev libere p retorne t