42
Estruturas Estruturas Lineares Lineares

c++ Ponteiros Parte 2

Embed Size (px)

Citation preview

Page 1: c++ Ponteiros Parte 2

Estruturas LinearesEstruturas Lineares

Page 2: c++ Ponteiros Parte 2

ListasListas

Uma lista é um conjunto de dados ordenados e de Uma lista é um conjunto de dados ordenados e de número variável de elementos. número variável de elementos.

Há 2 tipos de listas:Há 2 tipos de listas:

Lista seqüencialLista seqüencial

Lista encadeadaLista encadeada

Page 3: c++ Ponteiros Parte 2

Lista seqüencial Lista seqüencial

Uma lista seqüencial é um conjunto de Uma lista seqüencial é um conjunto de nn nós nós (n ≥ 0; (n ≥ 0;

XX11, X, X22,..., X,..., Xn n )) com as seguintes propriedades: com as seguintes propriedades:

Se Se n > 0n > 0, então , então XX11 é o primeiro nó da lista e é o primeiro nó da lista e XXn n é o último;é o último;

Para Para 1 < k < n1 < k < n, , XXkk é precedido por é precedido por XXk-1k-1 e sucedido por e sucedido por

XXk+1 k+1 ;;

Se Se n = 0n = 0, então a lista é vazia., então a lista é vazia.

Page 4: c++ Ponteiros Parte 2

Lista seqüencial Lista seqüencial Representação por contigüidadeRepresentação por contigüidade

Uma lista seqüencial aproveita a seqüencialidade da memória. Uma lista seqüencial aproveita a seqüencialidade da memória.

Uma lista Uma lista LL (com (com nn nós e todos os nós de mesmo tamanho) ocupa um nós e todos os nós de mesmo tamanho) ocupa um espaço consecutivo na memória equivalente a n*tamanho do nó.espaço consecutivo na memória equivalente a n*tamanho do nó.

A lista seqüencial é um vetor .A lista seqüencial é um vetor .

11 22 33 44 ...... nn ...... ...... mm

L(n) =L(n) =

m – número máximo de elementos que a lista L pode armazenar;

n – número de elementos existentes em um determinado momento.

Page 5: c++ Ponteiros Parte 2

Lista seqüencial Lista seqüencial

OperaçõesOperações Acesso a um determinado elemento. Acesso a um determinado elemento. Inserção de um novo elemento.Inserção de um novo elemento. Remoção de um elemento.Remoção de um elemento. Concatenação de duas ou mais listas lineares.Concatenação de duas ou mais listas lineares. Separação de uma lista em duas ou mais listas.Separação de uma lista em duas ou mais listas. Ordenação.Ordenação. Contagem de elementos.Contagem de elementos.

Page 6: c++ Ponteiros Parte 2

Listas encadeadas Listas encadeadas As listas encadeadas permitem a utilização de estruturas flexíveis em relação à As listas encadeadas permitem a utilização de estruturas flexíveis em relação à sua quantidade de elementos, tendo em vista sua característica dinâmica.sua quantidade de elementos, tendo em vista sua característica dinâmica.

Cada elemento é um nó composto por uma parte que armazena dados e outra que Cada elemento é um nó composto por uma parte que armazena dados e outra que armazena campos de ligação com outros nós.armazena campos de ligação com outros nós.

O campo de ligação dos nós contém o endereço de memória onde o próximo nó O campo de ligação dos nós contém o endereço de memória onde o próximo nó está armazenado.está armazenado.

A passagem de um nó para outro da estrutura encadeada é realizada através dos A passagem de um nó para outro da estrutura encadeada é realizada através dos endereços de outros nós.endereços de outros nós.

Os nós podem estar em qualquer lugar na memória.Os nós podem estar em qualquer lugar na memória.

As estruturas encadeadas podem ser implementadas de diferentes modos, no As estruturas encadeadas podem ser implementadas de diferentes modos, no entanto, a implementação mais flexível é por meio de ponteiros.entanto, a implementação mais flexível é por meio de ponteiros.

Page 7: c++ Ponteiros Parte 2

Listas encadeadas Listas encadeadas As listas encadeadas permitem fácil inserção e remoção de As listas encadeadas permitem fácil inserção e remoção de elementos sem um impacto global na estrutura.elementos sem um impacto global na estrutura.

Uma desvantagem da lista encadeada é o acesso seqüencial. Uma desvantagem da lista encadeada é o acesso seqüencial.

Para acessar um nó no meio da lista, todos os nós anteriores (ou Para acessar um nó no meio da lista, todos os nós anteriores (ou posteriores) devem ser visitados.posteriores) devem ser visitados.

Outra desvantagem é a necessidade de armazenar informações Outra desvantagem é a necessidade de armazenar informações adicionais, no caso, os ponteiros para outros nós.adicionais, no caso, os ponteiros para outros nós.

A lista encadeada é vantajosa quando há elementos que apresentam A lista encadeada é vantajosa quando há elementos que apresentam prioridade de acesso.prioridade de acesso.

Page 8: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas

Se um nó tem um vínculo somente para o seu sucessor na Se um nó tem um vínculo somente para o seu sucessor na seqüência, a lista é simplesmente encadeada.seqüência, a lista é simplesmente encadeada.

Os nós são formados por um registro que possui pelo menos 2 Os nós são formados por um registro que possui pelo menos 2 campos, a informação e o endereço de memória onde está campos, a informação e o endereço de memória onde está armazenado o próximo elemento da lista.armazenado o próximo elemento da lista.

InfoInfo InfoInfo InfoInfo InfoInfo NULL

Page 9: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas

O nó pode ser declarado por meio da O nó pode ser declarado por meio da seguinte estrutura:seguinte estrutura:

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

Page 10: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas Para criar uma lista encadeada deve-se manter uma variável armazenando sempre o endereço do Para criar uma lista encadeada deve-se manter uma variável armazenando sempre o endereço do primeiro elemento da lista. primeiro elemento da lista.

aloca(primeiro)aloca(primeiro) se (primeiro) <> nulose (primeiro) <> nulo primeiro->dados = 10primeiro->dados = 10 primeiro->proximo=nuloprimeiro->proximo=nulo

Para o segundo elemento da lista. Para o segundo elemento da lista.

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

←←

Page 11: c++ Ponteiros Parte 2

Listas simplesmente encadeadasListas simplesmente encadeadas

Generalizando:Generalizando:aloca(p)aloca(p)se (p<>nulo)se (p<>nulo) p->dados = valorp->dados = valor p->proximo=nulop->proximo=nulo se (topo==nulo) (se a lista estiver vazia)se (topo==nulo) (se a lista estiver vazia) topo =p topo =p senão (a lista contém nós)senão (a lista contém nós) fim->proximo = pfim->proximo = p fim=pfim=p

Page 12: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas

OperaçõesOperações Inserção de um nó no início da lista.Inserção de um nó no início da lista. Inserção de um nó no fim da lista.Inserção de um nó no fim da lista. Inserção de um nó antes de um nó endereçado por k.Inserção de um nó antes de um nó endereçado por k. Remoção de um nó do início da lista.Remoção de um nó do início da lista. Remoção de um nó do fim da lista.Remoção de um nó do fim da lista. Remoção de um nó antes de um nó endereçado por k.Remoção de um nó antes de um nó endereçado por k. Remoção de um nó com um valor determinado.Remoção de um nó com um valor determinado. Busca.Busca...

Page 13: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas

Inserção de um novo elemento no início da lista.Inserção de um novo elemento no início da lista.

A adição de um nó no início de uma lista é realizada em 4 etapas.A adição de um nó no início de uma lista é realizada em 4 etapas.

1.1. Um nó vazio é criado.Um nó vazio é criado.

2.2. O membro info do nó é inicializado com um valor particular.O membro info do nó é inicializado com um valor particular.

3.3. Como o nó é incluído no início da lista, o membro próximo se torna um Como o nó é incluído no início da lista, o membro próximo se torna um ponteiro para o atual primeiro nó da lista.ponteiro para o atual primeiro nó da lista.

4.4. O novo nó precede todos os nós da lista de forma que o endereço do topo O novo nó precede todos os nós da lista de forma que o endereço do topo deve ser atualizado.deve ser atualizado.

Page 14: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas topo

51. 8 3

54. 8 3

topo

53. 8 3

topo

52. 8 3

\

\

\

\

6

6

6

topo

Page 15: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas

Inserção de um novo elemento no fim da lista.Inserção de um novo elemento no fim da lista.

A adição de um nó no fim de uma lista é realizada em 4 etapas.A adição de um nó no fim de uma lista é realizada em 4 etapas.

1.1. Um nó vazio é criado.Um nó vazio é criado.

2.2. O membro info do nó é inicializado com um valor particular.O membro info do nó é inicializado com um valor particular.

3.3. Como o nó é incluído no final da lista, o membro próximo deste novo nó se Como o nó é incluído no final da lista, o membro próximo deste novo nó se torna nulo.torna nulo.

4.4. O novo nó é incluído no fim lista de forma que o membro proximo do nó O novo nó é incluído no fim lista de forma que o membro proximo do nó anterior deverá apontar para o novo nó.anterior deverá apontar para o novo nó.

Page 16: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas

1.

4.

3.

2.

topo

5 8 3\

topo

5 8 3\

10

topo

5 8 3\

10

\

topo

5 8 3\

10

\

Page 17: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas

Inserção de um novo elemento no fim da lista.Inserção de um novo elemento no fim da lista.

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

Page 18: c++ Ponteiros Parte 2

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

void main( )void main( ){{ char opcao;char opcao; dodo {{ novodado( );novodado( ); cout <<“n Inserir outro cout <<“n Inserir outro

dado”;dado”; cin >> opcao;cin >> opcao; } while (opcao==‘s’);} while (opcao==‘s’);}}

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

Page 19: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas A função novodado( ) adiciona um nó à lista.A função novodado( ) adiciona um nó à lista.

O novo nó é inserido no final da lista.O novo nó é inserido no final da lista.

Primeiramente, uma nova estrutura do tipo node é criada pela instrução:Primeiramente, uma nova estrutura do tipo node é criada pela instrução: node *novo = new node;node *novo = new node;

A instrução reserva memória para armazenar a estrutura e atribui o endereço desta memória ao ponteiroA instrução reserva memória para armazenar a estrutura e atribui o endereço desta memória ao ponteiro novo.novo.

Em seguida, a informação da nova estrutura é preenchida pelo usuário.Em seguida, a informação da nova estrutura é preenchida pelo usuário.

Finalmente o novo endereço é atribuído ao ponteiro pela instruçãoFinalmente o novo endereço é atribuído ao ponteiro pela instrução ::

fim = novo;fim = novo;

Page 20: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas

RemoçãoRemoção

Uma operação de remoção consiste em remover um nó Uma operação de remoção consiste em remover um nó da lista e retornar o valor armazenado neste nó.da lista e retornar o valor armazenado neste nó.

A operação de remoção permite liberar o espaço em A operação de remoção permite liberar o espaço em memória referente ao nó especificado.memória referente ao nó especificado.

Há dois casos especiais a serem tratados:Há dois casos especiais a serem tratados:

Remoção de um nó de uma lista vaziaRemoção de um nó de uma lista vazia

Remoção de um nó de uma lista com somente um nóRemoção de um nó de uma lista com somente um nó

Page 21: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas

Remoção de um nó do início da lista.Remoção de um nó do início da lista.

se (topo==nulo) status=falso se (topo==nulo) status=falso // a lista está vazia// a lista está vaziasenao{senao{ aux=topoaux=topo valor = aux->dadosvalor = aux->dados topo=topo->proximotopo=topo->proximo se topo = nulo fim=nulose topo = nulo fim=nulo libera (aux)libera (aux) status = verdadeirostatus = verdadeiro }}retorna valorretorna valor

Page 22: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas

Remoção de um nó do fim da lista. Remoção de um nó do fim da lista. Para remover um nó do fim da lista deve-se considerar 3 Para remover um nó do fim da lista deve-se considerar 3

situações:situações:Lista VaziaLista Vazia: Para verificar se a lista está vazia basta verificar : Para verificar se a lista está vazia basta verificar a variável topo, se o conteúdo for nulo, a lista está vazia.a variável topo, se o conteúdo for nulo, a lista está vazia.

Lista com apenas um elementoLista com apenas um elemento: Neste caso, verifica-se o : Neste caso, verifica-se o conteúdo do campo próximo do primeiro nó da lista, se o conteúdo do campo próximo do primeiro nó da lista, se o conteúdo for nulo, a lista possui apenas um elemento.conteúdo for nulo, a lista possui apenas um elemento.

Lista com dois ou mais elementosLista com dois ou mais elementos: Se nenhuma das : Se nenhuma das situações anteriores for verdadeira, a lista possui dois situações anteriores for verdadeira, a lista possui dois elementos ou mais.elementos ou mais.

Page 23: c++ Ponteiros Parte 2

Listas simplesmente encadeadas Listas simplesmente encadeadas Remoção de um nó do fim da lista.Remoção de um nó do fim da lista.

se (topo==nulo) status=falso se (topo==nulo) status=falso // a lista está vazia// a lista está vaziasenao{senao{ se (topo->proximo == nulo){ se (topo->proximo == nulo){ // a lista tem um único nó// a lista tem um único nó valor = topo->dadosvalor = topo->dados libera (topo)libera (topo) fim = nulofim = nulo topo = nulotopo = nulo }} p= topop= topo enquanto (p->proximo <> nulo) {enquanto (p->proximo <> nulo) { aux=paux=p p=p->proximop=p->proximo }} valor=p->dadosvalor=p->dados aux->proximo=nuloaux->proximo=nulo fim=auxfim=aux libera(p)libera(p) status = verdadeirostatus = verdadeiro }} retorna valorretorna valor}}

Page 24: c++ Ponteiros Parte 2

Listas encadeadas com headerListas encadeadas com header

Para facilitar a gerência de informações de início e fim da lista pode-Para facilitar a gerência de informações de início e fim da lista pode-se reunir as referências em uma única estrutura chamada descritor, se reunir as referências em uma única estrutura chamada descritor, líder ou header da lista.líder ou header da lista.

O acesso aos elementos da lista é sempre realizado por meio do O acesso aos elementos da lista é sempre realizado por meio do header.header.

O header pode conter informações como: início e fim da lista, O header pode conter informações como: início e fim da lista, quantidade de nós da lista e outras informações que se deseje.quantidade de nós da lista e outras informações que se deseje.

Lista

3

Page 25: c++ Ponteiros Parte 2

Listas duplamente encadeadas Listas duplamente encadeadas

Nas listas duplamente encadeadas, os nós contêm Nas listas duplamente encadeadas, os nós contêm dois ponteiros um para o sucessor e outro para o dois ponteiros um para o sucessor e outro para o predecessor.predecessor.

Lista

22 33 42

Page 26: c++ Ponteiros Parte 2

Listas duplamente encadeadas Listas duplamente encadeadas

Definição da lista duplamente ligada com Definição da lista duplamente ligada com estruturasestruturas

struct Node{struct Node{

struct Node *prev;struct Node *prev;

int dados;int dados;

struct Node *proximo;struct Node *proximo;

};};

struct Node *topo=NULL, *fim=NULL;struct Node *topo=NULL, *fim=NULL;

Page 27: c++ Ponteiros Parte 2

Listas duplamente encadeadas Listas duplamente encadeadas

Inserção de um nó no final da listaInserção de um nó no final da lista

1.1. O nó é criado.O nó é criado.

2.2. Insere-se o dado.Insere-se o dado.

3.3. O ponteiro para próximo torna-se nulo.O ponteiro para próximo torna-se nulo.

4.4. O ponteiro para prev deve apontar para o último nó da O ponteiro para prev deve apontar para o último nó da lista (fim).lista (fim).

5.5. O valor de fim é ajustado para o novo nó .O valor de fim é ajustado para o novo nó .

6.6. O ponteiro proximo do nó anterior toma o endereço do O ponteiro proximo do nó anterior toma o endereço do novo nó.novo nó.

Page 28: c++ Ponteiros Parte 2

Listas duplamente encadeadas Listas duplamente encadeadas topo

\ 6 5 8 \

fim

topo\ 6 5 8 \ 10

fim

topo\ 6 5 8 \ 10

topo\ 6 5 8 \ 10 \

fim

topo\ 6 5 8 \ 10

topo\ 6 5 8 \ 10 \

fim

topo\ 6 5 8 \ 10

topo\ 6 5 8 \ 10 \

fim

topo\ 6 5 8 10

topo\ 6 5 8 10 \

fim

1.

3.

2.

6.

4.

1.

5.

Page 29: c++ Ponteiros Parte 2

Listas duplamente encadeadas Listas duplamente encadeadas Inserção de um nó no final da listaInserção de um nó no final da lista

aloca (p)aloca (p)

se (p<> nulo)se (p<> nulo)

p->dados = valorp->dados = valor

p->prev=fimp->prev=fim

p->prox = nulop->prox = nulo

fim->prox = pfim->prox = p

fim = pfim = p

se (topo == nulo)se (topo == nulo)

topo = fimtopo = fim

Page 30: c++ Ponteiros Parte 2

Listas duplamente encadeadas Listas duplamente encadeadas Inserção de um nó no início da listaInserção de um nó no início da lista

aloca (p)aloca (p)

se (p<> nulo)se (p<> nulo)

p->dados = valorp->dados = valor

p->prox=topop->prox=topo

topo->prev=ptopo->prev=p

p->prev = nulop->prev = nulo

topo = ptopo = p

se (fim == nulo)se (fim == nulo)

fim=topofim=topo

Page 31: c++ Ponteiros Parte 2

Listas duplamente encadeadas Listas duplamente encadeadas

topo\ 6 5 8 10

topo\ 6 5 8 10 \

fim1.

3.

2.

4.

topo\ 6 5 8 10

topo\ 6 5 8 10 \

fim

fimtopo

\ 6 5 8topo

\ 6 5 8

fimtopo

\ 6 5 8topo

\ 6 5 8 \

Remoção de um nó do fim da lista

Page 32: c++ Ponteiros Parte 2

Listas duplamente encadeadas Listas duplamente encadeadas Remoção de um nó do fim da listaRemoção de um nó do fim da lista

se (topo <> nulo)se (topo <> nulo)

aux = fimaux = fim

fim = aux->prevfim = aux->prev

se (fim == nulo)se (fim == nulo)

topo = nulotopo = nulo

senão fim->prox = nulosenão fim->prox = nulo

valor = aux->dadosvalor = aux->dados

libera (aux)libera (aux)

status=verdadeirostatus=verdadeiro

retorna valorretorna valor

senãosenão

status=falso status=falso

Page 33: c++ Ponteiros Parte 2

Listas duplamente encadeadas Listas duplamente encadeadas Remoção de um nó do início da listaRemoção de um nó do início da lista

se (topo <> nulo)se (topo <> nulo)

aux = topoaux = topo

topo = aux->proxtopo = aux->prox

se (topo == nulo)se (topo == nulo)

fim = nulofim = nulo

senão topo->prev = nulosenão topo->prev = nulo

valor = aux->dadosvalor = aux->dados

libera (aux)libera (aux)

status=verdadeirostatus=verdadeiro

retorna valorretorna valor

senãosenão

status=falso status=falso

Page 34: c++ Ponteiros Parte 2

Listas circulares Listas circulares Em uma lista circular os nós formam um anel.Em uma lista circular os nós formam um anel.

Um exemplo da utilização das listas circulares é quando diversos processos Um exemplo da utilização das listas circulares é quando diversos processos estão usando os mesmos recursos simultaneamente.estão usando os mesmos recursos simultaneamente.

Deve-se assegurar que os processos sigam uma ordem de utilização do Deve-se assegurar que os processos sigam uma ordem de utilização do recurso.recurso.

Coloca-se os recursos em uma lista circular acessíveis através do ponteiro Coloca-se os recursos em uma lista circular acessíveis através do ponteiro “corrente”.“corrente”.

Depois que o processo é ativado o ponteiro se move para o próximo nó Depois que o processo é ativado o ponteiro se move para o próximo nó para ativar o processo seguinte.para ativar o processo seguinte.

Na implementação de uma lista simplesmente encadeada circular usa-se Na implementação de uma lista simplesmente encadeada circular usa-se apenas um ponteiro permanente.apenas um ponteiro permanente.

Page 35: c++ Ponteiros Parte 2

Listas circulares Listas circulares

Lista circular simplesmente encadeadaLista circular simplesmente encadeada

Lista circular duplamente encadeadaLista circular duplamente encadeada

corrente

6 5 8

6 5 8 10

corrente6 5 8 10

Page 36: c++ Ponteiros Parte 2

Listas circularesListas circularesInserção de um nó antes do nó correnteInserção de um nó antes do nó corrente

aloca (p)aloca (p) se (p<> nulo){se (p<> nulo){ p->dados = valorp->dados = valor se (corrente == nulo){se (corrente == nulo){ corrente = pcorrente = p p->prox = pp->prox = p }} senao{senao{ aux = correnteaux = corrente enquanto (aux->prox <> corrente) aux = aux->proxenquanto (aux->prox <> corrente) aux = aux->prox aux->prox=paux->prox=p p->prox=correntep->prox=corrente }} } }

Page 37: c++ Ponteiros Parte 2

Listas circularesListas circularesInserção de um nó antes do nó corrente (o novo nó se torna o nó Inserção de um nó antes do nó corrente (o novo nó se torna o nó corrente)corrente)

aloca (p)aloca (p) se (p<> nulo){se (p<> nulo){ p->dados = valorp->dados = valor se (corrente == nulo){se (corrente == nulo){ corrente = pcorrente = p p->prox = pp->prox = p }} senao{senao{ aux = correnteaux = corrente enquanto (aux->prox <> corrente) aux = aux->proxenquanto (aux->prox <> corrente) aux = aux->prox aux->prox=paux->prox=p p->prox=correntep->prox=corrente corrente=pcorrente=p }} } }

Page 38: c++ Ponteiros Parte 2

Listas circulares Listas circulares Remoção do nó do correnteRemoção do nó do corrente

se (corrente <> nulo){se (corrente <> nulo){ aux = correnteaux = corrente se (aux->prox)<> corrente{ se (aux->prox)<> corrente{ enquanto (aux->prox <> corrente) aux = aux->proxenquanto (aux->prox <> corrente) aux = aux->prox aux ->prox = corrente->proxaux ->prox = corrente->prox valor = corrente->dados valor = corrente->dados libera(corrente)libera(corrente) corrente = aux->proxcorrente = aux->prox status=verdadeirostatus=verdadeiro retorna valorretorna valor }} senão{senão{ valor = corrente->dados valor = corrente->dados libera(corrente)libera(corrente) corrente = nulcorrente = nul status=verdadeirostatus=verdadeiro retorna valorretorna valor

}}senãosenão status=falso status=falso } }

Page 39: c++ Ponteiros Parte 2

Listas auto-organizadas Listas auto-organizadas As listas encadeadas exigem a busca seqüencial para localizar um elemento ou descobrir que As listas encadeadas exigem a busca seqüencial para localizar um elemento ou descobrir que ele não está na lista.ele não está na lista.

Pode-se melhorar a eficiência da busca organizando a lista dinamicamente.Pode-se melhorar a eficiência da busca organizando a lista dinamicamente.

Existem diferentes métodos de organização de listas.Existem diferentes métodos de organização de listas.

1.1. Método de mover para frente: O elemento localizado deve ser colocado no início da lista.Método de mover para frente: O elemento localizado deve ser colocado no início da lista.

2.2. Método da transposição: O elemento localizado deve ser trocado com seu predecessor, exceto se ele estiver no Método da transposição: O elemento localizado deve ser trocado com seu predecessor, exceto se ele estiver no topo da lista.topo da lista.

3.3. Método da contagem: A lista deve ser ordenada pelo número de vezes que os elementos são acessados.Método da contagem: A lista deve ser ordenada pelo número de vezes que os elementos são acessados.

4.4. Método da ordenação: A lista é ordenada de acordo com sua informação.Método da ordenação: A lista é ordenada de acordo com sua informação.

Os três primeiros métodos permitem colocar os elementos mais prováveis de serem acessados Os três primeiros métodos permitem colocar os elementos mais prováveis de serem acessados no início da lista.no início da lista.

O método da ordenação tem a vantagem na busca de informação, sobretudo se a informação O método da ordenação tem a vantagem na busca de informação, sobretudo se a informação não está na lista pois a busca pode terminar sem pesquisar toda a lista.não está na lista pois a busca pode terminar sem pesquisar toda a lista.

Page 40: c++ Ponteiros Parte 2

Listas auto-organizadas Listas auto-organizadas 1. Método de mover para frente

A DB C

Acesso → D

D CA B

2. Método da transposição

A DB C

Acesso → D

A CB D

Page 41: c++ Ponteiros Parte 2

Listas auto-organizadas Listas auto-organizadas 3. Método da contagem

Acesso → D

4. Método da ordenação

A DB C

Acesso → D

A DB C

A 3 C 1B 1 D 1

A 3 B 1D 2 C 1

Page 42: c++ Ponteiros Parte 2

ExercíciosExercícios

Criar um programa para manipular uma lista Criar um programa para manipular uma lista simplesmente encadeadasimplesmente encadeadaO programa deverá apresentar um menu com as O programa deverá apresentar um menu com as seguintes opções:seguintes opções:

1.1. Inclusão no início da listaInclusão no início da lista2.2. Inclusão no fim da listaInclusão no fim da lista3.3. Remoção do início da listaRemoção do início da lista4.4. Remoção do fim da listaRemoção do fim da lista5.5. Impressão da lista com valor do topo, e endereço e valor dos Impressão da lista com valor do topo, e endereço e valor dos

nós que compõe a lista.nós que compõe a lista.