Estruturas de memorias
Transcript of Estruturas de memorias
-
8/8/2019 Estruturas de memorias
1/25
7. ESTRUTURAS DE DADOS ESTTICAS E DINMICAS
At .....
7.1 Alocao Esttica
Alocao de Espao em Memria
Como j foi visto anteriormente, a memria de um computador compe-se de umasequncia de palavras, ou bytes, endereada. Nesta memria so colocados todos osprogramas executados pelo computador.
Os programas so compostos por cdigo (instrues) e dados (variveis). Estesprogramas so carregados na memria quando forem chamados para execuo e so
retirados da memria quando for finalizada a sua execuo. Assim, em determinadomomento, a memria est com partes ocupadas e livres.
A utilizao da memria controlada pelo Sistema Operacional. O SistemaOperacional mantm uma tabela que informa quais partes da memria esto livres(memria disponvel) e quais partes da memria esto ocupadas (memria ocupada).
Toda vez que um programa for executado, o Sistema Operacional aloca (reserva), damemria disponvel, o espao suficiente para as variveis deste programa. Esta memriapassa a ser ocupada e no ser mais alocada para outras variveis, at que o programatermine. Desta forma, as memrias disponvel e ocupada crescem e diminuem a medida que
diferentes programas so executados.
Existem 2 (dois) tipos de variveis: esttica e dinmica. Veremos aqui somente asvariveis estticas, pois as variveis dinmicas sero objetos de estudo posterior.
As variveis estticas so alocadas antes que o programa entre em execuo. Oprograma solicita ao Sistema Operacional que aloque espao da memria disponvel paraas variveis estticas. Ento, o Sistema Operacional retira da memria disponvel o espaonecessrio para as variveis e coloca na memria ocupada.
IMPORTANTE!!! As variveis geralmente so alocadas na mesma ordem em que
elas aparecem na declarao.
O Sistema Operacional garante que o espao de memria utilizado por uma Varesttica jamais poder ser utilizado por uma outra. Esta garantia no dada s variveisdinmicas, como veremos.
Para cada Var ser alocada uma quantidade de espao diferente, dependendo do tipoda Var e da linguagem de programao utilizada. A seguir descreveremos o tamanho dememria utilizada pelas variveis de tipos comumente conhecidos.
-
8/8/2019 Estruturas de memorias
2/25
tipo Integer = 2 bytestipo Real = 6 bytes
tipo String [n]= n bytestipo Char = 1 bytetipo Boolean = 1 bytetipo Record = somatria dos tamanhos dos campos
ex: Recordnome: String [30] ;idade: Integer ;sexo: Char ;salrio: Real ;
End;
somatria = 30 + 1 + 1 + 6 = 38 bytes
A memria alocada para uma varivel vetorial depende da quantidade de campos edo tipo do campo. Alguns exemplos podem ser dados:
V: Array[1..100] of Real ; total de memria = 100*6 = 600 bytesA: Array[1..20,1..50] of Integer ; total de memria = 20*50*2 = 2000 bytes 2KbytesNomes: Array[1..2000] of Record total = 2000*38 = 76000 bytes 76Kbytes
nome: String [30] ;
idade: Integer ;sexo: Char ;salrio: Real ;
End;
Exerccio: Faa um mapa de memria para as variveis declaradas abaixo. Suponha que amemria disponvel seja contnua a partir da posio 100.
Var a, b: Integer ;x, y: Real ;nomes:String [10] ;
cadastro : Recordcdigo: Real ;tipo: String [11] ;
End;
-
8/8/2019 Estruturas de memorias
3/25
Memriaa 100b 102
104x
110
y116
nomes
126cdigo
cadastro
tipo
143
Variveis Dinmicas (Ponteiros)
Ponteiros so variveis que apontam para dados na memria, ou seja, contm oendereo inicial de uma regio da memria que pode armazenar um dado. O tamanho destaregio depende do tipo do dado apontado pelo ponteiro.
A varivel ponteiro, ou simplesmente ponteiro, pode ter 2 ou mais bytes detamanho, suficiente para armazenar um endereo de memria. Em nossos estudos,utilizaremos ponteiros de 2 bytes. Sua representao pode ser vista na figura abaixo, onde representado 2 ponteiros: P1 e P2.
-
8/8/2019 Estruturas de memorias
4/25
Trecho de Memria
P1 110 110
111112113114115116
P2 117 117: : :
140141142
O ponteiro P1, contm o valor 110, indicando que ele est apontando para umaregio de memria com 4 bytes de tamanho, a partir da posio 110. J o ponteiro P2contm o valor 117, indicando que ele est apontando para uma regio da memria com26 bytes de tamanho, a partir da posio 117.
A declarao destas variveis deve ser feita da seguinte forma:
var : ^ ;
Exemplo:
var nomes : ^ string[20] ; (* ponteiro para literal de 20 bytes *)fichas : ^record (* ponteiro para registros de 22 bytes *)
nome: string[20] ;idade: integer ;
end;
O smbolo ^ chamado de ponteiro (tambm chap). Assim, na declarao devariveis dinmicas dizemos que declaramos um ponteiro para algo, onde o nomeutilizado na declarao indica o nome do ponteiro.
No exemplo acima, a varivel nomes um ponteiro que poder apontar para
uma informao (literal) de 20 bytes de tamanho. Ja a varivel fichas um ponteiro quepoder apontar para uma informao (registro) de 22 bytes de tamanho.
A declarao de ponteiros, por s s, NO ALOCA ESPAO DE MEMRIA para osdados que eles apontam. A alocao destes espaos deve ser feita em tempo de execuo ede forma explcita, ou seja, atravs dos comandos New e Dispose. O nico espao alocadopelo Sistema Operacional, durante a declarao de ponteiros, o espao ocupado por elesprprios (2 bytes para cada um).
-
8/8/2019 Estruturas de memorias
5/25
Aps a utilizao do comando New, ser reservado um espao de memria detamanho suficiente para acomodar dados do tipo definido na declarao do ponteiro. Onome do ponteiro conter o endereo inicial da memria alocada.
Sempre que no for mais necessrio o espao alocado para uma varivel dinmica, omesmo deve ser liberado atravs do comando Dispose, para que possa ser utilizado poroutras variveis dinmicas.
Exemplo: Utilizando a declarao feita anteriormente, poderamos ter os seguintescomandos:
:new (nomes) ;new (fichas) ;
: :(* usa as variveis *)
: :dispose (nomes) ;dispose (fichas);
:
No exemplo acima, o comando new (nomes) far com que o Sistema Operacionalreserve uma regio da memria que estava disponvel para armazenar um literal de 20bytes. O endereo inicial desta regio ser retornado para o ponteiro nomes. J ocomando dispose (nomes) far com que a regio da memria apontada pelo ponteiro
nomes seja colocada novamente a disposio pelo Sistema Operacional.
IMPORTANTE!!! A manipulao das variveis dinmicas dever ser feitasomente aps as mesmas terem sido alocadas. A no observao desta condio poderimplicar no uso de espao de memria que j est sendo utilizado por outras variveis.
Aps a alocao de espao de memria para um ponteiro, deveremos manipular osdados por ele apontado utilizando o smbolo ^ agregado ao nome do ponteiro. De acordocom a declarao anterior, a manipulao das variveis dinmicas aps a sua criaopoderia ser:
:read (nomes ^);write (nomes^) ;fichas^. nome := nomes^ ;read (fichas . Idade) ;write (fichas ^. Idade) ;
:
-
8/8/2019 Estruturas de memorias
6/25
IMPORTANTE!!! O uso somente do nome do ponteiro implica na manipulaoapenas de um endereo de memria e no dos dados armazenados.
IMPORTANTE!!! O uso mal elaborado de ponteiros pode acarretar espao dememria perdido.
Perguntas :
1) Qual o valor de um ponteiro que foi somente declarado?
2) O que acontece se utilizarmos um ponteiro que foi somente declarado?
3) O que acontece quando um ponteiro recebe outro ponteiro?
4) Quando temos dois ponteiros para a mesma posio da memria, o que acontecequando liberamos um deles?
5) O que significa a posio de memria chamada Nil (Terra) ?
Estruturas de Dados Avanadas
Entre as principais estruturas de dados avanadas temos: pilhas, filas, listas ervores. Estas estruturas armazenam dados e so manipuladas por funes bsicas do tipo:
cria, insere, elimina, consulta e altera.
Estas estruturas podem ser implementadas tanto da forma esttica quanto da formadinmica. Implementaremos somente as estruturas que devem ser declaradas, bem como osprocedimentos e funes de manipulao. O algoritmo de utilizao das estruturas,procedimentos e funes ficar para desenvolvimento posterior.
Pilha:
Uma pilha pode ser vista como um local onde pode ser inserido dados um sobre ooutro, inserindo sempre sobre o ltimo da pilha (topo da pilha). Para retirarmos os dados,
devemos tambm respeitar a ordem pelo qual eles foram inseridos, ou seja, retirandosomente o ltimo elemento do topo. Este tipo de estrutura tambm conhecida como LIFO (Last In First Out = ltimo a Entrar o Primeiro a Sair) ou FILO (First In Last Out= Primeiro a Entrar o ltimo a Sair).
As estruturas de pilha so comumente usadas em algoritmos de gerenciamento dememria (escopo de variveis e retorno de procedimentos), compiladores e em outrasaplicaes que sero vistas em disciplinas futuras.
-
8/8/2019 Estruturas de memorias
7/25
Quando uma pilha criada, no existe nenhum elemento inserido e dizemos que elaest vazia. A figura abaixo mostra algumas situaes em que uma pilha pode estar.
pilha C pilhavazia in in B in B out B out out vazia
A A A A A
Implementao Esttica:
Usamos uma estrutura vetorial para representar a pilha. Como a declarao de umvetor requer um tamanho mximo da estrutura, no podemos inserir elementos quando aestrutura j estiver cheia. Usamos uma varivel topo para indicar a posio do ltimoelemento.
Const max_pilha = 100 ;Type tipo_dado = Integer ;
tipo_pilha = Recordpilha: array[1..max_pilha] oftipo_dado ;topo: Integer ;
End ;
Procedure Cria_Pilha(var p : tipo_pilha);begin
p.topo := 0 ;end ;
Function Pilha_Cheia(p: tipo_pilha): boolean ;begin
Pilha_Cheia := (p.topo = max_pilha) ;end;
Function Pilha_Vazia (p: tipo_pilha) : boolean;begin
Pilha_Vazia := (p.topo = 0) ;end ;
Function Empilha(var p: tipo_pilha ; x: tipo_dado): boolean ;begin
if Pilha_Cheia(p)then Empilha :=false
-
8/8/2019 Estruturas de memorias
8/25
ElsebeginEmpilha :=True;Inc (p.topo);
p.pilha[p.topo] := x ;end;
end ;
Function Desempilha(var p: tipo_pilha ;var x : tipo_dado): Boolean ;Begin
IfVazia(p)Then Desempilha :=falseElsebegin
Desempilha :=True;x := p.pilha[p.topo];
dec (p.topo);end;end ;
Function Topo(p: tipo_pilha): tipo_dado ;begin
Topo := p.pilha[p.topo] ;end ;
Implementao Dinmica:
Para implementarmos esta estrutura usando ponteiros, devemos estabelecer ummdulo bsico que possa ser alocado a cada nova insero, e que permita a formao dapilha de elementos em tempo de execuo.
Como estes mdulos sero estruturas criadas em tempo de execuo, para noperdermos o controle das diversas posies que estiverem sendo alocadas, devemos fazercom que cada mdulo aponte para o seu prximo, formando uma pilha encadeada.Neste sentido, para controlarmos a pilha, precisaramos apenas do ponteiro inicial dacadeia, onde o ltimo elemento apontaria para a posio Terra, conforme mostra a figuraabaixo:
pilha
Devemos observar que no precisamos nos preocupar se a estrutura est cheia ou
no, pois ela no limitada como os vetores, a menos da quantidade de memria realdisponvel. Esta estrutura pode ser declarada da seguinte forma:
-
8/8/2019 Estruturas de memorias
9/25
type tipo_dado = integer ;
tipo_pilha = ^tipo_no;
tipo_no = recorddado: tipo_dado ;prox: tipo_pilha ;
end ;
Os procedimentos/funes podem ser implementados da seguinte forma:
Procedure Cria_Pilha(varp : tipo_pilha);begin
p :=Nil ;end ;
Function Vazia (p: tipo_pilha) : boolean;begin
Vazia := (p = Nil) ;end ;
procedure Empilha(var p: tipo_pilha ; x: tipo_dado) ;var aux : tipo_pilha ;Begin
new(aux);aux^.dado := x ;
aux^.prox := p ;p := aux ;end ;
function Desempilha(var p: tipo_pilha ;var x : tipo_dado): boolean ;var aux : tipo_pilha ;begin
IfVazia(p)Then Desempilha :=falseElsebegin
Desempilha :=True;
x := p^.dado;aux := p ;p := p^.prox ;dispose(aux) ;
end;end ;
Function Topo(p: tipo_pilha): tipo_dado ;Begin
-
8/8/2019 Estruturas de memorias
10/25
Topo := p^.dado ;end ;
Fila:
Uma fila uma estrutura na qual os dados so inseridos em um extremo e retiradosno outro extremo. So tambm chamadas de FIFO (First In First Out = Primeiro aEntrar e o Primeiro a Sair) ou LILO (Last In Last Out = ltimo a Entrar e o ltimo aSair). Sua representao pode ser vista abaixo:
In Out
A implementao desta estrutura requer a utilizao de um vetor, onde um elemento inserido no final da fila (a direita) e retirado do incio da fila (a esquerda). Estaimplementao dificultada devido ao fato da fila se locomover dentro do vetor. Se nadafor feito para controlar esta locomoo, a fila atingir o final do vetor (lado direito) e aprxima insero no poder ser feita, mesmo que haja espao do lado esquerdo do vetor.Uma forma de resolver este problema : sempre que um elemento for removido (ladoesquerdo) deslocar os demais elementos da fila uma casa a esquerda. Esta soluo implicaem muito esforo computacional desnecessrio. Trs outras solues podem ser utilizadasde forma mais elaborada: Fila Esttica Circular, Fila Esttica Encadeada e Fila DinmicaEncadeada.
Fila Esttica Circular:
Usamos uma estrutura vetorial para representar a fila. Como a fila se movimenta,permitindo a manipulao dos dados nos dois extremos, e o vetor uma estrutura esttica,devemos implementar um mecanismo circular (fila circular) para aproveitar o mximo dovetor. A figura abaixo mostra a representao de uma fila circular, para um vetor de Nposies.
N 1N-1 2
Out
: : 3
9 4
8 57 6
In
Os elementos so retirados na posio Out e so inseridos na posio In. Como aestrutura circular, a posio seguinte a posio N a posio 1. Assim, o incremento dasposies In e Out deve ser feita da seguinte forma:
-
8/8/2019 Estruturas de memorias
11/25
In := (In Mod N) + 1 eOut := (Out Mod N) + 1
Como a declarao de um vetor requer um tamanho mximo da estrutura, nopodemos inserir elementos quando a estrutura j estiver cheia. A condio de fila cheiapode ser obtida atravs de uma var (n_elem) que contenha o nmero de elementosinseridos. Assim, teramos:
cheia := (n_elem = N) ;A cada nova insero ou eliminao, esta varivel dever ser incrementada ou
decrementada, respectivamente. Neste caso, a condio de fila vazia seria:
vazia := (n_elem = 0) ;
Uma outra forma de verificar as condies de fila cheia e fila vazia atravs deuma comparao entre os ponteiros In e Out. Assim, poderamos ter:
vazia := (In = Out) ;
N 1N-1 2
Out = In: : 3
9 4
8 57 6
cheia := Out =Posterior(In) ; quando o ponteiro Out etiver imediatamente
posterior ao ponteiro In.
Neste caso, sempre teremos um campo inutilizado, pois se for permitido a inserode elementos em todos os campos do vetor, o ponteiro In tambm estaria junto com oponteiro Out, e no daria para saber se a fila est vazia ou cheia. A figura abaixo ilustra acondio de fila circular cheia.
N 1 InN-1 2
Out: : 3
9 4
8 57 6
-
8/8/2019 Estruturas de memorias
12/25
Const tam_max = 100 ;type tipo_dado = integer ;
tipo_fila = record
fila: array[1..tam_max] oftipo_dado ;in,out: integer ;end ;
Procedure Cria_Fila(var f: tipo_fila) ;Begin
f.in := 1 ; f.out := 1 ;end ;
Procedure Incrementa(var pos : integer);Begin
pos := (pos MOD n) + 1 ;end;
function Cheia( f : tipo_fila ): boolean ;var aux : integer;begin
aux := f.in ; Incrementa(aux);Cheia := (aux = f.out) ;
end;
function Vazia (f : tipo_fila) : boolean;begin
Vazia := (f.in = f.out) ;end ;
function Enfileira(var f: tipo_fila ; x: tipo_dado): boolean ;begin
IfCheia(f)Then Enfileira :=false Else begin
Enfileira :=True;f.fila[f.in] := x ; Incrementa(f.in) ;
end;
end ;
function Desenfileira(var p: tipo_fila ;var x : tipo_dado): boolean ;begin
IfVazia(f)then Desenfileira :=falseelsebegin
Desenfileira :=True;x := f.fila[f.out];Incrementa(f.out) ;
-
8/8/2019 Estruturas de memorias
13/25
end;end ;
Implementao Esttica Encadeada
Uma forma para facilitar o controle da movimentao da fila dentro do vetor utilizar encadeamento nos campos do vetor. Neste caso, a fila pode utilizar qualquer campodo vetor e os elementos da fila no precisam estar dispostos em ordem. A idia ligar umelemento da fila em seu prximo atravs de um ponteiro lgico (campo que contm onmero de uma posio do vetor que representa o prximo elemento da fila). Para controlarquais campos do vetor contm elementos pertencentes a fila e quais campos do vetor possuicampos livres (que no esto sendo utilizados pelos elementos da fila) ns utilizaremosduas filas sobrepostas: uma fila F contendo a fila propriamente dita e uma fila L contendoos elementos do vetor que esto livres.
Para inserir um elemento na fila F ns deveremos alocar (reservar) uma entradavazia do vetor (primeiro elemento da fila L), colocar o elemento nesta entrada e encadearesta entrada na fila F. Quando quisermos remover um elemento da fila F deveremos pegar oprimeiro elemento que foi inserido, remov-lo do encadeamento e inseri-lo na fila L paraque aquela posio possa ser posteriormente usada para inserir outro elemento.
Definio das Estruturas
Const max = 100;Terra = -1;
Type tipo-dado = integer;
tipo-reg = recorddado: tipo-dado;prox: interger;
end;tipo- fila = record
fila: array[1..max] of tipo-dado;f, { aponta para o inicio da fila de elementos vlidos}l: integer {aponta para o inicio da fila de campos livres }
end;
procedure cria-fila(var F: tipo-fila);
var i: integer;beginF.f := terra;F.l := 1; { no incio todos so livres }for i:=1 to (max-1) do
F.fila[i].prox := (i +1);F.fila[max].prox := terra;
end;
function vazia(F: tipo-fila): boolean;begin
-
8/8/2019 Estruturas de memorias
14/25
vazia := (F.f = terra);end;
function cheia(F: tipo-fila): boolean;begin
vazia := (F.l = terra);end;
procedure insere(var F: tipo-fila; x: tipo-dado);var aux:integer;begin
if not cheia(F)then begin
aux := F.l ; { aloca o primeiro campo livre }
F.l := F.fila[F.l].prox;F.fila[aux].dado := x;F.fila[aux].prox := F.f;F.f := aux;
endelse writeln(acabou memoria.....);
end;
procedure remove(var F: tipo-fila; var x: tipo-dado);var ant, pos: integer;begin
if not vazia(F)then beginant := F.f;if F.fila[ant].prox = terra
then beginF.f := terra;x := F.fila[ant].dado;F.fila[ant].prox := F.l;F.l := ant;
endelse begin
pos := F.fila[ant].prox;while (F.fila[pos].prox terra) dobegin
ant := pos;pos := F.fila[pos].prox;
end;F.fila[ant].prox := terra;x := F.fila[pos].dado;F.fila[pos].prox := F.l;F.l := pos;
end;
-
8/8/2019 Estruturas de memorias
15/25
endelse writeln(pilha vazia .....);
end;
O procedimento remove anterior pode ser simplificado:procedure remove(var F: tipo-fila; var x: tipo-dado);var ant, pos: integer;begin
if not vazia(F)then begin
pos := F.f;if F.fila[pos].prox = terra
then F.f := terra;else begin
repeat
ant := pos;pos := F.fila[pos].prox;
until F.fila[pos].prox = terra;F.fila[ant].prox := terra;
end;x := F.fila[pos].dado;F.fila[pos].prox := F.l;F.l := pos;
endelse writeln(pilha vazia .....);
end;
Implementao Dinmica Encadeada
A implementao dinmica de uma fila semelhante a implementao dinmica deuma pilha. A nica diferena que a insero e a eliminao ocorre em lados opostos.
Para implementar esta estrutura, utilizaremos uma estrutura encadeada como napilha, conforme a figura abaixo. Como na pilha, o controle de toda a fila encadeada dever ser feito por um ponteiro fila que apontar para o primeiro elemento.
insero
fila
remoo
A insero ser feita no final da estrutura (aps o elemento que aponta para Terra)
e a remoo ser feita no incio da estrutura (o elemento apontado pelo ponteiro fila). Omdulo bsico usado em cada n o mesmo usado para a pilha dinmica.
type tipo_dado = integer ;tipo_fila: ^tipo_no ;tipo_no = record
-
8/8/2019 Estruturas de memorias
16/25
dado: tipo_dado ;prox: tipo_fila ;
end ;
Os procedimentos/funes podem ser implementados da seguinte forma:
Procedure Cria_Fila(var f: tipo_fila) ;Begin
f:=Nil ;end;
function Vazia (f: tipo_fila) : boolean;begin
Vazia := (f = Nil) ;
end;
procedure Enfileira(var f: tipo_fila; x: tipo_dado) ;var aux1, aux2 : tipo_fila ;begin
new(aux1);aux1^.dado := x ;aux1^.prox := Nil ;If(f Nil)
thenbeginaux2 := f
while (aux2^.prox Nil) doaux2 := aux2^.prox ;aux2^.prox := aux1 ;
endelse f:= aux1 ;
end ;
function Desenfileira(var f: tipo_fila ;var x : tipo_dado): boolean ;var aux : tipo_fila ;begin
ifVazia(f)
then Desenfileira :=falseelsebeginDesenfileira :=True;x := f^.dado ;aux := f;f:= f^.prox ;dispose(aux) ;
end;end ;
-
8/8/2019 Estruturas de memorias
17/25
Lista
Lista uma estrutura onde os dados so inseridos em qualquer posio, em funode uma poltica qualquer. Geralmente, os dados so inseridos por ordenao, conforme afigura abaixo. for eliminar um determinado elemento necessrio uma informaoqualquer que especifique qual elemento dever ser eliminado (nome, cdigo, tipo, etc...).
B M
lista A F K O P
Implementao Esttica
Existem pelo menos 2 possibilidades de implementao utilizando estruturasestticas: Lista Esttica com Remanejamento e Lista Esttica com Encadeamento
Na Lista Esttica com Remanejamento, a insero ou remoo de um elemento emuma posio que no seja no final da lista, requer um remanejamento de todos os elementosque esto localizados nas posies seguintes, como mostra a figura abaixo.
inserirB
A F K O P A B F K O P1 2 3 4 5 6 7 1 2 3 4 5 6 7
remover
A B F K O P B F K O P1 2 3 4 5 6 7 1 2 3 4 5 6 7
const n = 100 ;type tipo_dado = integer ;
tipo_lista = recordlista: array[1..n] oftipo_dado ;tam : integer ;
end ;
procedure Cria_Lista( varL : tipo_lista) ;begin
L.tam := 0 ;end ;
-
8/8/2019 Estruturas de memorias
18/25
function Cheia(L: tipo_lista) : boolean;begin
Cheia := (L.tam = n) ;end;
function Vazia(L) : boolean;var L : tipo_lista ;begin
Vazia := (L.tam = 0) ;end;
(* A funo Busca poder ser utilizada tanto para a insero quanto para a remoo de umelemento. Seu funcionamento ser o seguinte: A funo dever verificar se existe o
elemento X na lista L, devendo retornar o seguinte:Se X existe, ento flag retorna verdadeiro e Busca retorna a posio em que o
elemento se encontraSe X no existe, ento flag retorna falso e Busca retorna a posio em que o
elemento deve ser inserido *)
function Busca (var L: tipo_lista ;var X : tipo_dado;var flag : boolean) :var i : integer ;begin
i := 1 ;while (X < L.lista[i]) and (i L.tam) do
Inc(i) ;if X = L.lista[i]thenbegin
Busca := i ;flag := true ;
endelse begin
flag := false ;ifX < L.lista[i]
then Busca := i ;else Busca := L.tam + 1 ;
end ;end ;
procedure Desloca (var L : tipo_lista ; var pos : integer) ;var i, d : integer ;begin
d := L.tam - pos + 1;for i := 0 to (d-1) do
L.lista[L.tam+1-i] := L.lista[L.tam-i] ;Inc(L.tam);
end ;
-
8/8/2019 Estruturas de memorias
19/25
function Insere_Lista (var L : tipo_lista ; X) : boolean ;
var X : tipo_dado ;pos : integer; flag : boolean ;
beginif Cheia (L)
then Insere := falseelseifVazia (L)
thenbeginL.lista[1] := X;L.tam := 1;Insere := true ;
end
else beginpos := Busca (L,X,flag);ifflag (* elemento j existe *)
then Insere := falseelsebegin
Desloca (L,pos);L.lista[pos] := X ;Insere := true ;
end;end;
end ;
procedure Reloca (Var L : tipo_lista ; pos : integer) ;var i : integer ;begin
for i := pos to (L.tam-1) doL.lista[i] := L.lista[pos+1] ;
L.tam := L.tam - 1 ;end ;
function Remove_Lista (var L : tipo_lista ; var X : tipo_dado) : boolean ;var i : integer ; flag: boolean ;
beginifVazia (L)then Remove_Lista := falseelsebegin
pos := Busca (L, X, flag);if not flag
then Remove_Lista := falseelse begin
X := L.lista[pos] ;Reloca (L,pos);Remove_Lista := true ;
-
8/8/2019 Estruturas de memorias
20/25
endend;
end ;
Na Lista Esttica com Encadeamento, os elementos no precisam necessariamenteestar situados seqencialmente um aps o outro, no vetor. Assim, para controlar a lista,cada elemento da lista aponta para o prximo, ou seja, contm a posio onde se encontrao prximo elemento da lista.
Como o primeiro elemento da lista no precisa necessariamente estar na primeiraposio do vetor, deve existir uma var para conter a posio do primeiro elemento. forpermitir a insero e remoo de elementos sem remanejamento, o vetor comporta umasegunda lista, chamada lista de disponveis. A figura abaixo mostra o exemplo de umvetor com ambas as listas.
dispo
lista
1 2 3 4 5 6 7 8 9 ... N
5 8 -1
Na figura acima, as posies 1, 2, 5, 6 e 7 representam a lista propriamente dita
(lista de ocupados). As posies 3, 4, 8, 9 ...e N representam os campos do vetor que estovazios (disponveis) para as novas inseres de elementos. No final de cada lista, o ultimo
elemento aponta para uma posio inexistente (-1), representando a posio terra.
Em cada lista, uma posio aponta para a seguinte. Assim, na lista de posiesocupadas, cada registro do vetor contm um campo com o nmero da prxima posioocupada, e na lista de disponveis, cada registro do vetor contm um campo com o nmeroda prxima posio livre.
Na insero de um novo elemento, deve ser utilizado o primeiro campo da lista dedisponveis, para inserir fisicamente o elemento. then, deve-se procurar a posio deinsero lgica deste elemento na lista de ocupados, e acertar os apontadores. No necessrio o remanejamento dos elementos. A figura abaixo mostra a insero do elemento
L.dispo dispo
lista lista
B J F K L B J L F K1 2 3 4 5 6 7 8 insere 1 2 3 4 5 6 7 8
-
8/8/2019 Estruturas de memorias
21/25
Na remoo de um elemento, ocorre somente uma remoo lgica. A posio dovetor que contm o elemento a ser removido deve ser retirada da lista de ocupados einserida na lista de disponveis, atravs do acerto do apontadores. No necessrio o
remanejamento dos elementos. A figura abaixo mostra a remoo do elemento B.dispo lista
lista dispo
B J L F K B J L F K1 2 3 4 5 6 7 8 remove 1 2 3 4 5 6 7 8
Inicialmente, a lista de disponveis deve ocupar todo o vetor e a lista de ocupados
deve conter o cdigo de terra (-1).
const n = 100 ;fim = -1 ; (* para indicar o final da lista *)
type tipo_dado = recorddado,prox :integer ;
end ;
tipo_lista = recordlista: array[1..n] of tipo_dado ;head, (* apontador para a lista de ocupados *)
dispo : integer ; (*apontador para a lista de disponveis *)end ;
procedure Cria_Lista(var L : tipo_lista) ;var i : integer ;begin
L.head := fim ;L.dispo := 1 ;for i := 1 to (n-1) do
L.lista[i].prox := i +1 ;L.lista[n].prox := fim ;
end ;
function Cheia(L: tipo_lista) : boolean;begin
Cheia := (L.dispo = fim) ;end;
function Vazia(L: tipo_lista) : boolean;begin
Vazia := (L.head = fim) ;end;
-
8/8/2019 Estruturas de memorias
22/25
(* A funo Busca poder ser utilizada tanto para a insero quanto para a remoo de umelemento. Seu funcionamento ser o seguinte: A funo dever verificar se existe oelemento X na lista L, devendo retornar o seguinte:
Se L est vazia, ento flag retorna falso e Busca retorna fim, seno:Se X existe, then:
- flag retorna verdadeiro e,- Se X o primeiro da lista, ento Busca retorna fim, seno Busca retorna aposio do elemento anterior ao elemento X.
Se X no existe, ento:- flag retorna falso e,
- Se X menor que o primeiro, ento Busca retorna fim, seno Busca retorna aposio do elemento anterior a posio de insero *)
function Busca (L : tipo_lista; X: tipo_dado; flag : boolean) : integer ;var ant, pos : integer ;begin
ant := fim ;pos := L.head ;while (L.lista[pos].dado < x) and (pos fim) do
beginant := pos ;
pos := L.lista[ant].prox ;end;Busca := ant ;flag := false ;if(pos fim)
thenif(L.lista[pos].dado = X)then flag := true ;
end ;
function Insere_Lista (var L : tipo_lista ; X: tipo_dado) : boolean ;var aux, aux2, pos : integer; flag : boolean ;
beginif Cheia (L)then Insere_Lista := falseelse begin
pos := Busca (L, X, flag); (* se L vazia entao Busca := fim *)ifflag (* elemento j existe *)
then Insere_Lista := falseelse begin
aux := L.dispo ;L.dispo := L.lista[aux].prox ;L.lista[aux].dado := X ;
-
8/8/2019 Estruturas de memorias
23/25
Insere_Lista := true ;if(pos = fim) (* deve ser inserido no begin *)
thenbegin
L.lista[aux].prox := L.head ;L.head := aux ;
endelse begin
aux2 := L.lista[pos].prox;L.lista[aux].prox := aux2 ;L.lista[pos].prox := aux ;
end;end;
end;end ;
function Remove_Lista (L : tipo_lista ; X : tipo_dado) : boolean ;var aux, pos : integer ; flag : boolean ;begin
ifVazia (L)then Remove_Lista := falseelsebegin
pos := Busca (L, X, flag);if not flag
then Remove_Lista := falseelse begin
if(pos=fim) (* deve-se remover o primeiro *)then beginaux := L.head ;L.head := L.lista[aux].prox ;
endelsebegin
aux := L.lista[pos].prox ;L.lista[pos].prox := L.lista[aux].prox ;X := L.lista[aux].dado ;
end;L.lista[aux].prox := L.dispo ;
L.dispo := aux ;end;end;
end ;
-
8/8/2019 Estruturas de memorias
24/25
3 TRABALHO INDIVIDUAL:
Fazer um algoritmo completo, que implemente as funes de manipulao de:
a) Pilha Esttica b) Pilha Dinmica
- Insere_Pilha_E - Insere_Pilha_D- Remove_Pilha_E - Remove_Pilha_D- topo_Pilha_E - topo_Pilha_D
c) Fila Esttica d) Fila Dinmica- Insere_Fila_E - Insere_Fila_D- Remove_Fila_E - Remove_Fila_D
e) Lista Esttica c/ Reman/ f) Lista Esttica Encadeada- Insere_Lista_E_R - Insere_Lista_E_E- Remove_Lista_E_R - Remove_Lista_E_E
- Busca_Lista_E_R - Busca_Lista_E_E
O algoritmo dever Simular um Estacionamento. Inicialmente, o algoritmo deversolicitar o tipo de tcnica a ser utilizada (a, b, c, d, e, f). Aps a escolha da tcnica, oalgoritmo dever solicitar opes do tipo:
- estacionar o carro- retirar o carro- olhar carro (verificar se o carro est no local)
A estrutura a ser utilizada (pilha, fila ou Lista) representar o estacionamento.
No caso de se escolher a estrutura de pilha, deve-se supor que o estacionamentopossui somente uma entrada e s cabe um carro de largura, no permitindo manobra dentrodo estacionamento. Assim, dever ser utilizado 2 pilhas: uma pilha para o estacionamentoprincipal e outra para o estacionamento secundrio, pois assim, para remover um carrodeve-se retirar todos os carros que esto no topo do estacionamento principal, um a um, toencontrar o carro desejado. Os carros retirados devem ser colocados na pilha secundria, edepois devolvidos para a pilha primria. for se estacionar um carro, deve-se coloc-lo nofinal do estacionamento primrio.
-
8/8/2019 Estruturas de memorias
25/25
No caso de se escolher a estrutura de fila, subentense-se que o estacionamentopossui duas entradas, uma em cada extremo, mas possui a largura de um nico carro, nopermitindo a manobra. Assim, para retirar um determinado carro, deve-se retirar da frente e
colocar atrs, to encontra o carro desejado. for se estacionar um carro deve-se semprecolocar atrs da fila.
No caso de se escolher a estrutura de Lista, o carro dever ser colocado em umaposio qualquer de acordo com a ordem das placas. O carro pode ser retirado de qualquerposio.
Listas Duplamente Encadeadas