Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
AULA 3
LISTA LINEAR
Estrutura de Dados
Listas lineares
Listas lineares encadeadas
Ordem dos nodos da lista definida por informação contido em cada nodo
Ordem independe da posição física dos nodos
contiguidade lógica dos nodos na LL
Campo de elo
contido em cada nodo
informa qual o próximo nodo da lista
LL encadeada
LL encadeada
LL encadeada
Requisitos para LL encadeada
Ponteiro para o primeiro nodo da lista
Encadeamento entre os nodos através de campo de elo
Indicação de final de lista
PtLista
Info Elo
Nodo genérico
LL encadeada
Operações básicas
Criar e inicializar uma lista
Inserir novo nodo
Remover um nodo
Acessar um nodo
Destruir lista
Algoritmos
Tipos de dados utilizados nos algoritmos:
TipoPtNodo = TipoNodo
TipoNodo = registro
Info: TipoInfoNodo
Elo : TipoPtNodo
fim registro
LL encadeada
Criação de LL encadeada
Inicializar apontador do início da lista em endereço nulo
Lista inicialmente vazia
PtLista
Endereço nulo
Algoritmo:
Inicializar LL Encadeada
Algoritmo InicializarLLEnc
Entradas: -
Saída: PtLista (TipoPtNodo)
início
PtLista nulo
fim
LL encadeada
LL encadeada
Inserção de um novo nodo
Alocar o novo nodo
Preencher com valor
Encadear na posição solicitada
No início da lista (primeiro nodo)
No final da lista (último nodo)
No meio da lista
PtLista
L2
L4
L3
PtLista
L1
Novo nodo
LL encadeada
Inserção no início de LL encadeada
Algoritmo InserirIniLLEnc
Entradas: PtLista (TipoPtNodo)
Dados (TipoInfoNodo)
Saídas: PtLista (TipoPtNodo)
Sucesso (lógico)
Variável auxiliar: Pt (TipoPtNodo)
início
alocar(Pt)
se Pt = nulo
então Sucesso falso
senão início
Sucesso verdadeiro
Pt.Info Dados
Pt.Elo PtLista
PtLista Pt
fim
fim
Algoritmo:
Inserir nodo Início de LL Encadeada
LL encadeada
Algoritmo:
Inserir nodo Início de LL Encadeada
LL encadeada
PASCAL
Function InserirIniLLEnc
(var PtLista: TipoPtNodo; Dados: TipoInfoNodo): boolean;
var Pt: TipoPtNodo;
begin
new(Pt);
if Pt = nil
then InserirIniLLEnc := false
else begin
Pt^.Info := Dados;
Pt^.Elo := PtLista;
PtLista := Pt;
InserirIniLLEnc := true;
end;
end;
LL encadeada
Inserção no final de LL encadeada
PtLista
L2
L4
L3
PtLista
L1
Novo nodo
Percorrer a lista a partir do primeiro nodo até o final
Algoritmo InserirFimLLEnc
Entradas: PtLista (TipoPtNodo)
Dados (TipoInfoNodo)
Saídas: PtLista (TipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: P1, P2 (TipoPtNodo)
início
alocar(P1)
se P1 = nulo
então Sucesso falso
senão início
Sucesso verdadeiro
P1.Info Dados
P1.Elo nulo
se PtLista = nulo
então PtLista P1
senão início
P2 PtLista
enquanto P2.Elo nulo
faça P2 P2.Elo
P2.Elo P1
fim
fim
fim
Algoritmo:
Inserir nodo no Fim de LL Encadeada
LL encadeada
LL encadeada
Inserção no meio de LL encadeada
L1
L3
L2
L1
L2
L4
L3
PtLista
PtLista
Novo nodo
Percorrer a lista a partir do primeiro nodo até a posição de inserção
Algoritmo InserirKLLEnc
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Dados (TipoInfoNodo)
Saídas: PtLista (TipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PAnt, PtNovo (TipoPtNodo)
início
alocar(PtNovo)
se PtNovo = nulo
então Sucesso falso
senão se ((PtLista = nulo) e (K 1)) ou (K < 1)
então início
liberar(PtNovo)
Sucesso falso
fim
senão se K = 1
então início
PtNovo.Info Dados
PtNovo.Elo PtLista
PtLista PtNovo
Sucesso verdadeiro
fim
{ senão início SEGUE }
Algoritmo: Inserir nodo na K-ésima posição de LL Encadeada
senão início
PtAnt PtLista
enquanto (PtAnt.Elo nulo) e (K > 2)
faça início
PtAnt PtAnt.Elo
K K - 1
fim
se K > 2
então início
liberar(PtNovo)
Sucesso falso
fim
senão início
PtNovo.Info Dados
PtNovo.Elo PtAnt.Elo
PtAnt.Elo PtNovo
Sucesso verdadeiro
fim
fim
fim
Algoritmo (cont):
Inserir nodo na K-ésima posição de LL Encadeada
LL encadeada
Remoção de um nodo
Localizar o nodo a ser removido
Atualizar encadeamento da lista
Liberar espaço ocupado pelo nodo
Se for o último nodo da lista lista fica vazia
Atualizar apontador da lista para endereço nulo
LL encadeada
Remoção de um nodo
L1
L2
L4
L3
PtLista
L1
L2
L3
PtLista
Nodo a ser removido
Algoritmo RemoverKLLEnc
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Saídas: PtLista (TipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PtAnt, PtK (TipoPtNodo)
início
se K < 1
então Sucesso falso
senão início
PtK PtLista
PtAnt nulo
enquanto (PtK nulo) e (K > 1)
faça início
K K-1
PtAnt PtK
PtK PtK.Elo
fim
se PtK = nulo
então Sucesso falso
senão início
se PtK = PtLista
então PtLista PtLista.Elo
senão PtAnt.Elo PtK.Elo
liberar(PtK)
Sucesso verdadeiro
fim fim fim
Algoritmo: Remover nodo da K-ésima posição de LL Encadeada
LL encadeada
Acesso a um nodo
Nodos não podem ser acessados diretamente
Percorrer a lista até encontrar o nodo buscado
Nodo identificado por
sua posição na lista
conteúdo
Algoritmo: Acessar K-ésimo nodo de LL Encadeada
Algoritmo AcessarKLLEnc
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Saída: PtK (TipoPtNodo)
início
se (K < 1) ou (PtLista = nulo)
então PtK nulo
senão início
PtK PtLista
enquanto (PtK nulo) e (K > 1)
faça início
K K-1
PtK PtK.Elo
fim
se K > 1
então PtK nulo
fim
fim
LL encadeada
Destruir lista
Percorrer lista a partir do primeiro nodo
Liberar todos os nodos da lista
Apontador para início da lista recebe endereço nulo
Algoritmo:
Destruir LL Encadeada
Algoritmo DestruirLLEnc
Entrada: PtLista (TipoPtNodo)
Saída: PtLista (TipoPtNodo)
Variável auxiliar: Pt (TipoPtNodo)
begin
enquanto PtLista nulo
faça início
Pt PtLista
PtLista PtLista.Elo
liberar(Pt)
fim
liberar(PtLista)
fim
LL encadeada
Listas lineares
Lista encadeada circular
LL encadeada circular
LL encadeada circular
L1
L2
L4
L3
PtLista
Elo do último nodo indica endereço do primeiro
Lista pode ser percorrida a partir de qualquer nodo
Lista com 1 só nodo: elo do nodo aponta para ele mesmo
L1
PtLista
LL encadeada circular
Operações básicas
Criar uma lista
Inserir novo nodo
Remover um nodo
Acessar um nodo
Destruir lista
Algoritmos
Semelhantes a LL encadeada simples
Inserção de um novo nodo
Localizar posição de inserção
Alocar o novo nodo
Preencher com valor
Encadear adequadamente
LL encadeada circular
L1
L2
L4
L3
PtLista
L5
Algoritmo InserirKLLEncCir
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Dados (TipoInfoNodo)
Saídas: PtLista (TipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PtAnt, PtNovo (TipoPtNodo)
início
alocar(PtNovo)
se PtNovo = nulo
então Sucesso falso
senão se ((PtLista = nulo) e (K 1)) ou (K < 1)
então início
liberar(PtNovo)
Sucesso falso
fim
senão início
Sucesso verdadeiro
PtNovo.Info Dados
se K = 1 {INSERE COMO PRIMEIRO}
{ então início SEGUE }
Algoritmo:
Inserir K-ésimo nodo em LL Encadeada Circular
LL encadeada circular
então início
se PtLista = nulo
então PtNovo.Elo PtNovo
senão início
PtAnt PtLista
enquanto PtAnt.Elo PtLista
faça PtAnt PtAnt.Elo
PtNovo.Elo PtLista
PtAnt.Elo PtNovo
fim
PtLista PtNovo
fim
senão início
PtAnt PtLista
enquanto (PtAnt.Elo PtLista) e (K > 2)
faça início
PtAnt PtAnt.Elo
K K - 1
fim
se K > 2 {ORDEM FORA DA LISTA}
então início
liberar(PtNovo)
Sucesso falso
fim
senão início
PtNovo.Info Dados {INSERE NO MEIO}
PtNovo.Elo PtAnt.Elo
PtAnt.Elo PtNovo
fim fim fim fim
Algoritmo (cont): Inserir K-ésimo nodo em LL Encadeada Circular
Remoção de um nodo
LL encadeada circular
L1
L2
L4
L3
PtLista
L1
L2
L3
PtLista
Remover
Localizar posição do nodo
Adequar encadeamentos
Liberar nodo
Algoritmo RemoverKLLEncCir
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Saídas: PtLista (TipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PtAnt, PtK (TipoPtNodo)
início
se (K < 1) ou (PtLista = nulo)
então Sucesso falso
senão início
Sucesso verdadeiro
se K = 1
então se PtLista.Elo = PtLista
então início
liberar(PtLista)
PtLista nulo
fim
senão início
PtAnt PtLista
enquanto PtAnt.Elo PtLista
faça PtAnt PtAnt.Elo
PtAnt.Elo PtLista.Elo
liberar(PtLista)
PtLista PtAnt.Elo
fim
{ senão início SEGUE }
Algoritmo: Remover K-ésimo nodo de LL Encadeada Circular
senão início
PtAnt PtLista
enquanto (PtAnt.Elo PtLista) e (K > 2)
faça início
PtAnt PtAnt.Elo
K K - 1
fim
se PtAnt.Elo = PtLista {ORDEM FORA DA LISTA}
então Sucesso falso
senão início
PtK PtAnt.Elo
PtAnt.Elo PtK.Elo
liberar(PtK)
fim
fim
fim
fim
Algoritmo (cont): Remover K-ésimo nodo de LL Encadeada Circular
LL encadeada circular
Acesso à lista
LL encadeada circular
Iniciar sempre acessando primeiro nodo da lista
Seguir acessando de acordo com campos de elo
Para quando encontrar novamente o primeiro nodo da lista
L1
L2
L4
L3
PtLista
L5
A seguir: algoritmo que acessa todos os nodos de uma LL encadeada circular, imprimindo o campo de informação de todos os nodos acessados
Algoritmo ImprimirLLEncCir
Entrada: PtLista (TipoPtNodo)
Saídas: -
Variável auxiliar: PtAux (TipoPtNodo)
início
se PtLista = nulo
então escrever(´Lista vazia!´)
senão início
PtAux PtLista
repita
escrever(PtAux.Info)
PtAux PtAux.Elo
até que PtAux = PtLista
fim
fim
Algoritmo:
Imprimir conteúdos de LL Encadeada Circular
LL encadeada circular
LL encadeada circular
Listas lineares
Listas lineares duplamente encadeadas
LL duplamente encadeadas
PtLista
L1
L2
L3
L4
Cada nodo tem 2 campos de elo
A lista pode ser percorrida nas duas direções
LL duplamente encadeadas
Anterior Info Próximo
Nodo genérico
LL duplamente encadeadas
Operações
Criar e inicializar uma lista
Inserir novo nodo
Remover um nodo
Acessar um nodo
Destruir lista
Algoritmos
Semelhantes a LL encadeada simples
Tipo de nodo utilizado nos algoritmos:
TipoNodo = registro
Ant: TipoPtNodo
Info: TipoInfoNodo
Prox: TipoPtNodo
fim registro
LL duplamente encadeadas
Inserção de um novo nodo
PtLista
PtLista
Novo nodo
L1
L2
L3
L4
L4
L5
L2
L1
L3
Algoritmo InserirKLLDupEnc
Entradas: PtLista (TipoPtNodo)
K (inteiro)
Dados (TipoInfoNodo)
Saídas: PtLista (TipoPtNodo)
Sucesso (lógico)
Variáveis auxiliares: PtAnt, PtNovo (TipoPtNodo)
início
alocar(PtNovo)
se PtNovo = nulo
então Sucesso falso
senão se ((PtLista = nulo) e (K 1)) ou (K < 1)
então início
liberar(PtNovo)
Sucesso falso
fim
senão se K = 1
então início
PtNovo.Info Dados
PtNovo.Prox PtLista
se PtLista <> nulo
então PtLista.Ant PtNovo
PtNovo.Ant nulo
PtLista PtNovo
Sucesso verdadeiro
fim
{ senão início SEGUE }
Algoritmo: Inserir K-ésimo nodo em LL Duplamente Encadeada
senão início
PtAnt PtLista
enquanto (PtAnt.Prox nulo) e (K > 2)
faça início
PtAnt PtAnt.Prox
K K - 1
fim
se K > 2
então início
liberar(PtNovo)
Sucesso falso
fim
senão início
PtNovo.Info Dados
PtNovo.Prox PtAnt.Prox
PtNovo.Ant PtAnt
PtAnt.Prox PtNovo
if PtNovo.Prox <> nulo
then PtNovo.Prox.Ant PtNovo
Sucesso verdadeiro
fim
fim
fim
Algoritmo (cont): Inserir K-ésimo nodo em LL Duplamente Encadeada
LL duplamente encadeadas
Remoção de novo nodo
A
B
PtLista
C
D
A
B
PtLista
C
D
Remover
Algoritmo RemoverKLLDupEnc
Entradas: PtLista (TipoPtNodo) Saídas: PtLista (TipoPtNodo)
K (inteiro) Sucesso (lógico)
Variável auxiliar: PtK (TipoPtNodo)
início
se ((PtLista = nulo) e (K 1)) ou (K < 1)
então Sucesso falso
senão início
PtK PtLista
enquanto (PtK nulo) e (K > 1)
faça início
K K-1
PtK PtK.Prox
fim
se PtK = nulo
então Sucesso falso
senão início
Sucesso verdadeiro
se PtK =
PtLista
então início
PtLista.Ant nulo
PtLista PtLista.Prox
fim
senão início
PtK.Ant.Prox PtK.Prox
se PtK.Prox <> nulo
então PtK.Prox.Ant PtK.Ant
liberar(PtK)
fim fim fim fim
Algoritmo: Remover K-ésimo nodo em LL Duplamente Encadeada
LL duplamente encadeadas
Acesso à lista
Acesso sempre pelo primeiro nodo da lista
Depois a lista pode ser percorrida nas duas direções
Exemplo a seguir:
Imprimir conteúdo da lista, do final para o início
Algoritmo ImprimirLLDupEncInv
Entrada: PtLista (TipoPtNodo)
Saídas: -
Variável auxiliar: PtAux (TipoPtNodo)
início
se PtLista = nulo
então escrever(´Lista vazia !´)
senão início
PtAux PtLista
enquanto PtAux.Prox nulo
faça PtAuxPtAux.Prox
enquanto PtAux PtLista
faça início
escrever(PtAux.Info)
PtAux PtAux.Ant
fim
escrever(PtAux.Info)
fim
fim
Algoritmo:
Imprimir LL Duplamente Encadeada em ordem Invertida
LL duplamente encadeadas
Listas lineares
Lista duplamente encadeada circular
LL duplamente encadeada circular
Lista duplamente encadeada circular
PtLista
L1
L2
L3
L4
Operações
Criar uma lista
Inserir novo nodo
Remover um nodo
Acessar um nodo
Destruir lista
Algoritmos
Semelhantes a LL encadeada simples
LL duplamente encadeada circular
PtLista
L1
L2
L3
L4
Inserção de um novo nodo
LL duplamente encadeada circular
PtLista
No início
No final
PtLista
L2
L3
L4
L5
L1
PtLista
L2
L3
L4
L5
L1
LL duplamente encadeada circular
No meio – 3ª posição
PtLista
L2
L3
L4
L5
L1
PtLista
L1
L2
L3
L4
Inserção de um novo nodo
PtLista
Algoritmo InserirFimLLDupEncCir
Entradas: PtLista (TipoPtNodo)
Dados (TipoInfoNodo)
Saídas: PtLista (TipoPtNodo)
Sucesso (lógico)
Variável auxiliar: PtNovo (TipoPtNodo)
início
alocar(PtNovo)
se PtNovo = nulo
então Sucesso falso
senão início
Sucesso verdadeiro
PtNovo.Info Dados
se PtLista = nulo
então início
PtNovo.Prox PtNovo
PtNovo.Ant PtNovo
PtLista PtNovo
fim
senão início
Ptnovo.Ant PtLista.Ant
PtNovo.Prox PtLista
PtLista.Ant.Prox PtNovo
PtLista.Ant PtNovo
fim fim fim
Algoritmo: Inserir um nodo no Final de LL Duplamente
Encadeada Circular
Remoção de um nodo
LL duplamente encadeada circular
PtLista
L1
L2
L3
L4
Remover 2º nodo
PtLista
L1
L2
L3
L1
L2
L3
L4
PtLista
Algoritmo: Remover um nodo no Final de LL Duplamente
Encadeada Circular
Algoritmo RemoverUltLLDupEncCir
Entradas: PtLista (TipoPtNodo)
Saídas: PtLista (TipoPtNodo)
Sucesso (lógico)
Variável auxiliar: PtAux (TipoPtNodo)
início
se PtLista = nulo
então Sucesso falso
senão início
Sucesso verdadeiro
PtAux PtLista.Ant
se PtLista.Prox = PtLista
então PtLista nulo
senão início
PtLista.Ant PtAux.Ant
PtAux.Ant.Prox PtLista
fim
liberar(PtAux)
fim
fim
*
Quando desejamos resolver um problema através de um programa utilizando o computador a primeira providência que devemos tomar é a de elaborar o algoritmo mais adequado para o programa. Para cada programa desenvolvido na disciplina de algoritmos vocês conceberam um algoritmo antes de implementar o mesmo.
A eficiência do algoritmo vai depender da disposição dos dados, ou elementos que servem de base para a resolução do problema, na memória. Quando maior for a facilidade o computador achar na memória estes dados, maior será a eficiência do programa.
Para entender a relação entre eficiência e algoritmo vamos ver o exemplo da agenda telefônica. Supondo que freqüentemente utilizamos a agenda telefônica para descobrir o número de telefone de nossos conhecidos, é conveniente dispor de uma relação dos números, organizada na agenda. Se a organização for feita por ordem alfabética, a agenda de fato ajuda. Se, porém, organizássemos nossa agenda pela ordem de altura das pessoas, com raras exceções, a agenda se tornaria difícil de manusear.
Se soubermos organizar a nossa agenda de forma a tornar a busca de um número de telefone bastante facilitada, então, estaremos executando a tarefa de busca de forma eficiente.