Listas Lineares - foz.unioeste.br

Preview:

Citation preview

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Listas Lineares

Huei Diana LeeAna Paula Martins

Fabiana Frata Furlan Peres

Algoritmos e Estruturas de Dados

2007

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Conteúdo

Introdução

TAD Lista Linear

Implementação

Tipos de RepresentaçãoAlocação SeqüencialAlocação Encadeada

Referências

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Definição de Lista Linear

Uma Lista Linear é definida como umacoleção de dados de um mesmo tipo.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Uma Lista Linear pode ser...

I Seqüência de zero ou mais ítens x1, x2,..,xn,na qual xi é de um determinado tipo e nrepresenta o tamanho da lista linear;

I Sua principal propriedade estrutural envolveas posições relativas dos ítens em umadimensão:

I Assumindo n ≥ 1, x1 é o primeiro item da lista e xn é oúltimo item da lista;

I xi precede xi+1 para i = 1, 2.., n − 1;I xi sucede xi−1 para i = 2, 3, .., n;I o elemento xi é dito estar na i-ésima posição da lista.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Principais Operações

I Inserção;

I Eliminação;

I Busca (acesso).

As restrições sobre as operações determinamdiferentes tipos de listas:

I Pilhas;

I Filas;

I Filas Duplas entre outras.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Principais Operações

I Inserção;

I Eliminação;

I Busca (acesso).

As restrições sobre as operações determinamdiferentes tipos de listas:

I Pilhas;

I Filas;

I Filas Duplas entre outras.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Algumas aplicações...

I Manipulação simbólica;

I Gerência de memória;

I Simulação;

I Compiladores.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

TAD Lista Linear I

O conjunto de operações a ser definido depende de cadaaplicação.

Um conjunto de operações necessário a uma maioria deaplicações é:

1. Criar uma lista linear vazia;2. Inserir um novo item imediatamente após o i-ésimo

item;3. Retirar o i-ésimo item;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

TAD Lista Linear II4. Localizar o i-ésimo item para examinar e/ou alterar o

conteúdo de seus componentes;5. Combinar duas ou mais listas lineares em uma lista

única;6. Partir uma lista linear em duas ou mais listas;7. Fazer uma cópia da lista linear;8. Ordenar os ítens da lista em ordem ascendente ou

descendente, de acordo com alguns de seuscomponentes;

9. Pesquisar a ocorrência de um item com um valorparticular em algum componente.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Implementação I

I Várias estruturas de dados podem serusadas para representar listas lineares,cada uma com vantagens e desvantagensparticulares;

I As duas representações mais utilizadas sãoas implementações por meio de alocaçãoseqüencial (matrizes/arranjos) e dealocação encadeada (apontadores).

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Implementação IIExemplo de Conjunto de Operações:

1. FLVazia(Lista). Faz a lista ficar vazia;2. Insere(x, Lista). Insere x após o último item da lista;3. Retira(p, Lista, x). Retorna o item x que está na

posição p da lista, retirando-o da lista e deslocandoos itens a partir da posição p+1 para as posiçõesanteriores;

4. Vazia(Lista). Esta função retorna true se lista vazia;senão retorna false;

5. Imprime(Lista). Imprime os itens da lista na ordem deocorrência.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Alocação SeqüencialI Os itens da lista são armazenados em posições

contíguas de memória;

I A lista pode ser percorrida em qualquer direção;

I A inserção de um novo item pode ser realizada apóso último item com custo constante;

I A inserção de um novo item no meio da lista requerum deslocamento de todos os itens localizados apóso ponto de inserção;

I Retirar um item do início da lista requer umdeslocamento de itens para preencher o espaçodeixado vazio.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Alocação Seqüencial

...

xn

...

x2

x1

ItensPrimeiro = 1

2

Último−1

MaxTam

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Alocação Seqüencial

I Os ítens são armazenados em um array de tamanhosuficiente para armazenar a lista;

I O campo Último aponta para a posição seguinte a doúltimo elemento da lista;

I O i-ésimo item da lista está armazenado na i-ésimaposição do array, 1 ≤ i < Último;

I A constante MaxTam define o tamanho máximopermitido para a lista.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Operações 1

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 6

Estrutura da Lista Usando Arranjo

• Os itens são armazenados em um array detamanho suficiente para armazenar a lista.

• O campo Último aponta para a posiçãoseguinte a do último elemento da lista.

• O i-ésimo item da lista está armazenado nai-ésima posição do array, 1 ≤ i <Último.

• A constante MaxTam define o tamanhomáximo permitido para a lista.

const

InicioArranjo = 1;

MaxTam = 1000;

type

TipoChave = integer ;

Apontador = integer ;

TipoItem = record

Chave: TipoChave;

{ outros componentes }

end;

TipoLista = record

Item : array [ 1 . .MaxTam] of TipoItem;

Primeiro : Apontador;

Ultimo : Apontador

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Operações 2Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 7

Operações sobre Lista Usando Arranjo

procedure FLVazia (var Lista : TipoLista ) ;

begin

Lista .Primeiro := InicioArranjo ;

Lista .Ultimo := Lista .Primeiro ;

end;

function Vazia (var Lista : TipoLista ) : boolean;

begin

Vazia := Lista .Primeiro = Lista .Ultimo;

end;

procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;

begin

i f Lista .Ultimo > MaxTam

then writeln ( ’ Lista esta cheia ’ )

else begin

Lista . Item[ Lista .Ultimo ] := x;

Lista .Ultimo := Lista .Ultimo + 1;

end;

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Operações 3

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 7

Operações sobre Lista Usando Arranjo

procedure FLVazia (var Lista : TipoLista ) ;

begin

Lista .Primeiro := InicioArranjo ;

Lista .Ultimo := Lista .Primeiro ;

end;

function Vazia (var Lista : TipoLista ) : boolean;

begin

Vazia := Lista .Primeiro = Lista .Ultimo;

end;

procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;

begin

i f Lista .Ultimo > MaxTam

then writeln ( ’ Lista esta cheia ’ )

else begin

Lista . Item[ Lista .Ultimo ] := x;

Lista .Ultimo := Lista .Ultimo + 1;

end;

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Operações 4

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 7

Operações sobre Lista Usando Arranjo

procedure FLVazia (var Lista : TipoLista ) ;

begin

Lista .Primeiro := InicioArranjo ;

Lista .Ultimo := Lista .Primeiro ;

end;

function Vazia (var Lista : TipoLista ) : boolean;

begin

Vazia := Lista .Primeiro = Lista .Ultimo;

end;

procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;

begin

i f Lista .Ultimo > MaxTam

then writeln ( ’ Lista esta cheia ’ )

else begin

Lista . Item[ Lista .Ultimo ] := x;

Lista .Ultimo := Lista .Ultimo + 1;

end;

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Quiz...E para inserir um elemento na posição i , onde i ≤Último?

if Último < MaxTam...then begin..........for j := Último + 1 downto i + 1 do..............A[j] := A[j -1];..............A[i] := novovalor;..............Último := Último + 1;........end;...else impossível; Lista cheia

Qual o no de movimentos? Último + 1 - (i)

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Quiz...E para inserir um elemento na posição i , onde i ≤Último?

if Último < MaxTam...then begin..........for j := Último + 1 downto i + 1 do..............A[j] := A[j -1];..............A[i] := novovalor;..............Último := Último + 1;........end;...else impossível; Lista cheia

Qual o no de movimentos? Último + 1 - (i)

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Quiz...E para inserir um elemento na posição i , onde i ≤Último?

if Último < MaxTam...then begin..........for j := Último + 1 downto i + 1 do..............A[j] := A[j -1];..............A[i] := novovalor;..............Último := Último + 1;........end;...else impossível; Lista cheia

Qual o no de movimentos?

Último + 1 - (i)

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Quiz...E para inserir um elemento na posição i , onde i ≤Último?

if Último < MaxTam...then begin..........for j := Último + 1 downto i + 1 do..............A[j] := A[j -1];..............A[i] := novovalor;..............Último := Último + 1;........end;...else impossível; Lista cheia

Qual o no de movimentos? Último + 1 - (i)

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Operações 5

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 8

Operações sobre Lista Usando Arranjo

procedure Retira (p:Apontador ; var Lista : TipoLista ;

var Item:TipoItem) ;

var Aux: integer ;

begin

i f Vazia ( Lista ) or (p >= Lista .Ultimo)

then writeln ( ’Erro : Posicao nao existe ’ )

else begin

Item := Lista . Item[p] ;

Lista .Ultimo := Lista .Ultimo − 1;

for Aux := p to Lista .Ultimo − 1 do

Lista . Item[Aux] := Lista . Item[Aux+1];

end;

end;

procedure Imprime (var Lista : TipoLista ) ;

var Aux: integer ;

begin

for Aux := Lista .Primeiro to Lista .Ultimo − 1 do

writeln ( Lista . Item[Aux] .Chave) ;

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Quiz...

Qual o no de movimentos?

Último - p

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Quiz...

Qual o no de movimentos? Último - p

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Operações 6

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.1 8

Operações sobre Lista Usando Arranjo

procedure Retira (p:Apontador ; var Lista : TipoLista ;

var Item:TipoItem) ;

var Aux: integer ;

begin

i f Vazia ( Lista ) or (p >= Lista .Ultimo)

then writeln ( ’Erro : Posicao nao existe ’ )

else begin

Item := Lista . Item[p] ;

Lista .Ultimo := Lista .Ultimo − 1;

for Aux := p to Lista .Ultimo − 1 do

Lista . Item[Aux] := Lista . Item[Aux+1];

end;

end;

procedure Imprime (var Lista : TipoLista ) ;

var Aux: integer ;

begin

for Aux := Lista .Primeiro to Lista .Ultimo − 1 do

writeln ( Lista . Item[Aux] .Chave) ;

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Vantagens:

I acesso direto: qualquer elemento do arraypode ser acessado diretamente através deseu índice;

I tempo constante: o tempo de acesso dequalquer elemento do array, seja o primeiroou o último, é igual.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Desvantagens:I custo para inserir ou retirar itens da lista, que pode

causar um deslocamento de todos os itens, no piorcaso;

I em aplicações em que não existe previsão sobre ocrescimento da lista, a utilização de arranjos emlinguagens como o Pascal pode ser problemáticaporque neste caso o tamanho máximo da lista tem deser definido em tempo de compilação.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Desvantagens:I custo para inserir ou retirar itens da lista, que pode

causar um deslocamento de todos os itens, no piorcaso;

I em aplicações em que não existe previsão sobre ocrescimento da lista, a utilização de arranjos emlinguagens como o Pascal pode ser problemáticaporque neste caso o tamanho máximo da lista tem deser definido em tempo de compilação.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Quando usar representação seqüencial?

I Em listas pequenas;

I Quando o comportamento das listas éconhecido;

I Pouca ocorrência de inserções / eliminaçõesno meio da lista, onde os deslocamentostornam o processo ineficiente.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Quando usar representação seqüencial?

I Em listas pequenas;

I Quando o comportamento das listas éconhecido;

I Pouca ocorrência de inserções / eliminaçõesno meio da lista, onde os deslocamentostornam o processo ineficiente.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Quando usar representação seqüencial?

I Em listas pequenas;

I Quando o comportamento das listas éconhecido;

I Pouca ocorrência de inserções / eliminaçõesno meio da lista, onde os deslocamentostornam o processo ineficiente.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Seqüencial

Quando usar representação seqüencial?

I Em listas pequenas;

I Quando o comportamento das listas éconhecido;

I Pouca ocorrência de inserções / eliminaçõesno meio da lista, onde os deslocamentostornam o processo ineficiente.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Alocação Encadeada

I Cada item é encadeado com o seguintemediante uma variável do tipo Apontador;

I Permite utilizar posições não contíguas dememória;

I É possível inserir e retirar elementos semnecessidade de deslocar os itens seguintesda lista;

I Há uma célula cabeça para simplificar asoperações sobre a lista.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Alocação Encadeada

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 10

Implementação de Listas por meio deApontadores

• Cada item é encadeado com o seguintemediante uma variável do tipo Apontador.

• Permite utilizar posições não contíguas dememória.

• É possível inserir e retirar elementos semnecessidade de deslocar os itens seguintesda lista.

• Há uma célula cabeça para simplificar asoperações sobre a lista.

...Lista nilxnx1

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Estrutura da lista

I A lista é constituída de células;

I Cada célula contém um item da lista e umapontador para a célula seguinte;

I O registro TipoLista contém um apontadorpara a célula cabeça e um apontador para aúltima célula da lista.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Operações 1

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 11

Estrutura da Lista UsandoApontadores

• A lista é constituída de células.

• Cada célula contém um item da lista e umapontador para a célula seguinte.

• O registro TipoLista contém um apontadorpara a célula cabeça e um apontador para aúltima célula da lista.

type

Apontador = ^Celula ;

TipoItem = record

Chave: TipoChave;

{ outros componentes }

end;

Celula = record

Item : TipoItem;

Prox : Apontador;

end;

TipoLista = record

Primeiro : Apontador;

Ultimo : Apontador;

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Operações 2

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 12

Operações sobre Lista UsandoApontadores

procedure FLVazia (var Lista : TipoLista ) ;

begin

new ( Lista .Primeiro ) ;

Lista .Ultimo := Lista .Primeiro ;

Lista .Primeiro^.Prox := n i l ;

end;

function Vazia ( Lista : TipoLista ) : boolean;

begin

Vazia := Lista .Primeiro = Lista .Ultimo;

end;

procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;

begin

new( Lista .Ultimo^.Prox) ;

Lista .Ultimo := Lista .Ultimo^.Prox;

Lista .Ultimo^.Item := x;

Lista .Ultimo^.Prox := n i l

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Operações 3

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 12

Operações sobre Lista UsandoApontadores

procedure FLVazia (var Lista : TipoLista ) ;

begin

new ( Lista .Primeiro ) ;

Lista .Ultimo := Lista .Primeiro ;

Lista .Primeiro^.Prox := n i l ;

end;

function Vazia ( Lista : TipoLista ) : boolean;

begin

Vazia := Lista .Primeiro = Lista .Ultimo;

end;

procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;

begin

new( Lista .Ultimo^.Prox) ;

Lista .Ultimo := Lista .Ultimo^.Prox;

Lista .Ultimo^.Item := x;

Lista .Ultimo^.Prox := n i l

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Operações 4

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 12

Operações sobre Lista UsandoApontadores

procedure FLVazia (var Lista : TipoLista ) ;

begin

new ( Lista .Primeiro ) ;

Lista .Ultimo := Lista .Primeiro ;

Lista .Primeiro^.Prox := n i l ;

end;

function Vazia ( Lista : TipoLista ) : boolean;

begin

Vazia := Lista .Primeiro = Lista .Ultimo;

end;

procedure Insere (x : TipoItem ; var Lista : TipoLista ) ;

begin

new( Lista .Ultimo^.Prox) ;

Lista .Ultimo := Lista .Ultimo^.Prox;

Lista .Ultimo^.Item := x;

Lista .Ultimo^.Prox := n i l

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Operações 5

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 13

Operações sobre Lista UsandoApontadores

procedure Retira (p:Apontador ; var Lista : TipoLista ;

var Item:TipoItem) ;

{−−Obs. : o item a ser retirado e

o seguinte ao apontado por p −−}

var q: Apontador;

begin

i f Vazia ( Lista ) or (p = n i l ) or (p^.Prox = n i l )

then writeln ( ’Erro : Lista vazia ou posicao nao existe ’ )

else begin

q := p^.Prox ; Item := q^.Item ; p^.Prox := q^.Prox;

i f p^.Prox = n i l then Lista .Ultimo := p;

dispose (q) ;

end;

end;

procedure Imprime ( Lista : TipoLista ) ;

var Aux: Apontador;

begin

Aux := Lista .Primeiro^.Prox;

while Aux <> ni l do

begin

writeln (Aux^.Item.Chave) ; Aux := Aux^.Prox;

end;

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Operações 6

Projeto de Algoritmos – Cap.3 Estruturas de Dados Básicas – Seção 3.1.2 13

Operações sobre Lista UsandoApontadores

procedure Retira (p:Apontador ; var Lista : TipoLista ;

var Item:TipoItem) ;

{−−Obs. : o item a ser retirado e

o seguinte ao apontado por p −−}

var q: Apontador;

begin

i f Vazia ( Lista ) or (p = n i l ) or (p^.Prox = n i l )

then writeln ( ’Erro : Lista vazia ou posicao nao existe ’ )

else begin

q := p^.Prox ; Item := q^.Item ; p^.Prox := q^.Prox;

i f p^.Prox = n i l then Lista .Ultimo := p;

dispose (q) ;

end;

end;

procedure Imprime ( Lista : TipoLista ) ;

var Aux: Apontador;

begin

Aux := Lista .Primeiro^.Prox;

while Aux <> ni l do

begin

writeln (Aux^.Item.Chave) ; Aux := Aux^.Prox;

end;

end;

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Vantagens:I Permite inserir ou retirar itens do meio da lista a um

custo constante (importante quando a lista tem deser mantida em ordem);

I Elementos consecutivos na lista não implica emelementos consecutivos na representação (ordemlógica e não física);

I Bom para aplicações em que não existe previsãosobre o crescimento da lista (o tamanho máximo dalista não precisa ser definido a priori).

Desvantagem: utilização de memória extra paraarmazenar os apontadores.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Alocação Encadeada

Vantagens:I Permite inserir ou retirar itens do meio da lista a um

custo constante (importante quando a lista tem deser mantida em ordem);

I Elementos consecutivos na lista não implica emelementos consecutivos na representação (ordemlógica e não física);

I Bom para aplicações em que não existe previsãosobre o crescimento da lista (o tamanho máximo dalista não precisa ser definido a priori).

Desvantagem: utilização de memória extra paraarmazenar os apontadores.

Introdução TAD Lista Linear Implementação Tipos de Representação Referências

Knuth, D. E. (1997).The art of computer programming, volume 1 (3rd ed.):fundamental algorithms.Addison Wesley Longman Publishing Co., Inc., Redwood City,CA.

Lee, H. D. (2000).Notas didáticas.Algoritmos e Estruturas de Dados.

Ziviani, N. (2004).Projeto de Algoritmos.Thomson Learning, São Paulo, SP, 2 edition.

Recommended