Logo Passei Direto
Buscar

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

LISTA LINEAR
(parte I)
 
Estrutura de Dados
Uma Lista Linear (LL) é uma seqüência de nodos
 Lista linear 
 Nodos - elementos do mesmo tipo
 Relação de ordem linear (ou total)
 Lista linear 
a
b
c
d
e
Primeiro nodo
Último nodo
Segundo nodo
 Estrutura interna é abstraída
 Pode ter uma complexidade arbitrária
 Enfatizado o conjunto de relações existente
z
d
a
c
b
d
 Estrutura dos nodos 
Uma lista linear é uma coleção de n  0 nodos 
x1, x2, ... , xn, todos do mesmo tipo, cujas propriedades estruturais relevantes envolvem apenas as posições relativas lineares entre nodos:
	n = 0 : lista vazia, apresenta zero nodos
n > 0 : x1 é o primeiro nodo
 xn é o último nodo
1 < k < n : xk é precedido por xk-1 e sucedido por xk+1
 Lista linear: seqüência de 0 ou mais nodos do mesmo tipo
 Definição formal 
 Notas de alunos
 Cadastro de funcionários de uma empresa 
 Itens em estoque em uma empresa 
 Dias da semana
 Vagões de um trem 
 Letras de uma palavra 
 Pessoas esperando ônibus
 Cartas de baralho 
 Precipitações pluviométricas em um mês / dia 
 Exemplos de aplicações com listas
 Operações sobre listas lineares
 Criação de uma lista
 Inserção de um nodo
 Exclusão de um nodo
 Acesso a um nodo
 Destruição de uma lista
Operações básicas:
 Contigüidade física 
 Encadeamento 
Representação física das relações existentes entre os nodos e não aquelas internas a eles
Representação física de uma
lista linear 
Listas lineares
LL implementadas através de contiguidade física
Implementação de LL através de contigüidade física
 Utiliza a seqüencialidade da memória para representar a ordem entre os nodos
Lista linear
Arranjo
Implementação de LL sobre arranjo de 1 dimensão
Características
 todos os elementos do arranjo tem tipo igual
 cada elemento do arranjo é um nodo
 tipo do nodo = tipo do elemento do arranjo
 posição no arranjo representa posição na LL
 acesso direto aos nodos
 natureza dinâmica – inserção / remoção de nodos
 comprimento varia durante aplicação
LL – contiguidade física
L2
L1
L3
L4
L5
L6
L1
L2
L3
L4
L5
L6
1 2 3 4 5 6 
L L
TipoNodo = registro
 Nome: string
 Código: inteiro
 Valor: real
 fim registro
 
TipoLista = arranjo [1 .. N] de TipoNodo
Tipos de dados
Tipos de dados utilizados nos algoritmos
para LL implementada com contiguidade física:
LL – contiguidade física
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
5
8
Lista
LL – contiguidade física
Início e final da LL geralmente são diferentes do início e final do arranjo
Início e final da LL
Variáveis para identificar Início e Final da Lista
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
5
8
Início
do Arranjo
Final
do Arranjo
Lista
LL – contiguidade física
Início e final da LL geralmente são diferentes do início e final do arranjo
Início e final da LL
Variáveis para identificar Início e Final da Lista
Um mesmo arranjo pode ser utilizado para 
mais de uma lista linear
Mais de uma LL em um arranjo
1
2
4
3
7
6
9
10
LL
IL1
FL2
IA
FA
L1
L2
L1
L2
L3
5
8
IL2
FL1
Lista 1
Lista 2
LL – contiguidade física
 criação da lista
 inserção de um novo nodo
 remoção de um nodo 
 acesso a um nodo
Operações sobre listas lineares
em contiguidade física
Algoritmos
LL – contiguidade física
1
2
4
3
7
6
9
10
LL
5
8
Criação de uma LL vazia 
 Declarar o arranjo
 Inicializar variáveis que guardam início e final da lista
IL = FL = IA-1
IA
FA
LL – contiguidade física
Algoritmo: 
Inicializar LL sobre Arranjo vazio 
LL – contiguidade física
Algoritmo InicializarLLArr 
 Entradas: IA (inteiro)
 Saídas: IL, FL (inteiro)
início
 IL  FL  IA - 1
fim 
Ex: Lista de informações de produtos de uma empresa 
TipoNodo = registro
 Nome: string
 Código: inteiro
 Preço: real
 fim registro 
TipoLista = arranjo [1 .. 10] de TipoNodo
1
2
4
3
7
6
9
10
LL
5
8
IA
FA
Nome
Código
Preço
IL
FL
0
Inserção de um novo nodo 
LL – contiguidade física
 LL já existente
Informar:
 posição (ordem) do novo nodo na LL
 valor do campo de informação do novo nodo
Quando não é possível realizar a inserção:
 posição solicitada fora dos limites da LL existente
 espaço disponível para a LL no arranjo todo preenchido
 
L1
L2
L3
L4
L5
L6
0 1 2 3 4 5 6 7 
L L
IA IL FL FA
Inserção de um novo nodo 
LL – contiguidade física
LL – contiguidade física
Inserção como primeiro nodo da LL 
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
L6
5
8
Inserir
no início
LL inicia no início do arranjo
LL – contiguidade física
Inserção como primeiro nodo da LL 
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
L6
5
8
1
2
4
3
7
6
9
10
LL
5
8
IA
FA
Inserir
no início
LL inicia no início do arranjo
LL – contiguidade física
Inserção como primeiro nodo da LL 
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
L6
5
8
1
2
4
3
7
6
9
10
LL
L1
L2
L3
L4
L5
L6
L7
5
8
IL
FL
IA
FA
Inserir
no início
Novo nodo
LL inicia no início do arranjo
LL – contiguidade física
Inserção como primeiro nodo da LL 
LL não inicia no início do arranjo
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
L6
5
8
Inserir
no início
LL – contiguidade física
Inserção como primeiro nodo da LL 
LL não inicia no início do arranjo
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
L6
5
8
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
L6
L7
5
8
Inserir
no início
Novo nodo
Algoritmo InserirIniLLArr 
 Entradas: LL (TipoLista)
 IA, FA, IL, FL (inteiro)
 InfoNodo (TipoNodo)
 Saídas: LL (TipoLista)
 IL, FL (inteiro)
 Sucesso (lógico)
 Variável auxiliar: Ind (inteiro)
início
 se (IA = IL) e (FA = FL) então {arranjo vazio}
 Sucesso  falso 
 senão 
 início			 
 se IL = 0 então {lista vazia}
 IL  FL  IA 
 senão 
 se IL > IA então {a lista não inicia na primeira posição do arranjo}
 IL  IL-1
 senão 
 início {Deslocar nodos para cima}
 para Ind de FL incr -1 até IL faça
 LL[Ind+1]  LL[Ind]
 FL  FL+1
 fim
 LL[IL]  InfoNodo 
 Sucesso  verdadeiro 	 
 fim
fim 
LL – contiguidade física
Algoritmo: 
Inserir no Inicío de LL implementada sobre Arranjo 
LL – contiguidade física
Inserção como último nodo da LL 
LL não termina no final do arranjo
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
L6
5
8
Inserir
no final
LL – contiguidade física
Inserção como último nodo da LL 
LL não termina no final do arranjo
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
L6
5
8
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
L6
L7
5
8
Inserir
no final
Novo nodo
LL – contiguidade física
Inserção como último nodo da LL 
LL termina no final
do arranjo
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
L6
5
8
Inserir
no final
LL – contiguidade física
Inserção como último nodo da LL 
LL termina no final do arranjo
1
2
4
3
7
6
9
10
LL
L1
L2
L3
L4
L5
L6
5
8
1
2
4
3
7
6
9
10
LL
L1
L2
L3
L4
L5
L6
L7
5
8
IL
IA
FL
FA
Inserir
no final
IL
FL
IA
FA
Novo nodo
Algoritmo InserirFimLLArr 
 Entradas: LL (TipoLista)
 IA, FA, IL, FL (inteiro)
 InfoNodo (TipoNodo)
 Saídas: LL (TipoLista)
 IL, FL (inteiro)
 Sucesso (lógico)
 Variável auxiliar: Ind (inteiro)
início
 se (IA = IL) e (FA = FL)
 então Sucesso  falso 
 senão início			 
 se IL = 0 {LISTA VAZIA}
 então IL  FL  IA 
 senão se FL < FA {TEM ESPAÇO ATRÁS}
 então FL  FL+1
 senão início {DESLOCAR NODOS PARA BAIXO}
 para Ind de IL incr 1 até FL faça
 LL[Ind-1]  LL[Ind]
 IL  IL-1
 fim
 LL[FL]  InfoNodo 
 Sucesso  verdadeiro 	 
 fim
fim 
LL – contiguidade física
Algoritmo: 
Inserir no Fim de LL implementada sobre Arranjo 
LL – contiguidade física
Inserção no meio de LL 
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
5
8
Inserir
Posição: 3o nodo
LL – contiguidade física
Inserção no meio de LL 
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
L3
L4
L5
5
8
1
2
4
3
7
6
9
10
LL
L1
L2
L3
L4
L5
L6
5
8
IL
FL
IA
FA
Inserir
Posição: 3o nodo
Novo nodo
LL – contiguidade física
Algoritmo: 
Inserir em LL implementada sobre Arranjo na Posição K 
Posição K
 K = 1  no início da LL
 K = FL – IL + 2  no final da lista
Caso haja deslocamento
 para cima, caso haja espaço
 senão, para baixo
Sucesso retorna falso quando
 não existe espaço no arranjo para a inserção
 posição inválida para inserção na LL
LL – contiguidade física
Algoritmo: 
Inserir em LL implementada sobre Arranjo na Posição K 
Algoritmo InserirLLArrPosK 
 Entradas: LL (TipoLista)
 IA, FA, IL, FL (inteiro)
 K (inteiro)
 InfoNodo (TipoNodo)
 Saídas: LL (TipoLista)
 IL, FL (inteiro)
 Sucesso (lógico)
 Variável auxiliar: Ind (inteiro)
início
 se (IA = IL e FA = FL) ou (K > FL-IL+2) ou (K  0) ou (IL = 0 e K  1) 
 então Sucesso  falso 
 senão início			 
 se IL = 0
 então IL  FL  IA 
 senão se FL  FA 	
 então início {DESLOCAR NODOS PARA CIMA}
 para Ind de FL incr -1 até IL+K-1 faça
 LL[Ind+1]  LL[Ind]
 FL  FL+1
 fim
 senão início {DESLOCAR NODOS PARA BAIXO}
 para Ind de IL incr 1 até IL+K-2 faça
 LL[Ind-1]  LL[Ind]
 IL  IL - 1
 fim
 LL[IL+K-1]  InfoNodo 
 Sucesso  verdadeiro 	 
 fim
fim 
A posição não poderá ser maior do que o número de nodos da lista antes da inserção
 Otimizar: 
deslocar nodos da metade para o fim se a inserção for na
primeira metade da lista, e da metade para o início se for na segunda metade
 desde que haja espaço no lado considerado
40
20
90
80
70
 
0
1
3
4
2
6
5
7
 
8
 
9
K  3
K > 3
LL – contiguidade física
Algoritmo: 
Inserir em LL implementada sobre Arranjo na Posição K 
LL – contiguidade física
Remoção de um nodo 
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
 
L3
L4
L5
5
8
Remover
3o nodo
LL – contiguidade física
Remoção de um nodo 
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
 
L3
L4
L5
5
8
1
2
4
3
7
6
9
10
LL
L1
L2
 
L3
 
L4
5
8
IL
FL
IA
FA
Remover
3o nodo
Algoritmo RemoverKLLArr 
 Entradas: LL (TipoLista)
 IL, FL (inteiro)
 K (inteiro)
 Saídas: LL (TipoLista)
 IL, FL (inteiro)
 Sucesso (lógico)
 Variável auxiliar: Ind (inteiro)
início
 se (K  0) ou (K > FL-IL+1) 
 então Sucesso  falso
 senão início 
 para Ind de IL+K-1 incr 1 até FL-1 faça
 LL[Ind]  LL[Ind+1]
 FL  FL-1
 se FL = IL–1 
 então IL  FL  0 
 Sucesso  verdadeiro
 fim
fim 
LL – contiguidade física
Algoritmo: 
Remover nodo de ordem K de LL implementada sobre Arranjo
Acessar para 
Consulta a informações do nodo
Alteração de algum campo de informação do nodo
LL – contiguidade física
Acesso a um nodo 
LL – contiguidade física
Acesso a um nodo 
 O nodo a ser acessado pode ser identificado por
 sua ordem na lista Ex: 2º nodo
 através de seu conteúdo Ex: nodo de conteúdo “D”
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
L1
L2
 
L3
L4
L5
5
8
1
2
4
3
7
6
9
10
LL
IL
FL
IA
FA
A
B
 
C
D
E
5
8
LL – contiguidade física
Algoritmo AcessarKLLArr
 Entradas: LL (TipoLista)
 IL, FL (inteiro)
 K (inteiro)
 Saídas: InfoNodo (TipoNodo)
 Sucesso (lógico)
início
 se (K  0) ou (K > FL-IL+1) ou (IL = 0)
 então Sucesso  falso
 senão início
 InfoNodo  LL[IL+K-1]
 Sucesso  verdadeiro
 fim
fim 
Algoritmo: 
Acessar “k-ésimo” nodo da LL implementada sobre Arranjo
Algoritmo PosValLLArr 
 Entradas: LL (TipoLista)
 IL, FL (inteiro)
 ValBuscado (TipoValor)
 Saída: Posição(inteiro)
 Variáveis auxiliares: 
 I (inteiro)
 Achou (lógico)
início
 Achou  falso
 Posição  0
 I  IL
 enquanto (I  FL) e (não Achou)
 faça se LL[I].Valor = ValBuscado
 então início
 Posição  I
 Achou  verdadeiro
 fim
 senão I  I+1
fim 
TipoNodo = registro
 Valor: inteiro
 Info: TipoInfo
 fim registro 
LL – contiguidade física
Algoritmo: 
Fornece a posição na LL do nodo com um determinado Valor
LL – contiguidade física
Exercícios
Implementar as seguintes operações sobre Listas Lineares com contigüidade física:
 Criação
 Inserção
 Exclusão
 Busca
Utilize:
struct dados {
	int codigo;
	int idade;
}
int vet[10];	
*
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.

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?