quinta-feira, 18 de outubro de 2012

O que são estruturas dinâmicas?

Em programação, uma variável ou estrutura de dados diz-se dinâmica quando pode ser criada e destruída no decurso de um programa, consoante as necessidades de tratamento de informação.

Existem 3 tipos de estruturas dinâmicas:


  • Pilhas
É uma estrutura de dados que corresponde a uma lista sequencial. Respeita a propriedade LIFO (Last In First Out), ou seja, o último a entrar é o primeiro a sair.
Program Pilha ;
type dados=record
                nome:string;
                idade:integer;
                prox:^dados;
end;
var p1,px:^dados;
    x:char;
    y,i:integer;
procedure inserir;
Begin
      p1:=nil;
                new(px);
                writeln('Nome: ');
                read(px^.nome);
                writeln('Idade: ');
                read(px^.idade);
                px^.prox:=p1;
                p1:=px;
end;
procedure listar;
begin
px:=p1;
repeat
                writeln('Nome: ',px^.nome);
                writeln('Idade: ',px^.idade);
                px:=px^.prox;
until px=nil;
end;
procedure eliminar;
begin
px:=p1;
if px<>nil then
                begin
                               p1:=px^.prox;
                               dispose(px);
     end
else
                writeln('Pilha vazia');
end;
begin
                p1:=nil;
     repeat
                writeln('1-para inserir dados.');
                writeln('2-para mostrar dados.');
                writeln('3-para eliminar dados.');
                writeln('Qual a opoção');
                read(y);
                case y of
                               1:inserir;
                               2:listar;
                               3:eliminar;
                end;
                               writeln('Deseja continuar?(S-N)');
                               read(x);
                until(x='n') or (x='N');   
 End.

  • Filas
Os elementos entram sempre na cauda da estrutura e o próximo elemento a sair é sempre o que se situa na frente da fila. Respeita a propriedade FIFO (First In First Out), ou seja, o primeiro a entrar é o primeiro a sair.
Program fila ;
type pessoa=record
                nome:string;
                idade:integer;
                peso:real;
                prox:^pessoa;
end;
var cauda,frente,px:^pessoa;
    x:char;
    y:integer;
 procedure inserir;
 begin
                new(px);
                writeln('Nome:');
                read(px^.nome);
                writeln('Idade:');
                read(px^.idade);
                writeln('Peso:');
                read(px^.peso);
                if frente=nil then
                begin
                               frente:=px;
                               cauda:=px;
                end
                else
                begin
                               cauda^.prox:=px;
                               cauda:=px;
                               cauda^.prox:=nil;
                end;
 end;
 procedure percorrer;
 begin
                px:=frente;
                if px=nil then
                               writeln('Pilha vazia')
                else
                begin
                               repeat
                                               writeln('Nome: ',px^.nome);
                                               writeln('Idade: ',px^.idade);
                                               writeln('Peso: ',px^.peso);
                                               px:=px^.prox;
                               until (px=nil);
                end;
 end;
 procedure eliminar;
 begin
                px:=frente;
                if px=nil then
                               writeln('Pilha vazia')
                else
                begin
                               px:=frente;
                               frente:=frente^.prox;
                               dispose(px)
                end;
 end;    
 Begin
      cauda:=nil;
      frente:=nil;
      repeat
                writeln('1-para inserir dados.');
                writeln('2-para mostrar dados.');
                writeln('3-para eliminar dados.');
                writeln('Qual a opoção');
                read(y);
                case y of
                               1:inserir;
                               2:percorrer;
                               3:eliminar;
                end;
                               writeln('Deseja continuar?(S-N)');
                               read(x);
                until(x='n') or (x='N');   
 End.


  • Listas Ordenadas
Os elementos devem ficar por ordem alfabética ou por ordem crescente ou decrescente dos seus valores. Neste caso podemos remover um elemento em qualquer lugar da lista. 
Program lista_ordenada;
type lista=record
                nome:string;
                ponteiro:^lista;
end;
var px,pz,p1,p2:^lista;
    escolha, OP:char;

procedure inserir;            
 Begin
                new(px);
                writeln('Introduza o nome');
                read(px^.nome);
                px^.ponteiro:=pz;
                pz:=px;  
 End;
 procedure listar;
 begin
  px:=pz;
   If px=nil then
                  writeln('A lista está vazia')
   else
                  begin
                                  repeat
                                                 writeln('Nome - ', px^.nome);
                                                 px:=px^.ponteiro
                                 until px=nil;
                  end;
 end;
 procedure ordenar;
 var trocar: boolean;
 aux:string;
 begin
 P1:=Pz;
 P2:=Pz^.PONTEIRO;
                IF (pz <> nil) and (pz^.ponteiro <> nil) then
                               repeat
                                               trocar:=false;
                                               p1:=pz;
                                               p2:=pz^.ponteiro;
                                               repeat
                                                                              if p1^.nome>p2^.nome then
                                                                                              begin
                                                                                                              trocar:=true;
                                                                                                              aux:=p1^.nome;
                                                                                                              p1^.nome := p2^.nome;
                                                                                                              p2^.nome:=aux;
                                                                                              end;
                                                                                              p1:=p1^.ponteiro;
                                                                                              p2:=p2^.ponteiro;
                                                               until p1^.ponteiro = nil;
                               until not trocar
                else
                               begin
                                               if p1=nil then
                                                               writeln('Lista vazia');
                                               if p1^.ponteiro=nil then
                                                               Writeln('Só existem 1 elementos');
                               end;                                                                                                                  
 end;
 procedure remover;
 var pa:^lista;dado:string;
 begin
                if pz<>nil then
                begin
                               writeln('Introduza o dado a eliminar');
                               read(dado);
                               pa:=nil;
                               px:=pz;
                               while (px<>nil) and (px^.nome<>dado) do
                               begin
                                               pa:=px;
                                               px:=px^.ponteiro;
                               end;
                               if px=nil then
                                               writeln(dado,' não se encontra na lista')
                               else
                                               begin
                                                               if pa=nil then    
                                                                              pz:=px^.ponteiro
                                                               else
                                                                              pa^.ponteiro:=px^.ponteiro;
                                               dispose(px);
                                               writeln(dado,' foi removido da lista');
                                               end;
                end
                else
                               writeln('Lista vazia');
 end;    
 begin
                pz:=nil;
                               repeat
                                               writeln('1-Inserir');
                                               writeln('2-Listar');
                                               writeln('3-Sair');
                                               writeln('4-Apagar');
                                               writeln('Qual a opção?');
                                               readln(op);
                                                               case op of
                                                                              '1':Begin inserir; ordenar; end;
                                                                              '2':listar;
                                                                              '4':remover;
                                                               end;
                                               writeln('Deseja continuar??');
                                               Readln(escolha);
                               until(escolha='N') or (escolha='n');
 end.


Nota: Para preencher uma lista ordenada utiliza-se o mesmo processo que utiliza para uma pilha.

Reflexão:
As estruturas dinâmicas foram a base deste módulo. Aprendi a realizar filas, pilhas e listas ordenadas.  

Sem comentários:

Enviar um comentário