Listas encadeadas
This presentation is the property of its rightful owner.
Sponsored Links
1 / 37

Listas Encadeadas PowerPoint PPT Presentation


  • 53 Views
  • Uploaded on
  • Presentation posted in: General

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.

Download Presentation

Listas Encadeadas

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Listas encadeadas

Listas Encadeadas

David Menotti

Algoritmos e Estruturas de Dados I

DECOM – UFOP


Listas encadeadas1

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

prox

info

prox

Algoritmos e Estrutura de Dados I


Sobre os elementos da lista

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

Algoritmos e Estrutura de Dados I


Sobre a lista

Último

prox

info

info

info

prox

prox

NULL

Sobre a Lista

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

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

Algoritmos e Estrutura de Dados I


Cria lista vazia

Cabeça

NULL

Último

Cria Lista Vazia

Algoritmos e Estrutura de Dados I


Inser o de elementos na lista

Último

prox

info

info

info

prox

prox

NULL

Inserção de Elementos na Lista

  • 3 opções de posição onde pode inserir:

    • 1ª. posição

    • última posição

    • Após um elemento qualquer E

Algoritmos e Estrutura de Dados I


Inser o na primeira posi o

prox

Último

prox

info

info

info

info

prox

prox

NULL

NULL

Inserção na Primeira Posição

Algoritmos e Estrutura de Dados I


Inser o na ltima posi o

prox

prox

info

info

info

info

prox

prox

NULL

NULL

Inserção na Última Posição

Último

Algoritmos e Estrutura de Dados I


Inser o ap s o elemento e

prox

prox

info

info

info

info

prox

NULL

NULL

prox

Inserção Após o Elemento E

Último

Elem E

Algoritmos e Estrutura de Dados I


Retirada de elementos na lista

Último

prox

info

info

info

prox

prox

NULL

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

Algoritmos e Estrutura de Dados I


Retirada do elemento na primeira posi o da lista

Último

prox

info

info

info

prox

prox

NULL

Retirada do Elemento na Primeira Posição da Lista

Algoritmos e Estrutura de Dados I


Retirada do elemento e da lista

prox

Anterior

info

info

info

Elem E

prox

prox

NULL

Retirada do Elemento E da Lista

Último

Algoritmos e Estrutura de Dados I


Retirada do ltimo elemento da lista

prox

info

info

info

Anterior

prox

prox

NULL

Retirada do Último Elemento da Lista

NULL

Último

Algoritmos e Estrutura de Dados I


Estrutura da lista usando apontadores

Estrutura da Lista Usando Apontadores

typedef int TipoChave;

typedef struct {

TipoChave Chave;

/* outros componentes */

} TipoItem;

typedef struct Celula* Apontador;

typedef struct Celula {

TipoItem Item;

struct Celula* pProx; /* Apontador pProx; */

} Celula;

typedef struct {

Apontador pPrimeiro;

Apontador pUltimo;

} TipoLista;

Algoritmos e Estrutura de Dados I


Opera es sobre lista usando apontadores

Operações sobre Lista Usando Apontadores

void FLVazia(TipoLista *pLista)

{

pLista->pPrimeiro = (Apontador) malloc(sizeof(Celula));

pLista->pUltimo = pLista->pPrimeiro;

pLista->pPrimeiro->pProx = NULL;

}

int LEhVazia(TipoLista* pLista)

{

return (pLista->pPrimeiro == pLista->pUltimo);

}

void LInsere(TipoItem x, TipoLista *pLista)

{

pLista->pUltimo->pProx = (Apontador) malloc(sizeof(Celula));

pLista->pUltimo = pLista->pUltimo->pProx;

pLista->pUltimo->Item = x;

pLista->pUltimo->pProx = NULL;

}

Algoritmos e Estrutura de Dados I


Opera es sobre lista usando apontadores1

Operações sobre Lista Usando Apontadores

void LImprime(TipoLista* pLista)

{

Apontador pAux;

pAux = pLista->pPrimeiro->pProx;

while (pAux != NULL)

{

printf("%d\n", pAux->Item.Chave);

pAux = pAux->pProx;

}

}

Algoritmos e Estrutura de Dados I


Opera es sobre lista usando apontadores2

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.

Algoritmos e Estrutura de Dados I


Exemplo de uso listas vestibular

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.

Algoritmos e Estrutura de Dados I


Exemplo de uso listas vestibular1

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.

Algoritmos e Estrutura de Dados I


Vestibular poss vel solu o

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

Algoritmos e Estrutura de Dados I


Vestibular poss vel solu o1

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;

}

Algoritmos e Estrutura de Dados I


Vestibular classifica o dos alunos

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.

Algoritmos e Estrutura de Dados I


Vestibular representa o da classifica o dos alunos

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

Algoritmos e Estrutura de Dados I


Vestibular classifica o dos alunos por curso

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.

Algoritmos e Estrutura de Dados I


Vestibular classifica o dos alunos por curso1

Vestibular - Classificação dos Alunos por Curso

Algoritmos e Estrutura de Dados I


Vestibular segundo refinamento

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;

}

}

Algoritmos e Estrutura de Dados I


Vestibular segundo refinamento1

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;

Algoritmos e Estrutura de Dados I


Vestibular estrutura final da lista

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 *pProx;

} Celula;

typedef struct TipoLista {

Celula *pPrimeiro, *pUltimo;

} TipoLista;

Algoritmos e Estrutura de Dados I


Vestibular estrutura final da lista1

Vestibular - Estrutura Final da Lista

TipoItem Registro;

TipoLista Classificacao[11];

TipoLista Aprovados[NCursos];

TipoLista Reprovados;

long Vagas[NCursos];

short Passou;

long i, Nota;

Algoritmos e Estrutura de Dados I


Vestibular refinamento final

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

}

Algoritmos e Estrutura de Dados I


Vestibular refinamento final1

Vestibular - Refinamento Final

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

{

LInsere(&Registro, &Classificacao[Registro.NotaFinal]);

LeRegistro(&Registro);

}

return 0;

}

Algoritmos e Estrutura de Dados I


Vestibular refinamento final2

Vestibular - Refinamento Final

for (Nota = 10; Nota >= 0; Nota--)

{ while (!LEhVazia(&Classificacao[Nota]))

{ LRetira(Classificacao[Nota].Primeiro, &Classificacao[Nota], &Registro);

i = 0;

Passou = FALSE;

while (i < NOpcoes && !Passou)

{ if (Vagas[Registro.Opcao[i]-1] > 0)

{ LInsere(Registro, &(Aprovados[Registro.Opcao[i]-1]) );

Vagas[Registro.Opcao[i]-1]--;

Passou = TRUE;

}

i++;

}

if (!Passou) LInsere(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;

}

Algoritmos e Estrutura de Dados I


Vestibular refinamento final3

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.

Algoritmos e Estrutura de Dados I


Exerc cios

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

Algoritmos e Estrutura de Dados I


Pilhas e filas

Pilhas e Filas

  • Pilha:

  • Fila:

Quem entra porúltimo

sai primeiro

Quem entraprimeiro

sai primeiro

Algoritmos e Estrutura de Dados I


Pilha apontadores

Pilha – Apontadores

#define max 10

typedef int TipoChave;

typedef struct {

int Chave;

/* --- outros componentes --- */

} TipoItem;

typedef struct Celula*Apontador;

typedef struct Celula {

TipoItem Item;

struct Celula* pProx;

} Celula;

typedef struct {

Apontador pFundo, pTopo;

int Tamanho;

} TipoPilha;

Algoritmos e Estrutura de Dados I


Fila apontadores

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 *Apontador;

typedef struct Celula {

TipoItem Item;

struct Celula *pProx;

} Celula;

typedef struct TipoFila {

Apontador pFrente;

Apontador pTras;

} TipoFila;

Algoritmos e Estrutura de Dados I


  • Login