estruturas de memorias

Upload: luis-lima

Post on 09-Apr-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

  • 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