Escolar Documentos
Profissional Documentos
Cultura Documentos
ESTRUTURA DA INFORMAÇÃO
NOTAS DE AULA
Manuel
1.1.1- MOTIVAÇÃO
Tipo de estrutura usada na solução de problemas que envolvem conjuntos de dados que se
relacionam mantendo uma relação de ordem.
Os elementos de uma agenda são fichas com Nome, Endereço, e Telefone , organizadas em
ordem alfabética. Tomando-se o devido cuidado quando da inserção de novas fichas, ou seja,
respeitando-se a ordem alfabética, pode-se facilmente acessar o dado desejado sempre que for
necessário. Como fichas podem ser inseridas ou removidas, o tamanho da agenda (nº de
fichas) é variável ao longo do tempo.
1.1.2 - CONCEITUAÇÃO
EX-1: Uma lista com as taxas mensais de inflação nos últimos 24 meses. (Dado simples)
Ordenação: Mês/Ano
EX-2: Uma lista com Nome e Matrícula dos alunos de uma escola. (Dado composto)
Ordenação: Matrícula.
Ex-3: Uma lista com Nome e Salário dos deputados estaduais do Estado do Rio de Janeiro.
Qual seria a melhor ordenação neste caso ?
DEF: Lista é uma coleção ordenada de componentes do mesmo tipo. Tipicamente este é o
tipo registro (record);
. Se n > 0
. x1 é o primeiro nó
. Para 1 < k < n.
xk é precedido pelo nó xk-1 e seguido pelo nó xk+1.
. Se n=0 a lista é vazia.
Representação Física
1 - Acessar o k-ésimo nó da lista para obter e/ou alterar o dado nele contido.
1.1.4-FORMAS DE REPRESENTAÇÃO
Características:
Implementação
A maneira mais singela (simples) e obvia de implementar uma lista em computador é através
da utilização de um vetor. Esta representação é bastante satisfatória para algumas operações e
bastante ineficiente para outras. Ela é utilizada em situações em que as inclusões/exclusões
são realizadas sempre no final da lista (não são necessárias inclusões/exclusões em posições
intermediárias). Apresenta-se a seguir, vantagens e desvantagens da implementação de uma
lista em um vetor.
Vantagens:
EX-1 : Suponha uma lista implementada no vetor Vet [1..200] com valores inteiros (Integer).
Vet[10] := 236; ou
Writeln( Vet[2] );
EX-2 : Suponha uma lista com nome e telefone implementada no vetor Item.
Para acessar o nó 20 e determinar o seu conteúdo basta fazer:
Writeln( Item[20].Nome );
Writeln( Item[20].Telefone );
Item[3].Telefone := ‘2216014’ ;
1- É preciso especificar antecipadamente a dimensão máxima do vetor onde a lista vai ser
implementada.
Exemplo-1:
Exemplo-2: Suponhamos uma lista com Nome e CPF implementada no vetor Reg com
dimensão máxima (N_Max = 2.000) e com 800 nós. Desejamos inserir um novo (nó) na
posição 4 da lista. Qual o procedimento padrão supondo que a lista já esta montada?
Temos:
Program Inclui_Dado;
Begin
for I := 800 Downto 4 do
Reg[I+1] := Reg [I];
Reg [ 4 ].Nome := ‘Novo Nome’ ;
Reg [ 4 ].CPF := ‘Novo CPF’;
N_Lista := 801;
End.
x1 x2 x3 ............
01 02 03 DIM
Informações(INFO)
Os nós ou elementos da Lista, contém os dados propriamente ditos (as informações - INFO).
Cada elemento por sua vez, é composto de duas partes básicas: a Chave e o Conteúdo.
Esquematicamente tem-se:
Const
Dim = 100;
Tipo_Elemento = record
Chave : Tipo_Chave;
Conteudo: String [30];
end;
Tipo_Lista = record
Ini : Integer;
Fim : Integer;
Cor : Integer; { * DESCRITORES * }
Num : Integer;
Elemento : Array [1..Dim] of Tipo_Elemento; {Info}
end;
Var
L : Tipo_Lista; { L = Lista}
X,W : Tipo_Elemento; {Elemento da Lista-Informações}
Cr : Integer; {Código de retorno}
Solução:
Tipo_Elemento = Record
Chave : Tipo_Chave;
Nome : String [ 30 ];
D_Nasc : String [ 8 ];
Ender : String [ 45 ];
Tel : String [ 10 ];
end;
Tipo_Lista = Record
Ini : Integer;
Fim : Integer;
Cor : Integer;
Num : Integer;
Elemento : Array [ 1..Dim ] of Tipo_Elemento;
end;
Fig.1
Fig.2
Com uma pequena dose de abstração, um mínimo de criatividade, e uma razoável linguagem
de programação, pode-se fazer uma boa utilização do conceito de Lista para resolver
problemas práticos.
Algumas linguagens oferecem recursos de alocação dinâmica (pointers, etc), o que facilita a
implementação das operações sobre Lista Encadeadas. Para as linguagens que não oferecem
este tipo de recurso, usa-se o Encadeamento Simulado que será visto a seguir.
Exemplo:
INFO X3 X4 X1 X2
ELO 02 00 05 00 01
01 02 03 04 05
(Definição da Lista)
Const
Dim = 100;
Type Tipo_Elemento = record
Chave : Tipo_Item_Chave;
Conteúdo: String;
end;
Tipo_Lista = record
Ini : Integer; { DESCRITORES }
Fim : Integer;
Liv : Integer;
Cor : Integer;
Ant : Integer;
Num: Integer;
Elemento: Array [1..Dim] of Tipo_Elemento; {INFO}
Elo : Array [1..Dim] of Integer; {ELOS-PONTEIROS}
end;
b. Verificação
c. Acesso sequencial
begin
if Lista_Vazia(L)
then begin
CR := 2; {CR = 2 Lista Vazia}
X.Chave:= “ “;
end
else begin
CR := 0;
L.Cor : =L.Ini;
X.Chave := L.Elemento[L.Cor].Chave;
X.Conteudo := L.Elemento[L.Cor].Conteudo;
end;
end;
d.1 Procura o elemento com valor da Chave igual a V (Chave) e retorna seu conteúdo em X.
e. Inclusão/Alteração
var I : Integer;
begin
if Lista_Cheia ( L )
then Cr := 4 {Lista Cheia}
else begin
if L.Cor = 0 {Lista vazia ou fim da lista}
then Inclui_Fim (L,X,Cod)
else begin
for I := L.Fim Downto L.Cor do
begin
L.Elemento [ I + 1]:= L.Elemento [ I ];
end;
L.Elemento [L.Cor].Chave := X.Chave;
L.Elemento [L.Cor].Conteudo :=X.Conteudo;
L.Fim := L.Fim + 1;
L.Num := L.Num + 1;
end;
end;
end;
Begin
CR := 0;
Siga := true;
Prim_Corr ( L,W,Cod); {Posiciona no 1º elemento da Lista}
While (Cod=0 and Siga) do { Início do While }
begin
if W.Chave = X.Chave
then begin
Siga := false;
CR := 6; {Já existe na Lista}
end
else begin
if W.Chave > X.Chave
then Siga := False
else Prox_Corr (L,W,Cod);
end;
end; { Fim do While }
begin
L.Elemento [L.Cor].Conteudo := W.Conteudo + X.Conteudo;
end;
e.5 Inclusão no final (se for novo) - Alteração (se já existir-incrementa conteúdo)
begin
Acha_Val (L,X,W,CR);
if CR = 0
then Altera_Corr (L,W,X) {Procedure Altera_Corr}
else Inclui_Fim (L,X,CR); {Procedure Inclui_Fim }
end;
e.6 Inclusão Ordenada / Alteração - Inclui ordenadamente se não existir e altera conteúdo se
existir.
begin
Acha_Val (L,X,W,CR);
if CR = 0
then Altera_Corr (L,W,X) {Procedure Altera_Corr}
else Inclui_Ord (L,X,CR); {Procedure Inclui_Ord }
end;
Var i : Integer;
Begin
if L.Cor = 0
then begin
CR := 2; {Não há corrente ou fim da Lista}
X.Chave := “”;
end
else begin
CR := 0;
X.Chave := L.Elemento [L.Cor].Chave;
X.Conteudo := L.Elemento [L.Cor].Conteudo;
if L.Cor = L.Fim
then L.Cor := 0 {Fica sem elemento corrente}
else begin
for i := L.Cor + 1 to L.Fim Do
begin
L.Elemento [i -1].Chave:=L.Elemento[ i ].Chave;
L.Elemento [i -1].Conteudo:=L.Elemento[ i ].Conteudo;
end;
end;
L.Fim := L.Fim - 1;
L.Num := L.Num - 1;
if L.Num = 0
then L.Ini := 0;
end;
end;
.............................
Prim_Corr(LA,XA,Cra);
While (Cra = 0) Do
Begin
Prim_Corr(LB,XB,Crb);
While (Crb = 0) Do
Begin
IF XA > XB
Then writeln(XB,XA)
Else writeln(XA,XB);
Prox_Corr(LB,XB,Crb);
end;
Prox_Corr(LA,XA,Cra);
end;
.............................
ALG-EX03;
Var L : Tipo_Lista;
X,W : Tipo_Elemento;
CR: Integer;
Prim_Corr (L,X,Cr);
If Cr = 0 Then
Begin
W := X;
Prox_Corr (L,X,Cr);
While Cr = 0 Do
Begin
If X > W
Then writeln( X );
W := X;
Prox_Corr ( L,X,Cr );
end;
Exercício-4: Com o algoritmo do exercício anterior, indique a saída produzida para os casos
abaixo:
a) L = { } (Lista vazia)
b) L = { x }
c) L = { x , y }
d) L = { y , x }
e) L = { x , y , z , w , r , s , t }
Pergunta-se:
b. Quais os estados que consomem mais produtos importados do que nacionais, e quais os
valores desses consumos?
*e. Entre os produtos consumidos no PI, quais aqueles que tem um consumo nacional maior
do que o importado, e quanto valem esses consumos?
*f. Qual o valor gasto mensalmente em cada estado com cada produto ?
Program Agrícola;
Const Dim =100;
type T_Dados = record
MesRef : String [ 5 ];
UF : String [ 2 ];
Produto : String [10] ;
Nacional : Real;
Importado : Real;
end;
T_Chave = record
UF : String [ 2 ];
end;
T_Elemento = record
Chave : T_Chave;
Nacional : Real;
Importado : Real;
end;
T_Lista = record
Ini : Integer;
Fim : Integer;
Cor : Integer;
Num : Integer;
Elemento : Array [1..Dim ] of T_Elemento;
end;
Var Lista : T_lista; { Lista }
CR : Integer; { Código de retorno }
X : T_Elemento; { Elemento da Lista }
Arq : File of T_Dados; { Arquivo de Dados }
Dados : T_Dados; { Dados de entrada }
begin
CriaLista(Lista);
Assign(Arq, ‘Dados.txt ‘);
Reset (Arq);
while ( CR=0 ) and (not (eof (arq) ) ) do { Início do WHILE }
begin
Read (Arq, Dados); { Início da leitura dos dados}
X.Chave.UF:=Dados.UF;
X.Nacional:=Dados.Nacional;
X.Importado:=Dados.Importado;
{Procedure que Inclui/Altera e Ordena os elementos da lista}
Inclui_AltOrd (Lista, X, CR);
end; { Fim do WHILE }
Prim_Corr (Lista, X, CR) ;
while CR=0 do
begin
if X.Importado > X.Nacional
then writeln (X.Chave.UF,X.Importado,X.Nacional);
Prox_Corr (Lista, X, CR)
end;
end.
Program Agrícola;
Const Dim =100;
type T_Dados = record
MesRef : String [ 5 ];
UF : String [ 2 ];
Produto : String [10] ;
Nacional : Real;
Importado : Real;
end;
T_Chave = record
UF : String [ 2 ];
Produto : String [10 ];
end;
T_Elemento = record
Chave : T_Chave;
end;
T_Lista = record
Ini : Integer;
Fim : Integer;
Cor : Integer;
Num : Integer;
Elemento : Array [1..Dim ] of T_Elemento;
end;
Var Lista : T_lista; { Lista }
CR : Integer; { Código de retorno }
X : T_Elemento; { Elemento da Lista }
Arq : File of T_Dados; { Arquivo de Dados }
Dados : T_Dados; { Dados de entrada }
begin
CriaLista(Lista);
Assign(Arq, ‘Dados.txt ‘);
Reset(Arq);
while (CR=0) and (not(eof(arq) ) ) do
begin
Read(Arq,Dados); { Início da leitura dos dados }
with X.Chave do
begin
UF := Dados.UF;
Produto := Dados.Produto;
end;
{ Procedure que Inclui e Ordena os elementos da lista }
Inclui_Ord (Lista,X,CR );
end;
Prim_Corr(Lista, X, CR );
while CR=0 do
begin
if X.Chave.Produto=‘Maçã ‘
then writeln (X.Chave.UF);
Prox_Corr (Lista, X, CR);
end;
end.
Program Agrícola;
Const Dim =100;
type T_Dados = record
MesRef : String [ 5 ];
UF : String [ 2 ];
Produto : String [10] ;
Nacional : Real;
Importado : Real;
end;
T_Chave = record
UF : String [ 2 ];
Produto : String [10];
end;
T_Elemento = record
Chave : T_Chave;
end;
T_Lista = record
Ini : Integer;
Fim : Integer;
Cor : Integer;
Num : Integer;
Elemento : Array [1..Dim ] of T_Elemento;
end;
Var Lista : T_lista; { Lista }
CR : Integer; { Código de retorno }
X : T_Elemento; { Elemento da Lista }
Arq : File of T_Dados; { Arquivo de Dados }
Dados : T_Dados; { Dados de entrada }
begin
CriaLista(Lista);
Assign (Arq, ‘Dados.txt ‘);
Reset (Arq);
While (CR=0) and (not(eof(Arq) ) ) do
begin
Read(Arq,Dados); { Início da leitura dos dados}
X.Chave.UF:=Dados.UF;
X.Chave.Produto:=Dados.Produto;
{Procedure que Inclui e Ordena os elementos da lista}
Inclui_Ord(Lista, X, CR);
end;
Prim_Corr (Lista, X, CR);
while CR=0 do
begin
if X.Chave.Produto= ‘Abacaxi ‘ or X.Chave.Produto=’Laranja ‘
then writeln (X.Chave.UF);
Prox_Corr (Lista, X, CR);
end;
end.
Program Agrícola;
Const Dim =100;
type T_Dados = record
MesRef : String [ 5 ];
UF : String [ 2 ];
Produto : String [10] ;
Nacional : Real;
Importado : Real;
end;
T_Chave = record
Produto : String [10];
end;
T_Elemento = record
Chave : T_Chave;
Nacional : Real;
Importado : Real;
end;
T_Lista = record
Ini : Integer;
Fim : Integer;
Co : Integer;
Num : Integer;
Elemento : Array [1..Dim ] of T_Elemento;
end;
Var Lista : T_lista; { Lista }
CR : Integer; { Código de retorno }
X : T_Elemento; { Elemento da Lista }
Arq : File of T_Dados; { Arquivo de Dados }
Dados : T_Dados; { Dados de entrada }
begin
CriaLista(Lista);
Assign (Arq, ‘Dados.txt ‘);
Reset(Arq);
while (CR=0) and (not(eof(Arq) ) ) do
begin
Read(Arq,Dados); { Início da leitura dos dados }
X.Chave.Produto:=Dados.Produto;
X.Nacional:=Dados.Nacional
X.Importado:=Dados.Importado;
{ Procedure que Inclui/Altera e Ordena os elementos da lista }
if Dados.UF= ‘PI ‘ then Inclui_AltOrd(Lista, X, CR);
end:
Prim_Corr (Lista, X, CR);
while CR=0 do
begin
if X.Nacional > X.Importado
then writeln (X.Chave.Produto,X.Nacional,X.Importado);
Prox_Corr(Lista,X,CR);
end;
end.