3. 1. Estrutura de Dados
• Até aqui vimos as estruturas de dados que não se
alteram em sua forma ou dimensão: vetor, matriz
e record. Por isso elas são chamadas “Estruturas
de Dados Estáticas”.
• Agora vamos estudar as “Estruturas de Dados
Dinâmicas” que podem se alterar em forma e
dimensões e podem “crescer” ou “diminuir” de
acordo com a necessidade de quem as utiliza.
• Dentre as estruturas dinâmicas mais conhecidas
estudaremos: conjuntos, listas ligadas, filas,
pilhas, árvores e grafos.
4. 2. Conjuntos
• Um conjunto é uma coleção de elementos sem repetição
• Operações: saber se está vazio, elemento pertence ou não ao
conjunto, inserir ou remover elemento, união e interseção
entre conjuntos.
• Vamos fazer as operações:
• CriaConjunto (c): inicializa a estrutura do conjunto
• ConjuntoVazio (c): retorna TRUE se “c” é vazio
• Cardinalidade (c): número de elementos em “c”
• Pertence (x,C): retorno TRUE se “x” está em “C”
• Insere(x,C): inclui elemento “x” no conjunto “C”
• Remove(x,C): remove “x” do conjunto “C”
• Uniao(c1,c2,c3): une os conjuntos “c1” e “c2” dando como
resultado o conjunto “c3”
• Intersecao(c1,c2,c3): faz a interseção entre os conuntos “c1” e
“c2” dando o resultado no conjunto “c3”
• Contido(c1,c2): retorna TRUE se “c1” está contido em “c2”
5. 3. Definições para Conjuntos
• A estrutura de um conjunto em pascal pode ser definida como
um tipo:
CONST max = 10000;
TYPE vetor = array[1..max] of integer;
conjunto = record
tam: integer;
v: vetor;
end;
• Com essa definição podemos declarar uma variável do tipo
“conjunto” assim:
VAR c : conjunto;
• Função para criar um Conjunto, somente faz o tamanho ser “0”
Procedure CriaConjunto (var c:conjunto);
Begin
c.tam := 0;
End;
6. 4. Operações com Conjuntos
• Verificar se um conjunto está vazio:
Procedure ConjuntoVazio (c:conjunto);
Begin
result := c.tam = 0;
End;
• Verificar o tamanho do conjunto
Function Cardinalidade (c:conjunto):integer;
Begin
result := c.tam;
End;
• Ver se um elemento pertence ao conjunto
Function Pertence (x:integer;
c:conjunto):boolean;
Var i:integer;
Begin
result := false; i:=1;
while (i<=c.tam)and(not result) do begin
result := c.v[i] = x; i:=i+1;
end;
End;
• Inserir um elemento no conjunto
Procedure Insere (x:integer; var c:conjunto);
Begin
if Pertence(x,c) then exit;
c.v [c.tam+1] := x; c.tam := c.tam + 1;
End;
• Devolve a posição de um elemento no vetor
Function Posicao (x:integer; c:conjunto):integer;
Var i:integer;
Begin
result:=0; i:=1;
while (i<=c.tam)and(result=0) do begin
if c.v[i] = x then result:=i; i:=i+1;
end;
End;
• Remover elemento de um conjunto
Procedure Remove(x:integer; c:conjunto);
Var i,p:integer;
Begin
p:=Posicao(x,c); if (p=0) then exit;
for i:=p to c.tam-1 do c.v[i] := c.v[i+1];
c.tam := c.tam – 1;
End;
7. 5. Operações entre Conjuntos
• Fazer união entre dois conjuntos:
Procedure Uniao (c1,c2:conjunto; var c3:conjunto);
Var i:integer;
Begin
c3.tam := 0;
for i:=1 to c1.tam do Insere(c1.v[i], c3);
for i:=1 to c2.tam do Insere(c2.v[i], c3);
End;
• Fazer interseção entre dois conjuntos:
Procedure Intersecao (c1,c2:conjunto; var c3:conjunto);
Var i:integer;
Begin
c3.tam := 0;
for i:=1 to c1.tam do
if Pertence (c1.v[i], c2) then Insere(c1.v[i], c2);
End;
• Verifica se um conjunto está contido no outro
Function Contido (c1,c2:conjunto) : boolean;
Var i:integer;
Begin
result := True;
for i:=1 to c1.tam do
result := result and Pertence (c1.v[i], c2);
End;