Sie sind auf Seite 1von 7

Estruturas Lineares

Estruturas homogneas
vetores (tipos bsicos repetidos)
matrizes
Listas
Pilhas e filas
Listas
Uma lista um conjunto de dados ordenados e de nmero varivel de elementos.
H 2 tipos de listas:
o Lista seqencial
o Lista encadeada
Lista seqencial
Uma lista sequencial um conjunto de n ns (n 0; X1, X2,..., Xn) com as seguintes propriedades:
o Se n > 0, ento X1 o primeiro n da lista e Xn o ltimo;
o Para 1 < k < n, Xk precedido por Xk-1 e sucedido por Xk+1 ;
o Se n = 0, ento a lista vazia.
Representao por contiguidade
Uma lista sequencial aproveita a sequencialidade 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.
1 2 3 4 ... n ... ... m
L(n)=

Operaes
o Acesso a um determinado elemento.
o Insero de um novo elemento.
o Remoo de um elemento.
o Concatenao de duas ou mais listas lineares.
o Separao de uma lista em duas ou mais listas.
o Ordenao.
o 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.
As listas encadeadas permitem fcil insero e remoo de elementos sem um impacto global na estrutura.
Uma desvantagem da lista encadeada o acesso sequencial.
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.
O n pode ser declarado por meio da seguinte estrutura:

struct node
{
int info;
struct node *proximo;
}

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

Para o segundo elemento da lista.


aloca(n)
se (n) <> nulo
ndados = 8
nproximo=nulo
primeiro = n

Generalizando:
aloca(p)
se (p<>nulo)
pdados = valor
pproximo=nulo
se (topo==nulo)
(se a lista estiver vazia)
topo =p
seno
(a lista contm ns)
fimproximo = NULL;
fim=p

Operaes
o Insero de um n no incio da lista.
o Insero de um n no fim da lista.
o Insero de um n antes de um n endereado por k.
o Remoo de um n do incio da lista.
o Remoo de um n do fim da lista.
o Remoo de um n antes de um n endereado por k.
o Remoo de um n com um valor determinado.
o Busca.
Insero de um novo elemento no incio da lista.
o A adio de um n no incio de uma lista realizada em 4 etapas.
1. Um n vazio criado.
2. O membro info do n inicializado com um valor particular.
3. 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
primeiro n deve ser atualizado.

Insero de um novo elemento no fim da lista.


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

Insero de um novo elemento.


o Normalmente a insero de elementos ocorre a partir do ltimo elemento da lista.
o 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 novodado( )
{
node *novo = new node;
cin >> novo->info;
}

Inserir no incio / inserir no fim procedimentos diferentes


o A funo novodado( ) adiciona um n lista.
o O novo n inserido no final da lista.
o Primeiramente, uma nova estrutura do tipo node criada pela instruo: node *novo = new node;
o A instruo reserva memria para armazenar a estrutura e atribui o endereo desta memria ao ponteiro novo.
o Em seguida, a informao da nova estrutura preenchida pelo usurio.

Remoo
o Uma operao de remoo consiste em remover um n da lista e retornar o valor armazenado neste n.
o A operao de remoo permite liberar o espao em memria referente ao n especificado.
o 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

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

Remoo de um n do fim da lista.


o 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.
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 pode-se 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.

Listas duplamente encadeadas

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

Definio da lista duplamente ligada com estruturas


struct Node{
struct Node *prev;
int dados;
struct Node *proximo;
};
struct Node *topo=NULL, *fim=NULL;

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.

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

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

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

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.
Colocam-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.
Lista circular simplesmente encadeada

Lista circular duplamente encadeada


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
}
}

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
}
}

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. Mtodo de mover para frente: O elemento localizado deve ser colocado no incio da lista.

2.

Mtodo da transposio: O elemento localizado deve ser trocado com seu predecessor, exceto se ele estiver no topo da lista.

3.

Mtodo da contagem: A lista deve ser ordenada pelo nmero de vezes que os elementos so acessados.

4.

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.
Exerccios

Criar
Criarum
umprograma
programapara
paramanipular
manipularuma
uma lista
lista simplesmente
duplamente encadeada
encadeada circular.
o
O
programa
dever
apresentar
um
menu
com
as seguintes opes:
O programa dever criar um menu com as seguintes
opes
1. antes
Incluso
nocorrente
incio da lista
1. Incluso
do n
2.
Incluso
no
fim
da lista(o novo n se torna o corrente)
2. Incluso no local do n
corrente
3.
Remoo
do
incio
da lista n se torna o corrente)
3. Excluso do n corrente (o prximo
4. Remoo do fim da lista
4. Excluso do antes do n corrente.
5. Impresso da lista com valor do topo, e todos os ns, contendo o endereo do n, valor, endereo do ponteiro direito e
5. Impresso da lista com valor do topo, e todos os ns, contendo o endereo do n, valor e endereo do ponteiro seguinte.
do ponteiro esquerdo.

Das könnte Ihnen auch gefallen