Vous êtes sur la page 1sur 9

Listas Lineares Professor Srgio Furgeri

Pgina 1
Listas Lineares

Fundamentos

Uma lista linear uma coleo L:[a
1
, a
2
, ..., a
n
], n 0, cuja propriedade estrutural baseia-se apenas
na posio relativa dos elementos, que so dispostos linearmente. Se n=0, dizemos que a lista L
vazia; caso contrrio, so vlidas as seguintes propriedades:
a
1
o primeiro elemento de L;
a
n
o ltimo elemento de L;
a
k
, 1<k<n, precedido pelo elemento a
k-1
e seguido por a
k+1
em L.


Diversas operaes que podemos realizar sobre listas:

acessar um elemento qualquer da lista;
inserir um elemento numa posio especfica da lista;
remover um elemento de uma posio especfica da lista;
combinar duas listas em uma nica;
particionar umalista em duas;
obter cpias de uma lista;
determinar o total de elementos na lista;
ordenar os elementos da lista;
procurar um determinado elemento na lista;
apagar uma lista;
outras...

Considerando-se somente as operaes de acesso, insero e remoo, restritas aos extremos da lista,
temos casos especiais que aparecem muito frequentemente na modelagem de problemas a serem
resolvidos por computador. Tais casos especiais recebem tambm nomes especiais:
Pilha: lista linear onde todas as inseres, remoes e acessos so realizados em um
nico extremo. Listas com esta caracterstica so tambm denominados listas LIFO
(Last-In / First-Out, ou em portugus: ltimo que entre / primeiro que sai).
Fila: lista linear onde todas as inseres so feitas num certo extremo e todas as
remoes e acessos so realizados no outro. Filas so tambm denominadas listas
FIFO (First-In / First-Out, ou em protugus, primeiro que entra / primeiro que sai).
Fila Dupla: lista linear onde as inseres, remoes ou acessos so ralizados em
qualquer extremo. Filas Duplas so tambm denominadas DEQUE (Double-Ennded
QUEue, ou em portugus: fila de extremidade dupla). Uma Fila Dupla pode ainda
gerar dois casos especiais: Fila Dupla de Entrada Restrita (se a insero for restrita a
um nico extremo) e Fila Dupla de Sada Restrita (se a remoo for restrita a um
nico extremo).




Listas Lineares Professor Srgio Furgeri
Pgina 2








extremamente difcil de se obter uma implementao onde todas as operaes sejam com a mesma
eficincia. Por exemplo, uma implementao que facilite o acesso a qualquer elemento da lista,
certamente dificultar a insero e a remoo de elementos no meio da mesma, como veremos
futuramente.Diante deste problema, estudaremos algumas alternativas de como implementar listas
lineares na memria do computador. Assim, dependendo das operaes realizadas com maior
freqncia, podemos fazer escolhas que tornem a nossa aplicao a mais eficiente possvel.

Alocao de Memria

Ao desenvolver uma implementaao para listas lineares, o primeiro problema que surge : como
podemos armazenar os elementos da lista, dentro do computador?
A alocao de memria, do ponto de vista do programador, ester em uma das quatro categorias
apresentadas a seguir:

Sequencial Encadeada
Esttica Esttica Sequencial Esttica Encadeada
Dinmica Dinmica Sequencial Dinmica Encadeada


Alocao Esttica versus Dinmica

Dizemos que as variveis de um programa tm alocao esttica se a quantidade total de memria
utilizada pelos dados previamente conhecida e definida de modo imutvel, no prprio cdigo-fonte
do programa. Durante toda a execuo, a quantidade de memria utilizada pelo programa no varia.
Por outro lado, se o programa capaz de criar novas variveis enquanto executa, isto , se reas de
memria que no foram declaradas no programa passam a existir durante a sua execuo, ento
dizemos que a alocao dinmica. Os atributos seqencial e encadeada s fazem sentido se a
memria considerada for armazenar uma coleo de objetos.

Alocao Sequencial

A forma mais natural de armazenar uma lista dentro do computador consiste em colocar os seus
elementos em clulas de memria consecutivas, um aps o outro. Assim, se cada clula tem um
endereo nico e utiliza k bytes, temos:


LISTA
PILHA FILA FILA DUPLA
FDER FDSR
Listas Lineares Professor Srgio Furgeri
Pgina 3
k + k


...

k

Endereo (a
i
) =
Endereo (a
i-1
) = - k
Endereo (a
i+1
) = + k

De forma genrica, assumindo que o elemento a1 encontra-se na clula de endereo B, temos a
equao: a
i
= B+(i-1)k.

B+0k B+1k b+2k B+(i-1)k B+(i-1)k
... a1 a2 a3 ... a
i
... a
n
...
|--k--|

A maior vantagem no uso de uma rea seqencial de memria para armazenar uma lista linear que,
dado o endereo inicial de cada rea alocada e o ndice i de um elemento qualquer da lista, podemos
acess-lo imediatamente. O ponto fraco desta forma de armazenamento aparece quando precisamos
inserir ou suprimir elementos do meio da lista.

Cada elemento de uma lista linear chamado de N.

Exemplo de uma lista Linear Seqencial em Pascal:

Criar uma lista em Pascal que armazene os seguintes dados sobre 4 pessoas: Cdigo de identificao,
nome, naturalidade, estado e Nascimento.

O programa deve permitir a digitao dos dados das 4 pessoas e a seguir possibilitar a busca dos
dados de uma das pessoas atravs de seu cdigo de identificao.

program pessoas;
uses crt;
type
Tdados_pessoais=record {armazena a tabela com os dados pessoais}
pessoaid:integer;
nome:string;
naturalidade:string;
uf:string[2];
nasc:string[10];
end;

var
iProcura, iNoh:integer;
a
i-1
a
i
a
i+1

Listas Lineares Professor Srgio Furgeri
Pgina 4
dados_pessoais:array[1..4] of Tdados_pessoais;
i:integer;
const
count=4;

function busca(ipessoaid:integer):integer;
var
i:integer;
begin
for i:=1 to count do
if dados_pessoais[i].pessoaid=ipessoaid then
begin
busca:=i;
exit;
end;
end;

begin
clrscr;
{Le a tabela}
for i:=1 to count do
begin
Writeln('Digite os dados da pessoa ',i);
Writeln;
write('Codigo......... :'); readln(dados_pessoais[i].pessoaid);
write('Nome........... :'); readln(dados_pessoais[i].nome);
write('Naturalidade... :'); readln(dados_pessoais[i].naturalidade);
write('UF............. :'); readln(dados_pessoais[i].uf);
write('Nascimento..... :'); readln(dados_pessoais[i].nasc);
clrscr;
end;

writeln('Digite a chave procurada');
readln(iprocura);
iNoh:=busca(iprocura);
writeln('A chave eh: ', iNoh);
writeln('Identificacao...:', dados_pessoais[iNoh].pessoaid);
writeln('Nome............:', dados_pessoais[iNoh].nome);
writeln('Naturalidade....:', dados_pessoais[iNoh].naturalidade);
writeln('Estado..........:', dados_pessoais[iNoh].uf);
writeln('Nascimento......:', dados_pessoais[iNoh].nasc);

readkey;
end.

Como fazer para mostrar todas as pessoas cadastradas?
Como fazer para remover a 2 pessoa da lista?
Listas Lineares Professor Srgio Furgeri
Pgina 5
Alocao Encadeada

Ao invs de manter os elementos agrupados numa rea contnua de memria, isto , ocupando clulas
consecutivas, na alocao encadeada os elementos podem ocupar quaisquer clulas (no
necessariamente consecutivas) e, para manter a relao de ordem linear, juntamente com cada
elemento armazenado o endereo do prximo elemento da lista.
Desta forma, na alocao encadeada, os elementos so armazenados em blocos de memria
denominados nodos, sendo que cada nodo composto por dosi campos: um para armazenar dados e
outro para armazenar endereo.
Dois endereos especiais devem ser destacados:
O enero do primeiro elemento da lista (L);
O endereo do elemento fictcio que segue o ltimo elemento da lista ().

Endereo Contedo

L= 3FFA Primeiro elemento, acessvel a partir de L .

1C34 Note que o segundo elemento no ocupa a um
endereo consecutivo quele ocupado por a
1
.
...
BD2F
...

1000 Cada nodo armazena um elemento e o
endereo do prximo elemento da lista.

5670

14F6


5D4A ltimo elemento da cadeia, o endereo nulo indica
que o elemento a
n
no tem um sucessor


A alocao encadeada apresenta com maior vantagem a facilidade de inserir ou remover elementos do
meio da lista. Como os elementos no precisam estar armazenados em posies consecutivas de
memria, nenhum dado precisa ser movimentado, bastando atualizar o campo de ligao do elemento
que precede aquele inserido ou removido. Por exemplo, para remover o elemento a
2
da lista
representada no esquema acima, basta mudar o nodo no endereo 3FFA de (a
1,
1C34) para (a
1,
BD2F). Como apenas o primeiro elemento acessvel diretamente atravs do endereo L, a grande
desvantagem da alocao encadeada surge quando desejamos acessar uma posio especfica dentro
da lista. Neste caso, devemos partir do primeiro elemento e ir seguindo os campos de ligao, um a
um, at atingir a posio desejada. Obviamente, para listas externas, esta operao pode ter um alto
custo em relao a tempo.
a
1
1C34
a
2
BD2F
a
3
AC12
a
i
3A7B
a
n-2
14F6
a
n-1
5D4A
a
n

Listas Lineares Professor Srgio Furgeri
Pgina 6

Exerccios com listas lineares

1. Uma aplicao precisava de uma estrutura de dados para representar com eficincia um estante de
livros, dentro do computador, para efeito de algumas simulaes. O programador resolveu representar
a estante por uma lista linear E:[P
1
, P
2
, ...,

P
n
], onde cada elemento P
i
uma prateleira, tambm
representada por uma lista P
i
:[L
1
, L
2
, ..., L
m
], cujos elementos L
j
so livros. Considerando as
caractersticas fsicas dos objetos, que categoria de alocao voc escolheria para representar cada
uma das listas? Justifique suas escolhas.

R: Segundo o enunciado, a estante de livros E representada por uma lista linear [P
1
, P
2
, ...,

P
n
], onde
cada P
i
uma prateleira representada por outra lista [L
1
, L
2
, ..., L
m
], tal que cada L
j
um livro
qualquer. Admita que o nmero de prateleiras numa estante fixo, e que o nmero de livros
varivel. Assim, seria adequado implementar a lista E usando alocao esttica seqencial, pois
podemos prever o total de prateleiras em cada estante no momento em que escrevemos o programa
simulador. J as listas P
i
deveriam ser implementadas usando-se alocao dinmica encadeada, pois
alm de no sabermos de antemo qual a quantidade exata de livros em cada prateleira, eles estaro
constantemente sendo retirados e recolocados nas estantes, o que caracteriza uma coleo com
ordenao altamente dinmica.

Este exerccio mostra a relevncia dos aspectos fsicos dos objetos, cujas abstraes pretendemos
manipular num programa, na hora em que temos que decidir qual categoria de alocao
empregaremos para represent-los!

2. Por que motivo as listas devem ser implementadas na forma seqencial, quando acessar um
elemento arbitrrio for uma operao muito requisitada?
Porque basta indicar seu endereo, uma vez que no necessrio ler toda a lista.

3. Por que motivo os valores L e so considerados especiais no esquema de alocao encadeada ?
Porque o L contem o endereo do primeiro elemento da lista e o o ltimo.

4. Considere as variveis representadas a seguir, onde L um inteiro, D um vetor de caracteres e i
um valor de inteiros:



Sabendo-se que as variveis acima representam, de forma encadeada e esttica, a lista linear L:[a, b,
c, d, e, f, g, h]:
a) Qual o valor que deve estar armazenado na varivel L? (3)
b) Quais os valores armazenados no vetor I? (8, 2, 7, 5, 4, 6, 1, 0)
c) Quais as instrues necessrias para remover o elemento c da lista?
d) Como inserir outro elemento b no lugar do c que foi removido?
e) Se um elemento est na posio p, como encontrar seu predecessor? Basta ler o ndice de I-1
f) Codifique uma rotina em pascal para imprimir os elementos da lista L em ordem e resolver
todas as questes acima.

L: ? D: h c a f e g d b I: ? ? ? ? ? ? ? ?
Listas Lineares Professor Srgio Furgeri
Pgina 7
Implementao em pascal do exerccio 4.
program lista1;
uses crt;
var
primElemento, i:Integer;
L:array [1..8] of char;
Li:array [1..8] of integer;

procedure mostraLista;
begin
Writeln(L[primElemento]);
for i:=1 to 8 do
begin
if Li[i]=0 then break;
Writeln(L[Li[i]]);
end;
end;

begin
clrscr;
primElemento:=3;
L[1]:='h'; L[2]:='c'; L[3]:='a'; L[4]:='f'; L[5]:='e'; L[6]:='g'; L[7]:='d'; L[8]:='b';
{ mostra os elementos da lista L}
for i:=1 to 8 do
Writeln(L[i]);

{ valores iniciais necessrios para o vetor Li }
Li[1]:=8; Li[2]:=2; Li[3]:=7; Li[4]:=5; Li[5]:=4; Li[6]:=6; Li[7]:=1; Li[8]:=0;
mostraLista;
readkey;
clrscr;

{ soluo da questo C: para remover o elemento 'c' da lista necessrio mover os ndices }
for i:=2 to 7 do
Li[i]:=Li[i+1];
mostraLista;
readkey;
clrscr;

{ soluo da questo D }
for i:=8 downto 3 do
Li[i]:=Li[i-1];
Li[2]:=8;
mostraLista;

readkey;
end.
Listas Lineares Professor Srgio Furgeri
Pgina 8

Exerccios referentes a listas encadeadas.

Fazer um programa em pascal para classificar os vetores seguintes atravs da utilizao de um vetor
auxiliar.

a) Lista de nomes de pessoas.
Paulo Tiago Joo Lucas Maria Pedro Andr Jonas

b) Lista de valores inteiros
4587 1254 5687 2542 3658 9574 5826 5479

c) Lista de estados do Brasil
SP RJ SC AM PE DF TO PR


Simulao do uso de listas encadeadas na criao de arquivos de ndice.

O arquivo seguinte usa trs vetores para simular a criao de arquivos de ndices usados em tabelas de
dados.

program lista2; { esse programa simula a criao de um arquivo de ndice }
uses crt;

var
i,a,b:Integer;
L:array [1..10] of string;
C:array [1..10] of string;
V:array [1..10] of integer;
nomeMenor:String;
indiceMenor:Integer;

begin
clrscr;
{ Entrada dos elementos da lista - os nomes podem ser variveis }
L[1]:='Helena';
L[2]:='Jimena';
L[3]:='Fabio';
L[4]:='Ana';
L[5]:='Elaine';
L[6]:='Bruno';
L[7]:='Sandra';
L[8]:='Paulo';
L[9]:='Monica';
L[10]:='Klauss';
{ ------------------------------------------------------------- }

for i:=1 to 10 do { copia o vetor em um auxiliar }
C[i]:=L[i];

for a:=1 to 10 do
begin
Listas Lineares Professor Srgio Furgeri
Pgina 9
nomeMenor:='ZZ';
for b:=1 to 10 do
begin
if (nomeMenor > C[b]) and (C[b]<>'*') then
begin
nomeMenor := C[b];
indiceMenor:=b;
end;
end;
V[a]:=indiceMenor;
C[indiceMenor]:='*';

{ trecho apenas ilustrativo, passo a passo a busca dos nomes }
clrscr;
for i:=1 to 10 do
writeln(i,' ',C[i]);
readkey;
{ ---------------------------------------------------------- }
end;

{ mostra a lista L ordenada atravs do vetor V }
for i:=1 to 10 do
writeln(L[V[i]]);
{ -------------------------------------------- }
readkey;
end.

Exerccio:

Crie um programa em pascal que receba uma lista de dados sobre 5 produtos. Cada produto deve
conter cdigo, nome, qtde em estoque e preo unitrio. Depois de receber os dados referentes ao
produto, o programa deve mostrar um menu na tela de forma a permitir ao usurio a classificao dos
produtos de acordo com as opes apresentadas a seguir:
1 classificar por cdigo
2 classificar por nome
3 classificar por quantidade em estoque
4 classificar por preo unitrio.

Esses itens referem-se simulao de 4 arquivos de ndice para os produtos.

Vous aimerez peut-être aussi