Professional Documents
Culture Documents
ALGORÍTMO E
ESTRUTURA DE DADOS II
REGISTRO
Um vetor de strings pode ser usado para guardar os nomes dos empregados de uma firma. Um
vetor de reais pode ser usado para guardar seus respectivos salários. Entretanto, uma matriz
bidimensional não pode ser usada para guardar os nomes e os salários dos empregados,
porque todos os elementos de uma matriz devem ser do mesmo tipo. No entanto, estruturas
que usam elementos de tipos diferentes, mas que estão logicamente relacionados entre si, são
muito comuns e necessárias em várias áreas. Observe a ficha abaixo:
INSC NOME SALÁRIO OPTANTE
121 Lúcia Nunes 650,00 Sim
Integer string real char
Uma estrutura desse tipo é definida em Turbo Pascal como um Record. A cada elemento dá-
se o nome de campo ou componente. Esse conjunto de informações do empregado deverá ser
referenciado por um identificador, como por exemplo, ficha.
Records correspondem a conjuntos de posições de memória conhecidos por um mesmo nome
e individualizados por identificadores associados a cada conjunto de posições.
DECLARAÇÃO:
1
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
end;
var
func: ficha;
Os campos podem pertencer a qualquer tipo padrão ou definido pelo usuário, e não existe
nenhum limite para o número de campos da estrutura Record. O fim da definição está
marcado com a palavra reservada End. Após a definição de tipo, podemos declarar uma ou
mais variáveis que pertençam ao tipo Record.
EXEMPLO:
type
apt = record num: integer;
propriet: string[30];
end;
var
moradores, sindicos: apt;
EXEMPLO:
type
Ficha= record Nome : String[25];
Endereco: record Rua: String[25];
Numero: integer;
Cep: String[9];
Cidade: String[20];
UF: String[2];
End;
Cpf: String[14];
Sexo: Char;
2
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
Salário: Real;
End;
Para acessar a cidade = Ficha.Endereco.Cidade
LEITURA E ESCRITA
EXEMPLO:
Program Leitura_Escrita;
Uses crt;
Type
Endereco = Record Rua: String[30];
Numero: Integer;
End;
Cadastro: Record Nome: String[30];
Ende:Endereco;
Cpf: String[14];
End;
Begin
Cadastro.Ende.Rua:=’Rua São João’;
Cadastro.Cpf:= ‘999.999.999-99’;
Writeln(‘Entre com o nome e o número da casa’);
Readln(Cadastro.Nome);
Readln(Cadastro.Ende.Numero);
If Cadastro.Ende.Numerop>50 then
Begin
Writeln(‘Moro a esquerda’);
Writeln(‘Morador:’,Cadastro.Nome);
End
Else Begin
Writeln(‘Moro a direita’);
Writeln(‘Morador:’,Cadastro.Nome);
End;
Readkey;
3
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
End.
CONJUNTO DE REGISTROS
Define um vetor ou matriz dentro de um registro, ou seja, é um vetor ou uma matriz do tipo
registro.
EXEMPLO 1:
Cada posição do vetor tem: nome, situação, saldo e CPF do cliente, vamos trabalhar com 5
clientes.
Program Reg;
Type
DadosCli = record nome: String[25];
Situacao: char;
Saldo: real;
Cpf: String[14];
End;
Var
Contas: array [1..5] of DadosCli;
I: integer;
Begin
For i:= 1 to 5 do
Begin
Writeln (‘Entre com o nome’);
Readln (contas [i]. nome);
Writeln (‘Entre com a situação’);
Readln (contas [i]. situacao);
Writeln (‘Entre com o CPF’);
Readln (contas [i]. cpf);
Writeln (‘Entre com o saldo’);
Readln (contas [i]. saldo);
End;
For i:= 1 to 5 do
Begin
If contas[i].situacao = ‘S’
4
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
EXEMPLO 2:
Um registro para cadastrar 20 alunos do curso de Educação Física. Este deve armazenar o
nome a as notas bimestrais n1 e n2 (vetor com 3 posições, onde, n1 e n2 notas referentes ao 1º
e 2º bimestre e n3 referente ao total das duas notas) e também a média das notas.
Program notas;
Type
Escola = record nome:string[30];
Nbim:array [1..3] of real;
Media: real;
End;
Var
Alunos: array [1..20] of escola;
I, j: integer;
Begin
For i:= 1 to 20 do
Begin
Writeln (‘Entre com o nome do aluno’);
Readln (alunos[i].nome);
Alunos[i].nbim[3]:=0;
For j:= 1 to 2 do
Begin
Writeln (‘Entre com a nota’, j, ‘: ’);
Readln(alunos[i].nbim[j]);
Alunos[i].nbim[3]:= Alunos[i].nbim[3]+ Alunos[i].nbim[j];
End;
Alunos[i].media:= Alunos[i].nbim[3]/2;
writeln(Alunos[i].nbim[3]:4:2);
writeln(Alunos[i].media:4:2);
End;
5
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
End.
EXERCÍCIOS PROPOSTOS
01. Escreva um programa para cadastrar dois clientes de uma loja. As informações necessárias
são: nome, endereço e telefone. Deve ser usada uma estrutura de registro para a construção
deste cadastro, usando Type para a declaração do registro.
02. Escreva um programa para cadastrar as informações dos 50 alunos da faculdade XX, esse
registro terá as informações: nome, idade, sexo e nota final. Essa nota final é a soma das três
notas que o aluno vai informar. Se a nota final for maior que 60 o aluno foi aprovado.
03. Escreva um programa para verificar se as informações de 5 pessoas estão dentro do
padrão: altura entre 1,65 e 1,75, peso entre 60 e 80, caso esteja emitir uma mensagem
informando aprovado, caso não emitir mensagem de erro. As informações são: nome, sexo,
altura, peso.
04. Crie um registro para 20 funcionários e este deverá conter o nome do funcionário, salário,
horas trabalhadas (ht1, ht2, ht3, vetor), preencha. Imprima as somas das ht de cada
funcionário que possua salário entre 100 e 200.
05. Crie um registro para cadastrar 20 alunos do curso de Educação Física. Este deve
armazenar o nome a as notas bimestrais n1 e n2 (vetor com 3 posições, onde, n1 e n2 notas
referentes ao 1º e 2º bimestre e n3 referente ao total das duas notas) e também a média das
notas.
O programa deve ler o nome, a n1 e n2 para os 20 alunos. Calcular a nota total e a média para
cada aluno. No final verificar se a média for maior ou igual a 6, escrever ‘aluno aprovado’,
seu nome e a sua média senão ‘aluno reprovado’, seu nome e sua média.
06. Uma empresa de transporte (com 10 ônibus – registro) deseja calcular a distãncia
percorrida por cada ônibus. Para isto, é fornecido o percurso de cada ônibus com os seguintes
dados:
• Número do ônibus;
• Quantidade de cidades percorridas;
• Código das cidades percorridas e a distância (cada ônibus percorre no máximo 5
cidades) - vetor
07. Deseja-se fazer uma pesquisa com 20 pessoas. Deve ser lido o nome da pessoa, o sexo da
pessoa (f/m) e também respostas do tipo (sim=s/não=n) para cinco questões (vetor). Cada
posição do vetor corresponderá a uma pergunta:
6
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
MODULARIZAÇÃO
PROCEDIMENTO
7
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
8
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
end;
procedure Resto;
var x: integer;
begin
writeln(’Entre com o valor de x’);
readln(x);
if x<=num1 then
writeln(’resto de ’,num1,’ por ’, x, ’ = ’,num1 MOD x)
else writeln(x, ’maior que ’, num1);
if x<=num2 then
writeln(’resto de ’,num2, ’ por ’, x, ’ = ’, num2 MOD x)
else writeln(x, ’maior que ’, num2);
end;
Begin
writeln(’Entre com dois numeros inteiros’);
readln(num1);
readln(num2);
MostraMenu;
op:=readkey;
case op of
’1’: SomaProduto;
’2’: Resto;
Else writeln(’opcao invalida’);
end;
readkey;
End.
Algumas observações:
• Os subprogramas podem incluir definições locais, tanto de variáveis como de constantes ou
tipos. No exemplo 1, o procedimento Resto possui uma variável local (x). As definições locais
só existem durante a execução do subprograma. Por esse motivo, elas somente são acessíveis
pelo subprograma que as contem.
9
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
• As variáveis do programa principal são chamadas de variáveis globais porque são acessíveis
por todos os subprogramas, além do programa principal. No exemplo 1, as variáveis num1 e
num2 são globais.
• O escopo de um identificador define a porção do programa em que ele atua. Portanto, o
escopo das variáveis locais é o subprograma onde elas foram definidas e os subprogramas
contidos no subprograma onde elas foram definidas. O escopo de uma variável global é todo o
programa.
EXEMPLO:
program soma2num1;
10
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
Uses crt;
procedure calcula(a,b:integer);
var
soma:integer;
begin
soma:=a+b;
a:=a+2;
writeln('a soma ‚:',soma,'A vale agora:',a);
end;
var
a,b:integer;
begin
writeln('Entre com 2 n£meros');
readln(a);
readln(b);
calcula(a,b);
writeln('O valor de A fora do procedimento:',a);
readkey;
end.
2. passagem por referência (ou por variável): nesse caso, na chamada do subprograma o
programa principal passa o endereço da variável. A variável correspondente no subprograma é
um nome alternativo da variável da chamada do subprograma. Mudanças nessa variável
afetam a variável do programa principal.
Definição dos parâmetros
Quando a passagem de parâmetros se dá por variável, o grupo de identificadores possui a
palavra var na sua frente. Caso contrário, a passagem de parâmetros é por valor.
Exemplo 2: No procedimento P1 os identificadores x e y são parâmetros cuja passagem se dá
por variável, ao passo que z é um parâmetro com a passagem por valor. No caso do
procedimento P2, o argumento w1 a passagem é por valor e w2 é por referência.
procedure P1(var x,y : integer; z: integer);
procedure P2(w1:char; var w2: char);
11
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
EXEMPLO:
program soma2num2;
Uses crt;
procedure calcula(var a,b:integer);
var
soma:integer;
begin
soma:=a+b;
a:=a+2;
writeln('a soma ‚:',soma,'A vale agora:',a);
end;
var
n1,n2:integer;
begin
writeln('Entre com 2 numeros');
readln(n1);
readln(n2);
calcula(n1,n2);
writeln('O valor de n1 ‚:',n1);
readkey;
end.
12
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
13
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
readkey;
End.
EXERCÍCIOS PROPOSTOS
01. Faça um programa que calcula a média aritmética entre duas notas, utilizando um
procedimento para ler as notas.
02. Faça um procedimento para calcular a soma de dois números inteiros passados como
parâmetro e o seu resultado passado por referência será multiplicado por 5. Mostre o valor da
multiplicação.
03. Faça um procedimento para calcular o valor de y sendo utilizando parâmetro:
y= f(x) + g(x);
h(x)=x2 – 16
04. Escreva um procedimento chamado Troca que receba duas variáveis inteiras (X e Y) e
troque o conteúdo entre elas.
05. Escreva um procedimento chamado aumento que receba dois valores reais X e Y como
parâmetros e aumente o valor de X em Y%.
06. Escreva um procedimento chamado METADE que divida um valor do tipo real passado
como parâmetro pela metade. Escreva um programa que leia um vetor A de 20 elementos
reais e, usando o procedimento METADE, divida todos os elementos pela metade.
07. Escreva um programa com um procedimento chamado PAR ÍMPAR que receba um vetor
de 20 elementos inteiros e retorne a quantidade de números pares e de números ímpares
contidas no mesmo.
FUNÇÃO
14
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
begin
conjunto de comandos
....
Nome_da_Função := expressão;
end;
EXEMPLO:
program exemplo;
uses crt;
var
res,a,b:real; {essas variáveis do programa principal podem ser usadas pela function, por
isso, nesse caso, não precisa declará-las novamente dentro da function}
function soma(a,b: real): real; {essa linha diz que a function chama-se soma, e vai utilizar
duas variáveis: a e b, que são reais. O resultado obtido também será real}
begin
soma:=a+b; {cálculo do valor "soma"}
end;
begin {inicio do programa principal}
writeln (‘Entre com dois valores’);
readln(a);
readln(b);
res:=soma(a,b); {a variável res vai receber o valor calculado pela function soma, que vai
somar a e b}
writeln(res);
15
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
readkey;
end.
EXEMPLO:
Fazer um programa que leia um numero real X, e determine o seguinte somatório:
S= X + X + X + ...
( x + 2) * 5 ( x + 3) * 5 ( x + 4) * 5
( x * 3) 2 ( x * 4) 2 ( x * 5) 2
EXERCÍCIOS PROPOSTOS
01.Escreva uma função chamada cubo que recebe um valor do tipo integer e retorna o valor
elevado a 3.
02. Escreva uma função chamada quadrado que recebe um valor do tipo integer e retorna o
valor elevado a 2.
S= X + X ___ + X + ...
( x + 2) * 5 ( x + 3) * 5 ( x + 4) * 5
( x * 3) 2 ( x * 4) 2 ( x * 5) 2
h(x)=x2 – 16
1, se h(x) < 0
0, se f(x) > 0
17
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
LISTAS LINEARES
Uma das formas mais simples de interligar os elementos de um conjunto. Estrutura em que as
operações inserir, retirar e localizar são definidas. Itens podem ser acessados, inseridos ou
retirados de uma lista em qualquer posição. Duas listas podem ser concatenadas para formar
uma lista única, ou uma pode ser partida em duas ou mais listas. Podem crescer ou diminuir
de tamanho durante a execução de um programa, de acordo com a demanda.
Aplicabilidade:
• Adequadas quando não é possível prever a demanda por memória, permitindo a
manipulação de quantidades imprevisíveis de dados, de formato também imprevisível.
• São úteis em aplicações tais como gerência de memória, simulação e compiladores.
Definição de Listas
Seqüência de zero ou mais itens x1, x2, · · · , xn, na qual xi é de um determinado tipo e n
representa o tamanho da lista linear. Sua principal propriedade estrutural envolve as posições
relativas dos itens em uma dimensão. Assumindo n ≥ 1, x1 é o primeiro item da lista e xn é o
último item da lista.
• xi precede xi+1 para i = 1, 2, · · · , n – 1
• xi sucede xi−1 para i = 2, 3, · · · , n
• o elemento xi é dito estar na i-ésima posição da lista.
18
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
Implementação de Listas
Várias estruturas de dados podem ser usadas para representar listas lineares, cada uma com
vantagens e desvantagens particulares. As duas representações mais utilizadas são as
implementações por meio de arranjos e de apontadores. Exemplo de conjunto de operações:
19
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
Vantagens e desvantagens
Vantagem:
• Economia de memória (os apontadores são implícitos nesta estrutura).
• A lista pode ser percorrida em qualquer direção.
• A inserção de um novo item pode ser realizado após o último item com custo
constante.
Desvantagens:
• Custo para inserir ou retirar itens da lista, que pode causar um deslocamento de todos
os itens, no pior caso;
• Em aplicações em que não existe previsão sobre o crescimento da lista, a utilização de
arranjos em linguagens como o Pascal pode ser problemática porque neste caso o
tamanho máximo da lista tem de ser definido em tempo de compilação.
Estrutura
const
inicioarranjo=1;
maxtam=1000;
type
apontador= integer;
tipoitem= record
chave:string;
end;
tipolista= record
20
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
End;
End;
End;
program listarranjo;
uses crt;
const
inicioarranjo=1;
maxtam=100;
type
apontador=integer;
tipoitem= record
chave:string[15];
end;
tipolista= record
item: array [1..maxtam] of tipoitem;
primeiro:apontador;
ultimo:apontador;
end;
lista.item[lista.ultimo]:=x;
lista.ultimo:=lista.ultimo+1;
end;
end;
VAR
lista:tipolista;
x:tipoitem;
i,n:integer;
p:apontador;
begin
n:=1;
flvazia(lista);
while n <> 0 do
23
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
begin
clrscr;
writeln(' [0]- Sair');
writeln;
writeln(' [1]- Limpar lista');
writeln;
writeln(' [2]- Inserir elemento na lista');
writeln;
writeln(' [3]- Imprimir conteúdo da lista');
writeln;
writeln(' [4]- Retirar um elemento da lista');
writeln;
write('Entre com a opcao: ');
readln(n);
writeln;
case n of
1: flvazia(lista);
2: begin
write('Entre com um nome: ');
readln(x.chave);
insere(x,lista);
end;
3: imprime(lista);
4: begin
write('Entre com a posição do elemento a ser retirado: ');
readln(p);
retira(p,lista,x);
readln;
end;
end;
end;
readkey;
end.
imprime(listacop);
end;
Para chamar o procedimento junta; imprimir o conteúdo da listaj e inserir conteúdo na lista2:
7: begin
write('entre com o nome: ');
readln(x.chave);
insere(x,lista2);
end;
8: begin
junta(lista,lista2,listaj);
imprime(listaj);
end;
8- Operação Partir (Procedimento que parte uma lista em duas outras e limpa seu conteúdo)
end
else begin
listap2.item[listap2.ultimo]:=lista.item[i];
listap2.ultimo:=listap2.ultimo+1
end;
end;
flvazia(lista);
end;
i:integer;
encontrou:boolean;
begin
encontrou:=false;
for i:=lista1.primeiro to lista1.ultimo-1 do
begin
if lista1.item[i].cpf=x.cpf
then begin
encontrou:=true;
writeln('CPF encontrado na posicao:',' ',i);
writeln('O dono deste documento e:',' ',lista1.item[i].nome);
break;
end;
end;
if encontrou=false
then writeln('CPF nao encontrado');
readln;
end;
27
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
end;
end;
superior:=bolha;
end;
end;
Considerando que uma variável nada mais é que ma área de memória, dizemos que sua
alocação é estática. Se sua existência já era prevista no código do programa (durante toda a
execução, a quantidade de memória utilizada pelo programa não varia).
Por outro lado, se áreas de memória que não foram declaradas no programa, passam a existir
durante a sua execução, então dizemos que a alocação é dinâmica.
Program alocacao;
Var
X: integer; {aloca variável estaticamente}
P: ^ integer; {variável do tipo apontador}
Begin
X:= 2;
New (p); (aloca variável dinâmicamente}
P^ := 4;
End.
X p 1FFA
PONTEIROS EM PASCAL
28
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
var
pi: ^integer; {pi é um ponteiro para inteiro}
pr: ^real; {pr é um ponteiro para um real}
Depois de declarado, um ponteiro para uma variável de um determinado tipo, é possível criar,
dinamicamente, objetos deste tipo e atribuir seu endereço para este apontador.
A nova variável criada usando o procedimento padrão new():
Se p é um apontador para um objeto do tipo t, então
29
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
(4) begin
(5) new(p);
(6) p^:=3;
(7) q:=p;
(8) writeln(p^,’ ‘,q^);
(9) x:=7;
(10) q^:=x;
(11) writeln(p^,’ ‘,q^);
(12) new(p);
(13) p^:=5;
(14) writeln(p^,’ ‘,q^);
(15) end.
q
(9) Muda o conteúdo de q^ para x, que é 7. Como p e q apontam para o mesmo espaço de
memória, p^ e q^ agora valem 7.
x
p 7
7
q
(11) Cria nova variável inteira e coloca seu endereço em p;
x
p q
7 7
30
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
p q
5 7 7
Deve ser observado que o fato de criar uma nova variável apontado por um
ponteiro não libera o espaço ocupado pela alocação anterior com o procedimento new(p).
Embora o ponteiro exista durante toda a execução do programa, o espaço para o qual aponta
pode ser liberado para uso de outras variáveis através do procedimento dispose( ).
O procedimento dispose(p) libera o espaço de armazenamento utilizado por p.
Observe o exemplo abaixo:
(1) new(p);
(2) p^:=5;
(3) new(q);
(4) q^:=8;
(5) dispose(p); { apaga o endereço de p e o conteúdo pode ser sobrescrito}
(6) p:=q;
(7) new(q);
(8) q^:=6;
(9) writeln(p^, ‘ ’, q^);
p q
5 8
(5) Libera o espaço de armazenamento anteriormente reservado por p; p passa a não apontar
para nada, embora continue a existir como ponteiro;
p q
8
p
8
q
(7) e (8) Cria nova variável q^, e atribui o valor 6 à mesma.
q p
6 8
31
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
Observe a figura 2.2, veja que ela tem uma célula cabeça que aponta para a célula que contém
x1. Apesar da célula cabeça não conter informação é conveniente fazê-la com a mesma
estrutura que uma outra célula qualquer para simplificar as operações sobre a lista.
A lista é constituída de células, onde cada célula contém um item e um apontador para a
célula seguinte. As células vão sendo alocadas à medida que forem sendo necessárias na lista.
A célula que contém o elemento xn tem um apontador nulo(nil), ou seja, não aponta para
nada.
Quando a lista está vazia, a célula cabeça tem um apontador nulo (nil), ou seja, não existem
células.
A implementação através de apontadores permite inserir ou retirar itens do meio da lista a um
custo constante. Em aplicações em que não existe previsão sobre o crescimento da lista é
conveniente usar lista encadeadas por apontadores, porque neste caso o tamanho máximo da
lista não precisa ser definido a priori.
A maior desvantagem deste tipo de implementação é a utilização de memória extra para
armazenar os apontadores.
célula = Record
item: tipoitem;
prox: apontador;
end;
Tipolista = Record
primeiro: Apontador;
Ultimo: apontador;
end;
1- Procedimento para fazer a lista ficar vazia, ou seja, ter só a célula cabeça:
Procedure Flvazia(var lista:tipolista);
Begin
New(lista.primeiro);
Lista.ultimo:=lista.primeiro;
Lista.primeiro^.prox:=nil;
End;
readln(x.nome);
Insere (x, lista);
End;
FILA
Uma fila é uma lista linear em que todas as inserções são realizadas em um extremo da lista, e
todas as retiradas e geralmente todos os acessos são feitos no outro extremo da lista.
O modelo intuitivo de uma fila é o de uma fila de espera em que as pessoas no início da fila
(que chegaram primeiro) são servidas primeiro e as pessoas que chegam entram no fim da
fila.
As FILAS possuem a seguinte propriedade:
• o primeiro item a ser inserido é o primeiro item que pode ser retirado da lista.
• Por esta razão as pilhas são chamadas de fifo, termo formado a partir de “first-in, first-
out).
35
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
Aplicações:
Sistemas operacionais utilizam filas para regular a ordem na qual tarefa deve receber
processamento e recursos devem ser alocados a processos. Fila de Prioridades em algoritmos
específicos.
36
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
Observe que para a representação circular da figura acima existe um pequeno problema: não
há forma de distinguir uma fila vazia de uma fila cheia, pois nos dois casos os apontadores
frente e trás apontam para a mesma posição no círculo. Uma saída é não utilizar todo o espaço
disponível no array, deixando uma posição vazia. Neste caso a fila está cheia quando (trás + 1
= frente), o que significa que existe uma célula vazia entre o fim e o início da fila.
38
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
3: begin
desenfileira(fila,x);
writeln('O item desenfileirado foi:', x.nome);
readln;
end;
Assim como em todas as outras implementações deste capítulo, uma célula cabeça é mantida
para facilitar a implementação das operações Enfileira e Desenfileira quando a fila está vazia,
conforme mostra a figura abaixo.
Quando a fila está vazia os apontadores Frente e Trás apontam para a célula cabeça.
Para enfileirar um novo item basta criar uma célula nova, ligá-la após a célula que contém xn e
colocar nela o novo item.
Para desenfileirar o item x1 basta desligar a célula cabeça da lista e a célula que contém x1
passa a ser a célula cabeça.
39
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
A fila é implementada através de células, onde cada célula contém um item da fila e um
apontador para outra célula.
O registro do tipoFila contém um apontador para frente da fila (célula cabeça) e um apontador
para a parte de trás da fila.
As quatro operações definidas sobre o TipoFila por apontadores podem ser implementadas,
conforme segue abaixo:
41
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
42
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
end;
then begin
desenfileira (fila2, item);
enfileira (item, fila3);
end;
end;
end;
PILHAS
Existem aplicações para listas lineares nas quais: inserções, retiradas e acessos a itens
ocorrem sempre em um dos extremos da lista.
Uma pilha é uma lista linear em que todas as inserções, retiradas e geralmente todos os
acessos são feitos em apenas um extremo da lista.
Os itens de uma pilha estão colocados um sobre o outro, com o item inserido mais
recentemente no topo e o item inserido menos recentemente no fundo. O modelo intuitivo de
pilha é o de um monte de pratos em uma prateleira, sendo conveniente retirar os pratos ou
adicionar novos pratos na parte superior.
As pilhas possuem a seguinte propriedade:
• o último item inserido é o primeiro item que pode ser retirado da lista.
Por esta razão as pilhas são chamadas de lifo, termo formado a partir de “last-in, first-out).
Um tipo abstrato de dados PILHA, acompanhado de um conjunto de operações, é apresentado
a seguir:
1. FPVazia(pilha). Faz a pilha ficar vazia.
2. Vazia(pilha). Função que retorna true se pilha estiver vazia; senão retorna false.
3. Empilha(x,pilha). Insere o item x no topo da pilha.
4. Desempilha(pilha,x). Retorna o item x no topo da pilha, retirando-o da pilha.
5. Tamanho(Pilha). Esta função retorna o número de itens da pilha.
44
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
Como em uma pilha as inserções e retiradas ocorrem no topo da pilha, um cursor chamado
topo é utilizado para controlar a posição do item no topo da pilha.
Itens
MAXTAM
...
TOPO xn
...
2 X2
Primeiro=1 X1
Os itens são armazenados em um array de tamanho suficiente para armazenar a pilha. O outro
campo do mesmo registro contém um apontador para o item no topo da pilha. A constante
MAXTAM define o tamanho máximo permitido para pilha.
Begin
tamanho:= pilha.topo;
End;
Assim como na implementação de listas lineares através de apontadores, uma célula cabeça é
mantida no topo da pilha para facilitar a implementação das operações empilha e desempilha
quando a pilha está vazia, conforme mostra a figura abaixo:
47
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
Para desempilhar o item xn da figura basta desligar a célula cabeça da lista e a célula que
contém xn passa a ser a célula cabeça. Para empilhar um novo item basta fazer a operação
contrária, criando uma nova célula cabeça e colocando o novo item na antiga célula cabeça. O
campo tamanho existe no registro tipoPilha por questão de eficiência, para evitar a contagem
do número de itens da pilha na função tamanho.
Cada célula de uma pilha contém um item da pilha e um apontador para outra célula. O
registro TipoPilha contém um apontador para o topo da pilha (célula cabeça) e um apontador
para o fundo da pilha.
Type
Apontador = ^celula;
Tipoitem = Record
chave:tipochave; {pode colocar vários elementos:idade,nome,etc}
end;
Celula = Record
item: TipoItem;
Prox: Apontador;
End;
48
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
TipoPilha = Record
fundo: apontador;
topo: apontador;
tamanho: integer;
end;
49
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
2: begin
writeln;
write('Digite o nome: ');
readln(x.nome);
empilha(x,pilha);
end;
50
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
var
aux:apontador; tam:integer;
begin
aux:=pilha.topo^.prox;
if vazia(pilha)
then writeln('pilha vazia!')
else begin
while aux<>nil do
begin
writeln;
writeln(aux^.item.nome);
aux:=aux^.prox;
end;
end;
readln;
end;
aux:apontador;
encontrou:boolean;
begin
encontrou:=false;
aux:=pilha.topo^.prox;
while aux<> nil do
begin
if aux^.item.cpf=x.cpf
then begin
encontrou:=true;
writeln('CPF encontrado ');
writeln('O dono deste documento e:',' ',aux^.item.nome);
break;
end;
aux:=aux^.prox;
end;
if encontrou=false
then writeln('CPF nao encontrado');
readln;
end;
9- Inverte a pilha
52
ESCOLA ESTADUAL JOSÉ MONTEIRO
CURSO TÉCNICO EM INFORMÁTICA
DISCIPLINA: ALGORITMO E ESTRUTURA DE DADOS II
53