Professional Documents
Culture Documents
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
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.
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
Inser Insero
No meio
mel mamo farinha cebola
Inser Insero
No fim
mel 0
mel 0
mel 0
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
Remo Remoo
No meio
mamo farinha cebola
Remo Remoo
No in incio
inicio carne ovos
mamo
farinha
cebola
inicio
carne
ovos
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;
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
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.
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.
Remo Remoo
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.
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