Você está na página 1de 13

Listas lineares

Uma Lista Linear (LL) é uma seqüência de nodos

Listas lineares

São as estruturas de mais simples manipulação

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Lista linear Estrutura dos nodos


• Estrutura interna é abstraída
• Pode ter uma complexidade arbitrária
• Enfatizado o conjunto de relações existente
a b c d e
a b c d z

• Relação de ordem
INFORMAÇÕES
• Linear - seqüencial
Número RG Nome Nasc. Cargo
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares
Estrutura dos nodos Definição matemática
Uma lista linear é uma coleção de n ≥ 0 nodos
x[1], x[2], ... , x[n], cujas propriedades estruturais
relevantes envolvem apenas as posições relativas
lineares dos nodos:

n>0: x[1] é o primeiro nodo


x[n] é o último nodo

1 < k < n : x[k] é precedido por x[k-1]


e sucedido por x[k+1]

• n = 0 lista vazia
• Lista linear : seqüência de 0 ou mais nodos do mesmo tipo
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Exemplos de aplicações com listas Operações sobre listas lineares


• notas de alunos Criação de uma lista
Destruição de uma lista
• cadastro de funcionários de uma empresa Inserção de um nodo na i-ésima posição
• itens em estoque em uma empresa Exclusão do i-ésimo nodo
Acesso ao i-ésimo nodo
• dias da semana
Alteração do i-ésimo nodo
• vagões de um trem Combinação de duas ou mais listas
• letras de uma palavra Classificação da lista
Cópia da lista
• pessoas esperando ônibus
Determinar cardinalidade da lista
• cartas de baralho Localizar nodo através de info
• precipitações pluviométricas em um mês / dia Mais comuns ⇒ devem ser eficientes !
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares
Representação física de uma
lista linear
Representação física das relações existentes
entre os nodos e não aquelas internas a eles Listas lineares
• Contigüidade física Contigüidade física
• Encadeamento

Algoritmos para implementar


operações sobre LL
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Lista linear – TAD Genérico Lista linear – TAD Genérico


• Dados • Dados
– Tipo de dados para armazenar os elementos da lista
– ????
– Componentes para controle da estrutura lista
• Operações • Operações
– ????? – inicializa(): Cria lista
– insere(): Insere um nodo na k-ésima posição da lista
– remove(): Remove o k-ésimo nodo da lista
– consulta(): Consulta o k-ésimo nodo da lista
– altera(): Substitui o nodo na k-ésima posição da lista
por outro
– Destroi(): destrói a lista

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares


Lista linear – TAD Genérico Lista linear - Contigüidade física
• Dados
• Seqüencialidade da memória
– ????
• Endereços fisicamente adjacentes
• Operações nodos logicamente adjacentes
– ?????
Ex: suporte da lista é um arranjo de 1 dimensão
- todos elementos do arranjo de tipo igual
- cada elemento 1 nodo
- tipo do elemento - tipo do nodo

TipoLista = arranjo [1..n] de TipoNodo;


declaração
var LL : tipoLista;
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Lista linear - Contigüidade física Lista linear – TAD Genérico

Lista Lista = arranjo [1..n] de TipoNodo; • Dados


linear var minhaLista : Lista; – type Lista = array [1..n] of Info;

L1 L2 L3 L4 L5 L6 Ln • Operações
– ?????

1 2 3 4 5 6 n
LL

Arranjo

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares


Lista linear - Contigüidade física Lista linear - Contigüidade física

Início e final da lista diferentes do início e final do arranjo


Um mesmo arranjo pode ser utilizado para
mais de uma lista linear

Variáveis para identificar Início e Final da lista

1 2 3 4 5 k-1 k N-1 N
LL
IniL1 FimL1 IniL2 FimL2
L1 L2 L3 Lm-1 Lm

Início Fim
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Lista linear – TAD Genérico Operações sobre listas lineares


• Dados
em contigüidade física
– type Lista = array [1..n] of Info;
– início e final da lista
• criar lista
– tamanho do arranjo (ou início e final do arranjo) • inserir nodo
• Operações • remover nodo
– ????? Algoritmos
• alterar nodo
• ...

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares


Lista linear – TAD Genérico Lista linear – TAD Genérico
• Dados • Dados
– type Lista = array [1..n] of Info; – type Lista = array [1..n] of Info;
– início e final da lista – início e final da lista
– tamanho do arranjo (ou início e final do arranjo)
– tamanho do arranjo (ou início e final do arranjo)
• Operações • Operações
– inicializa(???): Cria lista – inicializa(???): Cria lista
– insere(???): Insere um nodo na k-ésima posição da lista – insere(???): Insere um nodo na k-ésima posição da lista
– remove(???): Remove o k-ésimo nodo da lista – remove(???): Remove o k-ésimo nodo da lista
– consulta(???): Consulta o k-ésimo nodo da lista
– consulta(???): Consulta o k-ésimo nodo da lista
– Destroi(???): destrói a lista
– Destroi(???): destrói a lista

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Criação de uma lista linear Ex: Lista de informações de produtos de uma empresa
implementada sobre um arranjo
TipoNodo = registro
• declarar o arranjo Nome: string;
Código: inteiro;
• inicializar variáveis que guardam início e final da lista Preço: real
fim registro;
TipoLista = arranjo [1 .. N] de TipoNodo
Arranjo X [ 1 .. N ] 1 2 3 4 5 N-1 N

Ini = Fim = 0
Proc InicializarLLArranjo (var IniLista,FimLista: inteiro);
Lista vazia início
IniLista := 0 ; FimLista := 0 ;
0 1 2 3 M fim InicializarLLArranjo;
Ini = Fim = -1

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares


Lista linear – TAD Genérico Lista linear – TAD Genérico
• Dados • Dados
– type Lista = array [1..n] of Info; – type Lista = array [1..n] of Info;
– início e final da lista – início e final da lista
– tamanho do arranjo (ou início e final do arranjo) – tamanho do arranjo (ou início e final do arranjo)
• Operações • Operações
– procedure inicializa (var ini, fim : integer); – procedure inicializa (var ini, fim : integer);
// inicializa com zeros o início e o fim da lista // inicializa com zeros o início e o fim da lista
– insere(???): Insere um nodo na k-ésima posição da lista – insere(???): Insere um nodo na k-ésima posição da lista
– remove(???): Remove o k-ésimo nodo da lista – remove(???): Remove o k-ésimo nodo da lista
– consulta(???): Consulta o k-ésimo nodo da lista – consulta(???): Consulta o k-ésimo nodo da lista
– Destroi(???): destrói a lista – Destroi(???): destrói a lista

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Acessar o “k-ésimo” nodo de uma lista Procedimento para consultar o “k-ésimo” nodo
1 2 3 4 5 k-1 k N-1 N

L1 L2 L3 Lm-1 Lm
1 2 3 4 5 k-1 k N-1 N

Lm-1 Lm Início K=3 Fim


L1 L2 L3

• Recebe k (ordem do nodo na lista)


Início K=3 Fim nome do arranjo LL
índices Ini,
Fim de controle da lista
• Devolve InfoNodo contido no campo de informação do nodo
Sucesso informando se teve sucesso no acesso
Consulta a informações do nodo
Acessar para • se o k-ésimo nodo faz parte da lista
Alteração de algum campo de informação do nodo pode ser o primeiro (índice Ini) ...
Testar: até o último (índice Fim - Ini + 1)
• se a lista não está vazia
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares
Lista linear – TAD Genérico Procedimento para consultar o “k-ésimo” nodo
1 2 3 4 5 k-1 k N-1 N

L1 L2 L3 Lm-1 Lm
• Dados
– type Lista = array [1..n] of Info;
Início K=3 Fim
– início e final da lista
– tamanho do arranjo (ou início e final do arranjo)
• Operações Proc ConsultarK (LL: TipoLista; K, Ini, Fim: inteiro;
– procedure inicializa (var ini, fim : integer); var Sucesso: lógico; var InfoNodo: TipoNodo);
// inicializa com zeros o início e o fim da lista início
– insere(???): Insere um nodo na k-ésima posição da lista se K < 0 { antes do primeiro nodo da lista }
– remove(???): Remove o k-ésimo nodo da lista ou K > Fim - Ini + 1 { depois do último nodo da lista }
– function consulta (x: Lista; ini, fim: integer; val:Info): integer; ou Ini = 0 { lista vazia }
// devolve a posição (o índice no arranjo) do nodo para o qual o campo então Sucesso := Falso
valor é igual ao valor buscado (val) senão início
– Destroi(???): destrói a lista Infonodo := LL [ Ini + K - 1];
Sucesso := Verdadeiro
fim
fim ConsultarK;
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Lista linear – TAD Genérico Inserir novo nodo em LL


• Dados
- contigüidade física
– type Lista = array [1..n] of Info;
– início e final da lista
– tamanho do arranjo (ou início e final do arranjo) 11 12 13 14 15 16 17 18 19 20 21 22 23
No início A
• Operações
– procedure inicializa (var ini, fim : integer);
// inicializa com zeros o início e o fim da lista 11 12 13 14 15 16 17 18 19 20 21 22 23
– insere(???): Insere um nodo na k-ésima posição da lista No final A
– remove(???): Remove o k-ésimo nodo da lista
– function consulta (x: Lista; ini, fim: integer; val:Info): integer;
// devolve a posição (o índice no arranjo) do nodo para o qual o campo 11 12 13 14 15 16 17 18 19 20 21 22 23
valor é igual ao valor buscado (val) No meio A
– Destroi(???): destrói a lista

Observar o preenchimento das estruturas...


Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares
Inserção de novo nodo na “k-ésima” posição Inserção de novo nodo na “k-ésima” posição
1 2 3 4 5 6 7 N-1 N • Inserir como primeiro nodo
1 2 3 4 5 6 7 8 N-1 N
L1 L2 L3 L4 L5

L1 L2 L3 L4 L5 L6

Início K=3 Fim


Início Fim Fim

K=1

1 2 3 4 5 6 7 8 N-1 N 5
1 2 3 4 6 7 8 N-1 N

L1 L2 L3 L4 L5 L6 • Ex: 33
70 70
40 40
20 20
90 90
80 80

Início Fim Fim


Início K=3 Fim

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Inserção de novo nodo na “k-ésima” posição


Inserção de novo nodo na “k-ésima” posição

• Inserir como último nodo • Inserir no meio da lista linear

1 2 3 4 5 6 7 8 N-1 N 5
1 2 3 4 6 7 8 N-1 N

L1 L2 L3 L4 L5 L6 L4 L5 L6
L1 L2 L3

Início Fim Fim Fim


Início Fim

K=6 K=3

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares


Inserção de novo nodo na “k-ésima” posição
Inserção de novo nodo na “k-ésima” posição 1 2 3 4
5
k-1 k N-1 N
L1 L2 L3 Lm-1 Lm

Ini K=3 Fim

• Ex: Inserir no meio da lista linear


Posição do novo
nodo na lista
1 2 3 4 5 6 7 8 N-1 N
Proc InserirPosK (var LL: TipoLista; N: inteiro; K: inteiro ;
77 33 44
55 99
44 88
99 88 InfoNodo: TipoNodo; var Ini, Fim: inteiro; var Sucesso: lógico);

Valor a ser inserido Se obteve sucesso


Início Fim Fim Analisar:
• lista vazia (Ini e Fim = 0), só se for K = 1 (primeiro da lista)
K=3
• Ini = 1 (início do arranjo) e Fim = N (final do arranjo) - não tem mais
espaço para inserir (insucesso)
• pode inserir como primeiro, no meio, ou logo após o último ( K )
• se Fim = N e tem espaço antes, deslocar nodos para frente
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Proc InserirPosK (var LL: TipoLista; N: inteiro; K: inteiro;


Lista linear – TAD Genérico Inserção de TipoNodo;
InfoNodo: novo nodo naFim:
var Ini, “k-ésima” posição
inteiro; var Sucesso:
lógico);
var Ind : inteiro;
• Dados início
se (Ini = 1 e Fim = N) { não tem mais espaço no arranjo }
– type Lista = array [1..n] of Info;
ou (K > Fim - Ini + 2) { posição de inserção inválida }
– início e final da lista
ou (K < 0) { idem }
– tamanho do arranjo (ou início e final do arranjo)
ou (Ini = 0 e K ≠ 1) { lista vazia, só pode ser primeiro nodo }
• Operações então Sucesso := falso { inserção não pode ser realizada }
– procedure inicializa (var ini, fim : integer); senão início { vai ser realizada a inserção }
// inicializa com zeros o início e o fim da lista se Ini = 0 { lista estava vazia }
– function insere (var x: Lista; k: integer ; val: Info; var ini, fim: então Ini := Fim := 1 { atualiza Ini e Fim }
integer): boolean; senão se Fim ≠ N { tem espaço no final }
// insere um nodo em uma lista, na posição K então início
– remove(???): Remove o k-ésimo nodo da lista para Ind de Fim incr -1 até Ini+K-1 faça LL[Ind+1] := LL[I];
– function consulta (x: Lista; ini, fim: integer; val:Info): integer; Fim := Fim+1;
// devolve a posição (o índice no arranjo) do nodo para o qual o campo fim
valor é igual ao valor buscado (val) senão início { deslocar nodos para baixo }
para Ind de Ini incr 1 até Ini+K-2 faça LL[Ind-1] := LL[Ind];
Ini:=Ini - 1;
fim;
LL [Ini+K-1] := InfoNodo; { insere nodo com Infonodo na
posição K }
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares
Sucesso := verdadeiro { inserção realizada com sucesso }
Proc InserirPosKOt
Inserção de novo(var LL: TipoLista;
nodo na k-ésima N: inteiro;
posição K: inteiro;
da LL
Inserção de novo nodo na “k-ésima” posição InfoNodo: TipoNodo; var Ini, Fim: inteiro; var Sucesso: lógico)
var Ind : inteiro;
início
Otimizar: se (Ini = 1 e Fim = N) ou (K > Fim - Ini + 2) ou (K < 0) ou (Ini = 0 e K ≠ 1)
então Sucesso := falso { inserção não pode ser realizada }
deslocar nodos da metade para baixo se a inserção for na senão início { vai ser realizada a inserção }
primeira metade da lista, e da metade para cima se for na se Ini = 0 { lista estava vazia }
segunda metade então Ini := Fim := N/2 { insere no meio, para otimização }
senão se Ini=1 ou ((Fim ≠ N) e (K > (Fim – Ini+1)/2))
então início { deslocar nodos para cima }
→ desde que haja espaço no lado considerado para Ind de Fim incr -1 até Ini+K-1 faça LL[Ind+1] := LL[Ind];
Fim := Fim+1;
fim
K≤3 K>3
senão início { deslocar nodos para baixo }
para Ind de Ini incr 1 até Ini+K-2 faça LL[Ind-1] := LL[Ind];
1 2 3 4 5 6 7 8 9 10
Ini:=Ini - 1;
70 40 20 90 80
fim;
LL[Ini+K-1] := InfoNodo; { insere nodo com InfoNodo }
Sucesso := verdadeiro; { inserção realizada com sucesso }
fim;
Início Fim fim InserirPosKOt;
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Remoção do k-ésimo nodo de uma LL


Lista linear – TAD Genérico Remover
K=3
Início Fim
• Dados
– type Lista = array [1..n] of Info;
1 2 3 4 5 6 7 N-1 N
– início e final da lista
– tamanho do arranjo (ou início e final do arranjo)
• Operações L1 L2 L3 L4 L5
– procedure inicializa (var ini, fim : integer);
// inicializa com zeros o início e o fim da lista
– function insere (var x: Lista; k: integer ; val: Info; var ini, fim:
integer): boolean;
// insere um nodo em uma lista, na posição K
– remove(???): Remove o k-ésimo nodo da lista 1 2 3 4 5 6 7 N-1 N
– function consulta (x: Lista; ini, fim: integer; val:Info): integer;
// devolve a posição (o índice no arranjo) do nodo para o qual o campo
valor é igual ao valor buscado (val) L1 L2 L3 L4
– Destroi(???): destrói a lista

Início Fim

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares


Remoção do k-ésimo nodo de uma LL
Lista linear – TAD Genérico
• Dados Proc RemoverK (var LL: TipoLista; K: inteiro;
– type Lista = array [1..n] of Info;
– início e final da lista
var Ini, Fim: inteiro; var Sucesso: lógico);
– tamanho do arranjo (ou início e final do arranjo) var Ind: inteiro;
• Operações início
– procedure inicializa (var ini, fim : integer); se K < 0 ou K > Fim - Ini + 1 { posição solicitada fora da lista }
// inicializa com zeros o início e o fim da lista
então Sucesso := falso
– function insere (var x: Lista; k: integer ; val: Info; var ini, fim: integer):
boolean; senão início { vai realizar a remoção }
// insere um nodo em uma lista, na posição K para Ind de Ini+K-1 incr 1 até Fim-1 faça
– function removeK(var x: Lista; k: integer; var ini, fim: integer): boolean;
// remove um nodo da posição K
LL [Ind] := LL [Ind+1]; { desloca o resto da lista }
– function consulta (x: Lista; ini, fim: integer; val:Info): integer; Fim := Fim - 1; { atualiza Fim }
// devolve a posição (o índice no arranjo) do nodo para o qual o campo valor é igual se Fim = Ini – 1 { lista ficou vazia }
ao valor buscado (val)
então Ini := Fim := 0;
Sucesso := Verdadeiro
fim
fim RemoverK;
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Otimização da remoção do k-ésimo Obtenção do valor e remoção


nodo nodos da metade para baixo se o nodo a ser
Deslocar do k-ésimo nodo de uma LL
removido estiver na primeira metade da lista, e da metade X1 X2 X3 X4 X5 Xk Xk+1 Xn-1 Xn
L1 L2 L3 Lm-1 Lm
para cima se estiver na segunda metade
Ini k Fim
→ desde que haja espaço no lado considerado
K≤3 K>3 Proc ObterERemover (var LL: TipoLista; K: inteiro; var Ini, Fim: inteiro;
Remover K=2 var Sucesso: lógico; var InfoNodo: TipoNodo);
var Ind: inteiro;
1 2 3 4 5 6 7 8 9 10 se K < 0 ou K > Fim - Ini + 1 { testa se ordem K está na lista}
então Sucesso := Falso
70 40 20 90 80 23
senão início
InfoNodo := LL [Ini+K-1]; { obtém o valor }
Início Fim para Ind de Ini+K-1 incr 1 até Fim-1 faça
LL [Ind] := LL [Ind+1]; { desloca os seguintes }
1 2 3 4 5 6 7 8 9 10 Fim := Fim - 1; { atualiza Fim }
se Fim = Ini - 1
70 20 90 80 23 então Ini := Fim := 0; { lista vazia }
Sucesso := Verdadeiro
fim ObterERemover
Início Fim
Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares
Lista linear – TAD Genérico Lista linear – TAD Genérico
• Dados • Dados
– type Lista = array [1..n] of Info; – type Lista = array [1..n] of Info;
– início e final da lista – início e final da lista
– tamanho do arranjo (ou início e final do arranjo)
– tamanho do arranjo (ou início e final do arranjo)
• Operações
• Operações – procedure inicializa (var ini, fim : integer);
– procedure inicializa (var ini, fim : integer); // inicializa com zeros o início e o fim da lista
// inicializa com zeros o início e o fim da lista – function insere (var x: Lista; k: integer ; val: Info; var ini, fim: integer): boolean;
– function insere (var x: Lista; k: integer ; val: Info; var ini, fim: integer): // insere um nodo em uma lista, na posição K
boolean; – function removeK(var x: Lista; k: integer; var ini, fim: integer): boolean;
// insere um nodo em uma lista, na posição K // remove um nodo da posição K
– function removeK(var x: Lista; k: integer; var ini, fim: integer): boolean; – function removeVal(var x: Lista; val: info; var ini, fim: integer):
// remove um nodo da posição K boolean;
– function consulta (x: Lista; ini, fim: integer; val:Info): integer; // remove um nodo cujo valor é val
// devolve a posição (o índice no arranjo) do nodo para o qual o campo valor é igual – function consulta (x: Lista; ini, fim: integer; val:Info): integer;
ao valor buscado (val) // devolve a posição (o índice no arranjo) do nodo para o qual o campo valor é igual ao valor
buscado (val)

Estruturas de Dados - Listas Lineares Estruturas de Dados - Listas Lineares

Você também pode gostar