Você está na página 1de 42

Estruturas Lineares

Listas
Uma lista um conjunto de dados ordenados e de nmero varivel de elementos. H 2 tipos de listas:

Lista seqencial Lista encadeada

Lista seqencial
Uma lista seqencial um conjunto de n ns (n 0; X1, X2,..., Xn ) com as seguintes propriedades:

Se n > 0, ento X1 o primeiro n da lista e Xn o ltimo; Para 1 < k < n, Xk precedido por Xk-1 e sucedido por Xk+1 ; Se n = 0, ento a lista vazia.

Lista seqencial
Representao por contigidade

Uma lista seqencial aproveita a seqencialidade da memria.


Uma lista L (com n ns e todos os ns de mesmo tamanho) ocupa um espao consecutivo na memria equivalente a n*tamanho do n.

A lista seqencial um vetor .


1 L(n) = m nmero mximo de elementos que a lista L pode armazenar; n nmero de elementos existentes em um determinado momento. 2 3 4 ... n ... ... m

Lista seqencial
Operaes

Acesso a um determinado elemento. Insero de um novo elemento. Remoo de um elemento. Concatenao de duas ou mais listas lineares. Separao de uma lista em duas ou mais listas. Ordenao. Contagem de elementos.

Listas encadeadas
As listas encadeadas permitem a utilizao de estruturas flexveis em relao sua quantidade de elementos, tendo em vista sua caracterstica dinmica. Cada elemento um n composto por uma parte que armazena dados e outra que armazena campos de ligao com outros ns. O campo de ligao dos ns contm o endereo de memria onde o prximo n est armazenado. A passagem de um n para outro da estrutura encadeada realizada atravs dos endereos de outros ns. Os ns podem estar em qualquer lugar na memria. As estruturas encadeadas podem ser implementadas de diferentes modos, no entanto, a implementao mais flexvel por meio de ponteiros.

Listas encadeadas
As listas encadeadas permitem fcil insero e remoo de elementos sem um impacto global na estrutura. Uma desvantagem da lista encadeada o acesso seqencial. Para acessar um n no meio da lista, todos os ns anteriores (ou posteriores) devem ser visitados. Outra desvantagem a necessidade de armazenar informaes adicionais, no caso, os ponteiros para outros ns. A lista encadeada vantajosa quando h elementos que apresentam prioridade de acesso.

Listas simplesmente encadeadas


Se um n tem um vnculo somente para o seu sucessor na seqncia, a lista simplesmente encadeada. Os ns so formados por um registro que possui pelo menos 2 campos, a informao e o endereo de memria onde est armazenado o prximo elemento da lista.

Info

Info

Info

Info

NULL

Listas simplesmente encadeadas


O n pode ser declarado por meio da seguinte estrutura:
struct node { int info; struct node *proximo; }

Listas simplesmente encadeadas


Para criar uma lista encadeada deve-se manter uma varivel armazenando sempre o endereo do primeiro elemento da lista.
aloca(primeiro) se (primeiro) <> nulo primeiro->dados = 10 primeiro->proximo=nulo

Para o segundo elemento da lista.


aloca(n) se (n) <> nulo n->dados = 8 n->proximo=nulo

Listas simplesmente encadeadas


Generalizando:
aloca(p) se (p<>nulo) p->dados = valor p->proximo=nulo se (topo==nulo) (se a lista estiver vazia) topo =p seno (a lista contm ns) fim->proximo = p fim=p

Listas simplesmente encadeadas


Operaes

Insero de um n no incio da lista. Insero de um n no fim da lista. Insero de um n antes de um n endereado por k. Remoo de um n do incio da lista. Remoo de um n do fim da lista. Remoo de um n antes de um n endereado por k. Remoo de um n com um valor determinado. Busca.

Listas simplesmente encadeadas


Insero de um novo elemento no incio da lista.

A adio de um n no incio de uma lista realizada em 4 etapas.


1. Um n vazio criado.

2.
3.

O membro info do n inicializado com um valor particular.


Como o n includo no incio da lista, o membro prximo se torna um ponteiro para o atual primeiro n da lista.

4.

O novo n precede todos os ns da lista de forma que o endereo do topo deve ser atualizado.

Listas simplesmente encadeadas


topo
1.

3 \

topo 2. 6 5 8 3 \

topo
3. 6 5 8 3 \

topo 4. 6 5 8 3 \

Listas simplesmente encadeadas


Insero de um novo elemento no fim da lista.

A adio de um n no fim de uma lista realizada em 4 etapas.


1. 2. 3. 4. Um n vazio criado. O membro info do n inicializado com um valor particular. Como o n includo no final da lista, o membro prximo deste novo n se torna nulo. O novo n includo no fim lista de forma que o membro proximo do n anterior dever apontar para o novo n.

Listas simplesmente encadeadas


topo
1.

3 \

topo 2. 5 8 3 \ 10

topo 3. 5 8 3 \ 10 \

topo 4. 5

3 \

10 \

Listas simplesmente encadeadas


Insero de um novo elemento no fim da lista.

Para evitar percorrer toda a lista, pode-se armazenar o endereo do ltimo elemento da lista.

#include <iostream.h> #include <stdio.h> struct node { int info; struct node *proximo; };

void main( ) { char opcao; do { novodado( ); cout <<n Inserir outro dado; cin >> opcao; } while (opcao==s); }

void novodado( ) { node *novo = new node; cin >> novo->info; fim->proximo = novo; fim=novo; novo->proximo=NULL; }

Listas simplesmente encadeadas


A funo novodado( ) adiciona um n lista.
O novo n inserido no final da lista. Primeiramente, uma nova estrutura do tipo node criada pela instruo:
node *novo = new node;

A instruo reserva memria para armazenar a estrutura e atribui o endereo desta memria ao ponteiro novo. Em seguida, a informao da nova estrutura preenchida pelo usurio. Finalmente o novo endereo atribudo ao ponteiro pela instruo:
fim = novo;

Listas simplesmente encadeadas


Remoo

Uma operao de remoo consiste em remover um n da lista e retornar o valor armazenado neste n.
A operao de remoo permite liberar o espao em memria referente ao n especificado. H dois casos especiais a serem tratados:
Remoo de um n de uma lista vazia Remoo de um n de uma lista com somente um n

Listas simplesmente encadeadas


Remoo de um n do incio da lista.
se (topo==nulo) status=falso // a lista est vazia senao{ aux=topo valor = aux->dados topo=topo->proximo se topo = nulo fim=nulo libera (aux) status = verdadeiro } retorna valor

Listas simplesmente encadeadas


Remoo de um n do fim da lista.

Para remover um n do fim da lista deve-se considerar 3 situaes:


Lista Vazia: Para verificar se a lista est vazia basta verificar a varivel topo, se o contedo for nulo, a lista est vazia. Lista com apenas um elemento: Neste caso, verifica-se o contedo do campo prximo do primeiro n da lista, se o contedo for nulo, a lista possui apenas um elemento. Lista com dois ou mais elementos: Se nenhuma das situaes anteriores for verdadeira, a lista possui dois elementos ou mais.

Listas simplesmente encadeadas


Remoo de um n do fim da lista.
se (topo==nulo) status=falso // a lista est vazia senao{ se (topo->proximo == nulo){ // a lista tem um nico n valor = topo->dados libera (topo) fim = nulo topo = nulo } p= topo enquanto (p->proximo <> nulo) { aux=p p=p->proximo } valor=p->dados aux->proximo=nulo fim=aux libera(p) status = verdadeiro } retorna valor }

Listas encadeadas com header


Para facilitar a gerncia de informaes de incio e fim da lista podese reunir as referncias em uma nica estrutura chamada descritor, lder ou header da lista. O acesso aos elementos da lista sempre realizado por meio do header. O header pode conter informaes como: incio e fim da lista, quantidade de ns da lista e outras informaes que se deseje.
Lista 3

Listas duplamente encadeadas


Nas listas duplamente encadeadas, os ns contm dois ponteiros um para o sucessor e outro para o predecessor.
Lista 22 33 42

Listas duplamente encadeadas


Definio da lista duplamente ligada com estruturas
struct Node{ struct Node *prev; int dados; struct Node *proximo; }; struct Node *topo=NULL, *fim=NULL;

Listas duplamente encadeadas


Insero de um n no final da lista
1. O n criado.
2. Insere-se o dado. 3. O ponteiro para prximo torna-se nulo. 4. O ponteiro para prev deve apontar para o ltimo n da lista (fim).

5. O valor de fim ajustado para o novo n .


6. O ponteiro proximo do n anterior toma o endereo do novo n.

Listas duplamente encadeadas


1. topo

fim

\
fim

2.

topo 1.
topo

\
fim

10

3.

\
fim

10

4.

topo

\
fim

10

5.

topo

\
fim

10

6.

topo

10

Listas duplamente encadeadas


Insero de um n no final da lista
aloca (p) se (p<> nulo) p->dados = valor p->prev=fim

p->prox = nulo
fim->prox = p fim = p se (topo == nulo) topo = fim

Listas duplamente encadeadas


Insero de um n no incio da lista
aloca (p) se (p<> nulo) p->dados = valor p->prox=topo

topo->prev=p
p->prev = nulo topo = p se (fim == nulo) fim=topo

Listas duplamente encadeadas


Remoo de um n do fim da lista
fim 1. topo

8 fim

10

2.

topo

8
fim

10

3.

topo

8 fim

4.

topo

Listas duplamente encadeadas


Remoo de um n do fim da lista
se (topo <> nulo)
aux = fim fim = aux->prev se (fim == nulo)

topo = nulo
seno fim->prox = nulo valor = aux->dados libera (aux)

status=verdadeiro
retorna valor seno status=falso

Listas duplamente encadeadas


Remoo de um n do incio da lista
se (topo <> nulo)
aux = topo topo = aux->prox se (topo == nulo)

fim = nulo
seno topo->prev = nulo valor = aux->dados libera (aux)

status=verdadeiro
retorna valor seno status=falso

Listas circulares
Em uma lista circular os ns formam um anel. Um exemplo da utilizao das listas circulares quando diversos processos esto usando os mesmos recursos simultaneamente. Deve-se assegurar que os processos sigam uma ordem de utilizao do recurso. Coloca-se os recursos em uma lista circular acessveis atravs do ponteiro corrente.

Depois que o processo ativado o ponteiro se move para o prximo n para ativar o processo seguinte.
Na implementao de uma lista simplesmente encadeada circular usa-se apenas um ponteiro permanente.

Listas circulares
Lista circular simplesmente encadeada
corrente
6 5 8

Lista circular duplamente encadeada


corrente
6 5 8

10

Listas circulares
Insero de um n antes do n corrente
aloca (p) se (p<> nulo){ p->dados = valor se (corrente == nulo){ corrente = p p->prox = p } senao{ aux = corrente enquanto (aux->prox <> corrente) aux = aux->prox aux->prox=p p->prox=corrente } }

Listas circulares
Insero de um n antes do n corrente (o novo n se torna o n corrente)
aloca (p) se (p<> nulo){ p->dados = valor se (corrente == nulo){ corrente = p p->prox = p } senao{ aux = corrente enquanto (aux->prox <> corrente) aux = aux->prox aux->prox=p p->prox=corrente corrente=p } }

Listas circulares
Remoo do n do corrente
se (corrente <> nulo){ aux = corrente se (aux->prox)<> corrente{ enquanto (aux->prox <> corrente) aux = aux->prox aux ->prox = corrente->prox valor = corrente->dados libera(corrente) corrente = aux->prox status=verdadeiro retorna valor } seno{ valor = corrente->dados libera(corrente) corrente = nul status=verdadeiro retorna valor } seno status=falso }

Listas auto-organizadas
As listas encadeadas exigem a busca seqencial para localizar um elemento ou descobrir que ele no est na lista.

Pode-se melhorar a eficincia da busca organizando a lista dinamicamente.


Existem diferentes mtodos de organizao de listas.
1. 2. 3. 4. Mtodo de mover para frente: O elemento localizado deve ser colocado no incio da lista. Mtodo da transposio: O elemento localizado deve ser trocado com seu predecessor, exceto se ele estiver no topo da lista. Mtodo da contagem: A lista deve ser ordenada pelo nmero de vezes que os elementos so acessados. Mtodo da ordenao: A lista ordenada de acordo com sua informao.

Os trs primeiros mtodos permitem colocar os elementos mais provveis de serem acessados no incio da lista. O mtodo da ordenao tem a vantagem na busca de informao, sobretudo se a informao no est na lista pois a busca pode terminar sem pesquisar toda a lista.

Listas auto-organizadas
1. Mtodo de mover para frente
A B C D

Acesso D
D A B C

2. Mtodo da transposio
A B C D

Acesso D
A B D C

Listas auto-organizadas
3. Mtodo da contagem
A 3 B 1 C 1 D 1

Acesso D
A 3 D 2 B 1 C 1

4. Mtodo da ordenao
A B C D

Acesso D
A B C D

Exerccios
Criar um programa para manipular uma lista simplesmente encadeada O programa dever apresentar um menu com as seguintes opes:
1.
2. 3. 4. 5.

Incluso no incio da lista Incluso no fim da lista Remoo do incio da lista Remoo do fim da lista Impresso da lista com valor do topo, e endereo e valor dos ns que compe a lista.