Академический Документы
Профессиональный Документы
Культура Документы
Listas Lineares
Fundamentos
Uma lista linear uma coleo L:[a1, a2, ..., an], 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: a1 o primeiro elemento de L; an o ltimo elemento de L; ak , 1<k<n, precedido pelo elemento ak-1 e seguido por ak+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).
Pgina 1
Listas Lineares
LISTA
PILHA
FILA
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 Esttica Dinmica Esttica Sequencial Dinmica Sequencial Encadeada Esttica Encadeada Dinmica Encadeada
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:
Pgina 2
Listas Lineares k ... ai-1 ai k Endereo (ai ) = Endereo (ai-1 ) = - k Endereo (ai+1) = + k +k ai+1
De forma genrica, assumindo que o elemento a1 encontra-se na clula de endereo B, temos a equao: ai = B+(i-1)k. ... B+0k B+1k b+2k a1 a2 a3 ... B+(i-1)k ... ai |--k--| B+(i-1)k an ...
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.
Pgina 3
Listas Lineares 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?
Pgina 4
Listas Lineares
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 ().
Contedo
a1 a2 1C34 BD2F Primeiro elemento, acessvel a partir de L . Note que o segundo elemento no ocupa a um endereo consecutivo quele ocupado por a1 .
a3
AC12
ai an-2 an-1 an
ltimo elemento da cadeia, o endereo nulo indica que o elemento an 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 a2 da lista representada no esquema acima, basta mudar o nodo no endereo 3FFA de (a1, 1C34) para (a1, 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. Pgina 5
Listas Lineares
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.
Pgina 6
Listas Lineares 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'; { mostra os elementos da lista L} for i:=1 to 8 do Writeln(L[i]);
L[5]:='e';
L[6]:='g';
L[7]:='d';
L[8]:='b';
{ valores iniciais necessrios para o vetor Li } Li[1]:=8; Li[2]:=2; Li[3]:=7; Li[4]:=5; Li[5]:=4; mostraLista; readkey; clrscr;
Li[6]:=6;
Li[7]:=1;
Li[8]:=0;
{ 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. Pgina 7
Listas Lineares
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 b) Lista de valores inteiros 4587 1254 5687 c) Lista de estados do Brasil SP RJ SC Lucas 2542 AM Maria 3658 PE Pedro 9574 DF Andr 5826 TO Jonas 5479 PR
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 C[i]:=L[i]; for a:=1 to 10 do begin { copia o vetor em um auxiliar }
Pgina 8
Listas Lineares
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.
Pgina 9