Você está na página 1de 8

Definio - Lista Listas Estticas

Aula 2 Defini Definio da ED #define MAX 100 typedef struct { int A[MAX]; int n; //n: 0..MAX; }lista; lista L;

Opera Operaes

Opera Operaes
2) Atualiza Atualizao L.A[i]:= 'Valor' 3) Tamanho da Lista Begin tamanho:=L.n; End;

Opera Operaes simples utilizando Lista Est Esttica Seq Seqencial a serem definidas nas Units 1) Acesso a um elemento Writeln (L.A[i]);

Opera Operaes
4) Inser Insero de um elemento na posi posio i Requer o deslocamento direita dos elementos a(i+1)...a(n) Begin For j:=L.n+1 downto i+1 do lista.A[j]:=L.A[jlista.A[j]:=L.A[j-1]; L.A[i]:='novo valor'; L.n:=L.n+1; End;

Opera Operaes
5) Remo Remoo do i-simo elemento Requer o deslocamento esquerda dos elementos a(i+1)...a(n) Begin For j:=i to L.nL.n-1 do L.A[j]:=L.A[j+1]; L.n:=L.nL.n:=L.n-1; End;

Busca
1) Listas seq seqenciais no ordenadas Seja L uma lista linear no ordenada alocada seq seqencialmente Var L: arrray [1..n] of record chave: T1; info: info: T2; End;

A fun funo busca1 abaixo busca um registro contendo a chave x na lista L, e retorna o ndice do registro se encontrado, caso contr contrrio retorna zero Function busca1(x); Var i: 1..Max; Begin i := 1; busca1 := 0; {elemento no encontrado} While i <= Nelem do If L[i].chave = x then Begin busca1 := i; i := Nelem + 1; {termina loop} End Else i := i+1; End;

Busca

Busca
Em busca1( ), para cada elemento dois testes so realizados i <= Nelem L[i].chave = x. Esse processo pode ser melhorado com o uso do seguinte artif artifcio: criado um novo registro no final da lista, chamado de sentinela, que cont contm a chave procurada. A busca realizada sabendosabendo-se que um registro contendo a chave vai ser encontrado. Ao final verifica se o registro encontrado o sentinela. Deste modo o teste duplo para cada elemento evitado. A lista L, neste caso, deve poder conter um registro extra.

Busca
Function busca(x) Var i: 1..Max; Begin L[Nelem +1].chave := x; {insere elemento sentinela} L[Nelem+1].chave i := 1; While (L[i].chave <> x) do i := i+1; {checa se encontrado o sentinela} If (i = Nelem + 1) Then busca := 0; Else busca := i; End;

Busca
2) Listas seq seqenciais ordenadas No caso de listas ordenadas, devedeve-se aproveitar o fato de que nem sempre necess necessrio percorrer a lista toda para concluirmos que elemento no est est na lista. A verso do algoritmo de busca com sentinela para listas ordenadas ordenadas : Function busca_ord(x) busca_ord(x) Var i: 1..Max; Begin L[Nelem +1] .chave := x; {insere elemento sentinela} L[Nelem+1] i := 1; While (L[i].chave < x) do {compara{compara-se apenas os menores} i := i+1; If (i = Nelem + 1) or i(L[i].chave <> x) Then busca := 0 Else busca := i; End;

Busca
O fato de se utilizar o recurso da sentinela na busca seq seqencial, acima, elimina a necessidade de testar, para cada elemento, se o final da lista alcan alcanado ou no. No caso de listas ordenadas, podepode-se apresentar um algoritmo BEM mais eficiente - o qual tira MUITO MAIS proveito do fato da lista estar ordenada! O algoritmo de busca bin binria tem como id idia b bsica o fato de que, dada uma posi posio dentro da lista, o elemento procurado vai estar ou antes ou depois desta posi posio, e, portanto, no se precisa procurar dos dois lados. Numa dada lista ordenada:
ComparaCompara-se o elemento procurado com o registro do meio da lista, para saber se o elemento estaria na metade superior ou inferior da lista. RepeteRepete-se esse processo at at encontrar o elemento ou esgotar a lista.

Function busca_bin(x) busca_bin(x) Var inf, inf, sup, sup, meio: ndices; Begin inf := 1; sup := n; busca_bin := 0; While inf <= sup do Begin meio := [(inf [(inf + sup) sup) div 2]; If L[meio].chave = x then Begin busca_bin := meio; inf := sup + 1; End Else If (L[meio].chave < x) Then inf := meio + 1 Else sup := meio -1; End; End;

Busca

Lista Esttica Encadeada

Lista Est Esttica Encadeada


Brincadeira do Presente
Carto -> camacama-> gavetagaveta->fogo>fogo->tapete>tapete->geladeira>geladeira>mesa>mesa->presente.

Defini Definio
Lista encadeada se define por um conjunto de elementos individualizados em que cada um referencia um outro elemento distinto como sucessor.

DeveDeve-se notar:
FazFaz-se necess necessrio ponto de partida Cada um destes locais que possui uma indica indicao para um pr prximo local composi composio de informa informao (local + pr prximo)independente, visto que se sua posi posio fosse alterada o encadeamento l lgico permaneceria intacto.

Lista Est Esttica Encadeada


Lista de compras
Lista de Compras 1. Tomate 2. Cebola 3. Carne 4. Farinha 5. Batata 6. Ovos 7. Mamo Lista de Compras Incio: 3 Item 1. Tomate prox 7 Fim 6 2 1 5 4

Declara Declarao
Exemplo da lista de compras tipo REG= registro Item: caractere; Prox: Prox: inteiro; fim_registro tipo VET = vetor [1..100] de REG; Lista: VET; Inicio: inteiro; Inicio <<- 3;

Conceito de Individualidade

2. Cebola 3. Carne 4. Farinha 5. Batata 6. Ovos 7. Mamo

Inser Insero
No meio
mel mamo farinha cebola

Inser Insero
No fim
mel 0

mel mamo farinha cebola

mel 0

mel mamo farinha cebola

mel 0

Primeiro passo: Lista[8].Prox<-Lista[7].Prox; Segundo passo: Lista[7].Prox<-8;

Primeiro passo: Lista[8].Prox<-Lista[2].Prox; Segundo passo: Lista[2].Prox<-8;

Inser Insero
No in incio
mel inicio carne

Inser Insero
Modulo INSERE(inteiro: Novo, antecessor) Lista[Novo].Prox <-Antecessor; Lista[Novo].Prox< Antecessor<Antecessor<-Novo; Fim_Modulo

mel inicio carne

mel inicio carne

Primeiro passo: Lista[8].Prox<-inicio; Segundo passo: inicio.Prox<-8;

Remo Remoo
No meio
mamo farinha cebola

Remo Remoo
No in incio
inicio carne ovos

mamo

farinha

cebola

inicio

carne

ovos

Primeiro passo: Lista[7].Prox<-Lista[4].Prox;

Primeiro passo: Inicio<-Lista[3].Prox;

Remo Remoo
No fim
farinha cebola fim

Remo Remoo
Modulo Remove (inteiro: Velho, Antecessor) Antecessor<; Antecessor<-Lista[Velho].prox Lista[Velho].prox; Fim_Modulo;

farinha

cebola

fim

Primeiro passo:Lista[4].Prox<-Lista[2].Prox;

Lista Est Esttica Encadeada


Os elementos da lista so registros com um dos componentes destinado a guardar o endere endereo do registro sucessor. Ex: L = anta, cabra, macaco, pato, rato

Implementa Implementao
H duas alternativas para implementa implementao de opera operaes de listas encadeadas: utilizando arrays ou vari variveis dinmicas. Encadeamento em arrays

Cada registro : ou

Eliminando o elemento "cobra" tem-se:

O registro 2 tornou-se disponvel para as prximas inseres...

Implementa Implementao
Implementa Implementao utilizando array
Ap Aps sucessivas inser inseres e elimina eliminaes como descobrir quais registros esto dispon disponveis? Junt Junt-los numa lista DISPO. Assim, os registros 6, 7, ... m estariam inicialmente na lista DISPO. Como dever dever ser Dispo ? Seq Seqencial? Ela deve ser capaz de anexar os registros eliminados da lista principal L. Suponha que queremos inserir algum elemento.

Implementa Implementao
No exemplo dado, ao eliminar "cobra" anexamos esse registro dispo. A princ princpio podemos utilizar qualquer posi posio (todos so vazios mesmos!!). A posi posio mais conveniente a do primeiro elemento do Dispo - uma vez que requer o acesso a poucos ponteiros.

Isso implica que :

a elimina eliminao de um elemento da lista principal causa a inser insero de um registro na lista Dispo a inser insero de um elemento na lista principal causa a utiliza utilizao de um dos registros da Dispo

Implementa Implementao
Se a pr prxima opera operao a inser insero do elemento ovelha temos:

Vantagens/Desvantagens
Vantagens:
no h h movimentos durante inser insero e remo remoo de elementos da lista; apenas ponteiros so alterados.

Desvantagens:
Acesso ao i-simo elemento deixa de ser direto; Requer acesso aos ii-1 elementos anteriores; Ainda exige previso de espa espao; (*) Requer gerenciamento da lista Dispo (*) Alternativa da Implementa Implementao Dinmica: elimina desvantagens (*)

Com v vrias inser inseres e elimina eliminaes, os registros da lista principal ficariam espalhados pelo vetor, intermediados por registros dispon disponveis.

Vantagens/Desvantagens
Quando usar:
quando for poss possvel fazer uma boa previso do espa espao utilizado (lista principal + Dispo) e quando o ganho dos movimentos sobre a perda do acesso direto a cada elemento for compensador.

Algoritmos de inser insero e elimina eliminao


Os algoritmos requerem a mudan mudana de v vrios ponteiros: do antecessor do registro na lista, do ponteiro da lista Dispo, e do registro a ser inserido/eliminado. Temos ObterNo(j) ObterNo(j) e DevolverNo(j), DevolverNo(j), as quais permitem obter um registro de ndice j da Dispo, ou devolver o registro de ndice j, respectivamente.

Algoritmos de inser insero e elimina eliminao


Na inser insero podemos contar com o registro j como sendo dispon disponvel, e na elimina eliminao podemos contar com o registro j como a ser deixado dispon disponvel. Para inserir ou eliminar um elemento da lista, temos que saber do endere endereo do predecessor (lembre que a busca guiada pelo conte contedo do registro, no caso de listas ordenadas).
Este predecessor quem cont contm o endere endereo daquele que ser ser o sucessor do elemento inserido/eliminado.

Algoritmos de inser insero e elimina eliminao


Inser Insero

Remo Remoo

1) Inser Insero ap aps o registro de endere endereo k


Procedure Insere(var L: Lista; k: endereco, endereco, valor: T); Var j: endereco; endereco; Begin If L.Dispo <> 0 Then {se a Dispo est est vazia, nao pode inserir!} Begin ObterNo(j); ObterNo(j); L.A[j].info L.A[j].info := valor; L.A[j].lig ; L.A[j].lig := L.A[k].lig L.A[k].lig; L.A[k].lig L.A[k].lig := j; End Else {no pode inserir registro} ... End;

2) Elimina Eliminao do registro de endere endereo j precedido por k


Procedure Remover(var L: Lista; Lista; k,j: endereco); endereco); Begin L.A[k].lig := L.A[j].lig; L.A[j].lig; DevolverNo(j); DevolverNo(j); End;

Casos Especiais
Antes do primeiro
Procedure Insere_prim(var L: Lista; Lista; valor: T); Var j: endereco; endereco; Begin If L.Dispo <> 0 Then Begin ObterNo(j); ObterNo(j); L.A[j].info := valor; L.A[j].info:= L.A[j].lig L.A[j].lig := L.Prim; L.Prim L.Prim := j; End Else { no pode inserir } End; OBS: No caso da lista estar vazia, Prim passar a apontar o nico elemento da lista.

Inser Insero em lista vazia


Procedure Insere_ListaVazia(var Insere_ListaVazia(var L: Lista; valor: T); Var j: endereco; endereco; Begin If L.Dispo <> 0 Then { lista vazia ou prim = 0 } Begin Obter_No(j); L.A[j].info :=valor; L.A[j].info:=valor; L.A[j].lig :=0; {null } L.A[j].lig:=0; {null} L.Prim:=j; End; End;

Elimina Eliminao do primeiro elemento


Procedure Remove_Primeiro(var L: Lista); Var j: endereco; endereco; Begin j := L.Prim; L.Prim L.Prim := L.A[L.Prim].lig; L.A[L.Prim].lig; DevolverNo(j); DevolverNo(j); End;

Inicializa Inicializao
Inicialmente todas as posi posies do vetor A esto dispon disponveis, portanto fazem parte de "Dispo". Procedure Init(L: Lista); Lista); Begin L.Dispo:=1; {primeiro elemento} L.Prim:=0; {lista principal L.Prim:=0; est est vazia} For i:=1 to nn-1 do L.A[i].lig :=i+1; L.A[i].lig:=i+1; L.A[n].lig :=0; {receber 0 L.A[n].lig:=0; corresponde ao nil} nil} End;

Obter No
Obter_No(j): obt obtm um registro de ndice j da Dispo. Dispo cont contm pelo menos nil. nil. Procedure Obter_No(var j: endereco); endereco); Begin j:= L.Dispo; { A dispo passa a apontar para quem ela apontava } L.Dispo:= L.A[L.Dispo].lig ; L.A[L.Dispo].lig; End; OBS: A procedure Obter_No oferece uma "caixa vazia", devemos portanto, determinar os campos do registro.

Devolver No
Devolver_No(j): devolve um registro de ndice j Dispo. Procedure Devolver_No(j:endereco ); Devolver_No(j:endereco); Begin L.A[j].lig L.A[j].lig := L.Dispo; L.Dispo := j; End; OBS: Dispo est est vazia quando a lista est est cheia Dispo est est cheia quando a lista est est vazia

Exerc Exerccios
Escreva os seguintes algoritmos que implementem Listas Encadeadas Est Estticas (em array) array) com sentinela:
cria criao de lista; busca em lista ordenada e no ordenada; inser insero e elimina eliminao de elementos.

Exerc Exerccios
Dada uma lista de nomes em ordem alfab alfabtica, isto , um vetor desordenado de nomes, e cujo encadeamento segue a ordem alfab alfabtica, construa um algoritmo que, sem alterar o encadeamento alfab alfabtico, fa faa:
A impresso da rela relao de nomes da lista (em ordem alfab alfabtica; A incluso de um novo nome; A localiza localizao e a excluso de um nome fornecido; A altera alterao de um nome fornecido.

Exerc Exerccios
Escreva um algoritmo que percorra uma lista (na qual consta o campo de sexo) armazenada de forma encadeada (est (esttica), e crie duas outras listas (tamb (tambm est estticas). O crit critrio de quebra ser ser o seguinte: em uma ficaro os elementos do sexo feminino e na outra os elementos do sexo masculino. Material gentilmente emprestado pelo professor Edmundo Spoto

Você também pode gostar