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:
É 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.
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.
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.