Você está na página 1de 44

Resumo terico

Uma lista uma estrutura que armazena elementos que so acessveis um aps o outro, em ordem estritamente linear. So estruturas formadas por um conjunto de dados de forma a preservar a relao de ordem linear entre eles. Como exemplo de uma lista, podemos destacar uma lista de empregados de uma determinada empresa, uma lista de peas de uma revendedora, uma lista de compras de supermercado, etc. Uma lista composta por elementos, comumente chamados de ns, os quais podem conter cada um deles, um dado primitivo ou composto.

Uma lista composta por elementos, comumente chamados de ns, os quais podem conter cada um deles, um dado primitivo ou composto, como mostra a figura abaixo:

Representao de um n de uma lista.

DEFINIO: Uma lista linear um conjunto de n ns (n >=0) x1, x2, x3,..., xn, organizados estruturalmente de forma a refletir as posies relativas dos mesmos: Se n>0 ento x1 o primeiro n; para 1<k<n, tem-se que o n xk precedido pelo n xk-1 e sucedido pelo n xk+1; e xn o ltimo n. Caso n=0, a lista considerada vazia. A figura abaixo esboa esta configurao.

Representao de uma lista linear

Uma vez definido que um conjunto de dados ser representado sob a forma de uma lista linear, precisamos decidir as operaes possveis de serem implementadas sobre esta lista de dados.

As operaes mais comuns so: Criar uma lista vazia. Verificar se uma lista est vazia. Determinar o nmero de ns de uma lista. Inserir um novo n na lista (antes ou depois do k-simo n). Acessar o k-simo n da lista. Obter a posio de um n da lista cujo valor fornecido. Remover um n da lista. Dividir uma lista em dois ou mais listas. Concatenar duas listas. Exibir todos os ns de uma lista.

Existem vrias formas possveis de se representar internamente uma lista linear. A escolha de uma dessas formas depender da frequncia com que determinadas operaes sero executadas sobre a lista, uma vez que algumas representaes so favorveis a algumas operaes, enquanto que outras no o so, no sentido de exigir maior esforo computacional para sua execuo.

uma lista pode ser representada, basicamente, de duas formas:

Sequencial ou

por Contiguidade dos ns

Uma lista com representao sequencial ou por contiguidade caracterizada por seus ns serem implementados de forma consecutiva na memria fsica. Assim, este tipo de lista explora a sequencialidade da memria do computador, de tal forma que seus ns sejam armazenados em endereos sequenciais, ou igualmente distanciados um do outro. Pode ser representada por um vetor na memria principal ou um arquivo sequencial em memria secundria.

Representao de uma lista por contiguidade dos ns.

Uma lista com representao por encadeamento caracterizada por seus ns serem implementados em qualquer posio na memria fsica, porm, cada n, alm de possuir a sua informao especfica, contm, tambm, um ponteiro (endereo na memria) do prximo n da sequncia, como mostra a figura:

Representao de uma lista por encadeamento dos ns

Uma lista com representao sequencial um conjunto de registros (ns) onde esto estabelecidas regras de precedncia, de tal forma que esses ns sejam armazenados em endereos contguos ou igualmente distanciados um do outro.

A relao de ordem entre os ns da lista representada pelo fato de que se o endereo do n xi conhecido, ento o endereo do n xi+1 pode ser determinado.

Lista sequencial.

Se o endereo do n xi conhecido e tomado como referncia, podemos chegar tambm a todos os outros ns da lista.

Dessa forma, as seguintes caractersticas podem ser destacadas:


Os ns na lista esto armazenados na memria fisicamente em posies consecutivas. A insero de um novo n na posio i causa o deslocamento direita do n xi ao ltimo. A remoo de um n da posio i causa o deslocamento esquerda do n xi+1 ao ltimo.

Uma lista sequencial pode ser considerada vazia ou pode ser escrita como uma sequncia de ns pertencente a um mesmo conjunto.

Listas sequenciais um tipo abstrato de dados adequado quando se trata de listas pequenas, com tamanhos bem definidos e inseres/remoes no final da lista. A principal vantagem de se utilizar listas sequenciais que podemos ter acesso direto indexado a qualquer n da lista. Porm, devido s suas caractersticas estticas, uma lista sequencial dever possuir um tamanho mximo pr-definido, alm de exigir vrias movimentaes nas operaes de incluso/remoo aleatrias, o que passa a ser desvantajoso quando tratamos de listas com tamanhos elevados.

Uma lista linear sequencial definida como um vetor, no qual tipo o tipo de dado a ser representado em cada n da lista (tipos de dados dependente da linguagem de programao). Dessa forma, temos:

Constante m = 100 //nmero de ns de uma lista Tipo Lista = vetor [1..m] de tipo;

atravs deste procedimento possvel acessar qualquer n de uma lista sequencial.


Procedimento acessar(L: Lista; k,N: inteiro; ref dado: tipo) // L o tipo Lista, k ser utilizado para ndice, N referente quantidade //de elementos no vetor e dado a varivel que guarda a informao da lista Incio //teste para evitar escolher uma posio que no pertena ao vetor se (k <= 0) ou (k > N) ento imprima(Dimenso invalida); seno dado = L[k]; fim

atravs deste procedimento possvel alterar o valor (dado) de qualquer elemento da lista sequencial.
Procedimento alterar(L: Lista; k,N: inteiro; ref dado: tipo) Incio //teste para evitar escolher uma posio que no pertena ao vetor se (k <= 0) ou (k > N) ento imprima(Dimenso invalida); seno L[k] = dado; fim

a insero de um novo n em uma lista sequencial pode ocorrer antes do primeiro Elemento ou antes do k-simo elemento. O procedimento a seguir mostra a insero de um novo elemento antes do k-simo elemento fornecido.
Procedimento inserir(L: Lista; k,N: inteiro; ref dado: tipo) Incio varivel i : inteiro; //teste para evitar escolher uma posio que no pertena ao vetor se (k <= 0) ou (k > N) ento imprima(Dimenso invalida); seno para i de fim at k passo -1 faa L[i+1] = L[i]; N = N + 1; // define um elemento a mais no vetor L[k] = dado; fim

este procedimento responsvel por remover o n k especificado da lista sequencial.


Procedimento remover(L: Lista; k,N: inteiro; ref dado: tipo) Incio varivel i : inteiro; //teste para evitar escolher uma posio que no pertena ao vetor se (k <= 0) ou (k > N) ento imprima(Dimenso invalida); seno para i de k at fim passo -1 faa L[i] = L[i+1]; N = N - 1; // define um elemento a menos no vetor fim

explique a finalidade da estrutura de repetio (para) nos procedimentos de insero e remoo de ns na lista sequencial. elabore um procedimento de insero no inicio de uma lista sequencial.

Uma forma de permitir o crescimento dinmico do comprimento mximo da lista, ou seja, medida que for necessrio mais espao fsico de memria para crescimento, este espao vai sendo alocado em tempo de execuo, bem como diminuir o esforo computacional das operaes de insero e remoo, representar a lista por ENCADEAMENTO.

Na lista por encadeamento, os ns so ligados entre si para indicar a relao existente entre eles (relao de ordem). Cada n da lista dever conter alm das informaes respectivas, uma indicao ao n seguinte. Essas listas so chamadas de listas encadeadas (ligadas), tambm conhecidas como lista simplesmente encadeada.

Para manipular uma estrutura sem ter de alterar todos seus vizinhos, precisamos de algo que no seja fixo. Um vetor uma estrutura fixa na memria, precisamos sempre empurrar todos seus vizinhos para um lado para conseguir espao, ou para remover algum dos elementos, para no deixar espaos vazios.

O elemento bsico de uma lista encadeada o n. Cada n da lista formado por uma parte que armazena dados e outra que armazena campo de ligao. O campo de ligao de uma lista encadeada possui o endereo de memria fsica onde o prximo n est armazenado, permitindo assim o encadeamento (ordem de acesso) dos dados e possibilitando a implementao de listas encadeadas.

N de uma lista encadeada

Numa lista encadeada, para cada novo n inserido, alocamos um espao de memria para armazen-lo. Desta forma, o espao total de memria gasto pela lista proporcional ao nmero de ns nela armazenado.

Lista encadeada com 5 ns alocados.

No entanto, no podemos garantir que os elementos armazenados na lista ocuparo um espao de memria contguo, portanto no temos acesso direto aos elementos da lista.

Para que seja possvel percorrer todos os elementos desta lista, devemos explicitamente guardar o encadeamento dos ns (ordenamento), o que feito armazenando-se, junto com a informao de cada elemento, uma referncia para o prximo elemento da lista.

A principal vantagem de se utilizar listas encadeadas est no fato de no ser preciso reservar uma rea de memria com tamanho fixo. Alm disso, nas operaes de insero/remoo no necessrio deslocamentos na lista. Entretanto, um n da lista encadeada ocupa mais espao em memria do que um elemento (n) de um vetor, devido necessidade de guardar informaes a mais (referncia para o prximo n da lista, por exemplo).

Embora este espao a mais no ocupe um espao muito grande, existe este gasto a mais de memria. Alm disso, o acesso a um n da lista encadeada geralmente mais demorado que em um vetor. Assim, o acesso a um n de um vetor direto ou indexado, enquanto que para acessar um n de uma lista necessrio percorrer todos os ns da lista at chegar ao n desejado.

Supondo que cada n da lista encadeada contenha uma varivel dado (que guarda a informao desta lista, o qual seu tipo dependente da linguagem de programao utilizada) e uma varivel prximo, varivel utilizada para fazer referncia ao prximo n da sequncia, podemos definir um n desta lista como a seguir.
Tipo no::reg(dado: tipo; proximo:ref no);

Desta forma, cada novo n da lista ser um agregado do tipo registro, contendo dois campos: um para a informao (dado) e o outro para a referncia ao prximo n do encadeamento (prximo), como mostra a figura:

N de uma lista encadeada com a referncia para prximo n.

Em JAVA, podemos definir a classe n como sendo:


class No { public int dado; //um n com dado inteiro public No prximo; //referncia para o prximo n }

Para que seja possvel implementar esta estrutura, devemos ter uma varivel do tipo referncia a n, para indicar o incio da lista encadeada.
varivel incio:ref n; private No inicio; //em JAVA

Antes de iniciar o procedimento de insero de novos elementos na lista, a varivel incio precisa ser iniciada com valor vazio (NIL), indicando que a lista est fazia.
incio = NIL; inicio = null; //em JAVA

Note que a varivel incio deve sempre apontar para o incio da lista, informando onde a lista encadeada comea, no sendo necessrio armazenar nenhum valor de informao, como mostra a figura:

Quando se deseja inserir um novo n na lista, primeiramente, preciso alocar um espao de memria para o referido n, que chamaremos de n p:
var p: ref n; alocar(p);

e, em seguida, definir os valores da Informao e da referncia deste novo n p. :


p.dado p.prximo
estruturas de atribuio de valores para o n

H duas alternativas para implementao de operaes de listas encadeadas:


Utilizando vetores estticos ou Utilizando alocao dinmica.

Entretanto, no h vantagem na implementao da lista encadeada com vetores, uma vez que permanece o problema do tamanho mximo da lista predefinido alm da necessidade de utilizar mais espao para armazenar os endereos dos elementos sucessores. Portanto, vamos utilizar implementao dinmica para as nossas listas encadeadas.

O procedimento a seguir mostra a definio e criao de uma lista simplesmente encadeada, inicialmente, sem nenhum n alocado.
Tipo n::reg(dado: tipo, prximo:ref n), Incio varivel incio: ref n; incio = NIL; fim

Os passos a seguir so suficientes para inserir um novo elemento sempre no incio da lista simplesmente encadeada.
(1) (2) (3) (4) (5)

varivel p: ref n; alocar(p); p.prximo = incio; incio = p; p.dado = valor; //valor a ser armazenado neste n

Considerando que j exista uma lista simplesmente encadeada com apenas dois ns alocados, estes passos produzem o desencadeamento de uma srie de etapas descrita a seguir: (1) nesta linha definido um novo n chamado de p. (2) neste momento, o n p alocado e reservado um espao de memria fsica suficiente para guardar todas as suas informaes. (3) esta linha, faz com que a referncia prximo do novo n aponte para onde a varivel incio estava referenciando. (4)por fim, a varivel incio passa a apontar para o novo n alocado, indicando o novo incio da lista

(2) neste momento, o n p alocado e reservado um espao de memria fsica suficiente para guardar todas as suas informaes. (2) alocar(p); (3) esta linha, faz com que a referncia prximo do novo n aponte para onde a varivel incio estava referenciando. (3) p.prximo = incio;

(4)por fim, a varivel incio passa a apontar para o novo n alocado, indicando o novo incio da lista (4) incio = p (5) p.dado = valor;

//valor a ser armazenado neste n

Para o procedimento de insero no incio, temos o seguinte mtodo em JAVA:


public void inserir_inicio(int dado) { No novoNo = new No(dado); novoNo.proximo = inicio; //novo n aponta para o inicio antigo inicio = novoNo; //o inicio aponta agora para o novo n }

O procedimento de remoo do primeiro n da lista utilizado para remover um n esquerda na lista, liberando a rea de memria reservada para este n e atualizando o contedo da varivel incio com a referncia do prximo n da lista.

Os passos a seguir referem-se remoo de do primeiro elemento de uma lista simplesmente encadeada.
(1) incio = p.prximo; (2) desalocar(p);

Note que esses passos so suficientes para a remoo do primeiro elemento de uma lista simplesmente encadeada. No passo (1) a varivel incio passa a referenciar o n para o qual o primeiro elemento apontava (ou seja, o segundo n). Aps esse passo, basta desalocar o espao antes ocupado pela varivel.

elabore um procedimento de remoo do ltimo n de uma lista simplesmente encadeada. Para facilitar o desenvolvimento, crie uma nova varivel fim do tipo ref n, que aponte sempre para o ltimo elemento da lista.

Você também pode gostar