• Nenhum resultado encontrado

Listas Duplamente Encadeadas

N/A
N/A
Protected

Academic year: 2021

Share "Listas Duplamente Encadeadas"

Copied!
26
0
0

Texto

(1)

Listas Duplamente Encadeadas

Como vimos, uma lista circular possui

vantagens sobre uma lista linear, contudo

esta ainda possui limitações.

Por exemplo, não podemos percorrê-la

no sentido contrário ou ainda para

inserirmos ou retirarmos um k-ésimo

elemento temos que ter um ponteiro para

seu antecessor.

Com o objetivo de sanar estas

limitações surgiram as

listas duplamente

encadeadas

.

(2)

Listas Duplamente Encadeadas

Em uma

lista duplamente encadeada

os

elementos possuem três campos: o

campo

inf

o qual contém a informação, o

campo

ant

que possui um ponteiro para o

elemento antecessor e o campo

prox

que

é uma referência para o elemento que

sucede.

L

λλλλ λλλλ

(3)

230

Listas Duplamente Encadeadas

Definiremos agora o TAD LISTA_DUP_ENC: typedef struct nodo

{

int inf;

struct nodo * ant; struct nodo * prox; }NODO;

typedef NODO * LISTA_DUP_ENC; void cria_lista (LISTA_DUP_ENC *); int eh_vazia (LISTA_DUP_ENC);

int tam (LISTA_DUP_ENC);

void ins (LISTA_DUP_ENC *, int, int); int recup (LISTA_DUP_ENC, int);

(4)

void cria_lista (LISTA_DUP_ENC *pl) {

*pl=NULL; }

int eh_vazia (LISTA_DUP_ENC l) {

return (l == NULL); }

int tam (LISTA_DUP_ENC l) {

int cont;

for (cont=0; l!= NULL; cont++) l = l->prox;

(5)

Esquema do processo da inserção de um nó

da lista duplamente encadeada. (situação um)

Listas Duplamente Encadeadas

L Novo v

.

.

.

L Nodo 1 v

.

.

.

(6)

Esquema do processo da inserção de um nó

da lista duplamente encadeada.

(situação dois)

Listas Duplamente Encadeadas

L

Nodo 1 Nodo 2 Nodo 3

Novo v

.

.

.

X L

Nodo 2 Nodo 3 Nodo 4

Nodo 1 v

.

.

(7)

Esquema do processo da inserção de um nó

da lista duplamente encadeada.

(situação três)

Listas Duplamente Encadeadas

L Nodo 1 Nodo 2 Novo v

.

.

.

L Nodo 1 Nodo 2 Nodo 3 v

.

.

.

(8)

Esquema do processo da inserção de um nó

da lista duplamente encadeada.

(situação quatro)

Listas Duplamente Encadeadas

L

Nodo 1 Nodo 2 Nodo 3

Novo v

.

.

X X L

Nodo 1 Nodo 3 Nodo 4

Nodo 2 v

.

.

(9)

void ins (LISTA_DUP_ENC *pl, int v, int k) {

NODO *novo;

if (k < 1 || k > tam(*pl)+1) {

printf ("\nERRO! Posição invalida para insercao.\n");

exit (1); }

novo = (NODO *) malloc (sizeof(NODO)); if (!novo)

{

printf ("\nERRO! Memoria insuficiente!\n"); exit (2); }

(10)

novo->inf = v; if (k==1) { novo->ant = NULL; novo->prox = *pl; *pl = novo; if ((*pl)->prox) (*pl)->prox->ant=novo; } else { LISTA_DUP_ENC aux;

(11)

novo->prox = aux->prox; aux->prox = novo; novo->ant=aux; if (novo->prox) novo->prox->ant=novo; } }

(12)

int recup (LISTA_DUP_ENC l, int k)

{

if (k < 1 || k > tam(l))

{

printf ("\nERRO! Consulta invalida.\n");

exit (3);

}

for (;k>1;k--)

l=l->prox;

return (l->inf);

}

(13)

Esquema do processo da retirada de um nó

da lista duplamente encadeada. (situação um)

Listas Duplamente Encadeadas

L Nodo 1

.

.

.

L Aux

.

X

(14)

Esquema do processo da retirada de um nó

da lista duplamente encadeada.

(situação dois)

Listas Duplamente Encadeadas

L

Nodo 1 Nodo 2 Nodo 3

Aux

.

.

X X L Nodo 1 Nodo 2

.

.

(15)

Esquema do processo da retirada de um nó

da lista duplamente encadeada.

(situação três)

Listas Duplamente Encadeadas

L

Nodo 1 Nodo 2 Nodo 3

Aux

.

.

X L Nodo 1 Nodo 2

.

.

(16)

Esquema do processo da retirada de um nó

da lista duplamente encadeada.

(situação quatro)

Listas Duplamente Encadeadas

L

Nodo 1 Nodo 2 Nodo 3

Aux

.

.

X X L Nodo 1 Nodo 2

.

.

(17)

void ret (LISTA_DUP_ENC *pl, int k) {

NODO *aux;

if (k < 1 || k > tam(*pl)) {

printf ("\nERRO! Posição invalida para retirada.\n"); exit (4); } if (k==1) { aux = *pl; *pl = aux->prox;

(18)

if (*pl) (*pl)->ant=NULL; free (aux); } else {

for (aux=(*pl)->prox; k>2; k--, aux=aux->prox); aux->ant->prox = aux->prox; if (aux->prox) aux->prox->ant = aux->ant; free (aux); } }

(19)

Implemente, no

TAD LISTA_DUP_ENC

, a

seguinte operação:

void inverter_lista (LISTA_DUP_ENC *pl);

a qual recebe uma referência para uma

lista duplamente encadeada e inverte a

ordem de seus elementos.

(20)

Listas Duplamente Encadeadas

Também

podemos

construir

listas

circulares duplamente encadeadas

ou

listas

circulares duplamente encadeadas com nó

cabeçalho

.

2

Lista circular duplamente encadeada

Lista circular duplamente encadeada com nó cabeçalho

(21)

Listas Duplamente Encadeadas

Para uma melhor fixação definiremos agora o TAD LISTA_CIR_DUP_ENC_ NC.

typedef struct nodo {

int inf;

struct nodo * ant; struct nodo * prox; }NODO;

typedef NODO * LISTA_CIR_DUP_ENC_NC; void cria_lista (LISTA_CIR_DUP_ENC_NC *); int eh_vazia (LISTA_CIR_DUP_ENC_NC);

int tam (LISTA_CIR_DUP_ENC_NC);

void ins (LISTA_CIR_DUP_ENC_NC, int, int); int recup (LISTA_CIR_DUP_ENC_NC, int);

(22)

void cria_lista (LISTA_CIR_DUP_ENC_NC *pl)

{

NODO *novo;

novo = (NODO *) malloc (sizeof(NODO));

if (!novo)

{

printf ("\nERRO! Memoria insuficiente!\n");

exit (2);

}

novo->inf=0;

(23)

int eh_vazia (LISTA_CIR_DUP_ENC_NC l)

{

return (l->inf == 0);

}

int tam (LISTA_CIR_DUP_ENC_NC l)

{

return (l->inf);

}

(24)

Esquema do processo da inserção de um nó

da lista circular duplamente encadeada com

nó cabeçalho.

Listas Duplamente Encadeadas

2 L

NC Nodo 1 Nodo 2 Novo

X

X

v

3 L

NC Nodo 1 Nodo 2 Nodo 3

(25)

void ins (LISTA_CIR_DUP_ENC_NC l, int v, int k) {

LISTA_CIR_DUP_ENC_NC aux, novo; if (k < 1 || k > tam(l)+1)

{

printf ("\n%d %d\n",tam(l)+1,k);

printf ("\nERRO! Posição invalida para insercao.\n");

exit (1); }

novo = (NODO *) malloc (sizeof(NODO)); if (!novo)

{

printf ("\nERRO! Memoria insuficiente!\n"); exit (2);

(26)

novo->inf = v;

for (aux=l; k>1; aux=aux->prox, k--); novo->prox = aux->prox; novo->ant = aux; aux->prox = novo; novo->prox->ant=novo; l->inf++; }

Referências

Documentos relacionados

1. Uma fila circular não pode ser implementada usando-se arrays. Em uma lista duplamente encadeada de caracteres, cada elemento da lista armazena dois caracteres,

data de vencimento, através de boleto bancário, caso a ASSINANTE não receba o boleto até o vencimento poderá imprimir a 2ª via pela página da CONTRATADA ou solicitar sua via

Das combinações mais marcantes e coloridas até as mais sóbrias, os acessórios vieram para enriquecer os guarda-roupas masculinos – e são a grande aposta.. Marcas masculinas

Os resultados apontam para o sentido de que a escola mesmo não sendo da sua cultura, é admitida pela necessidade de conviver com os não indígenas, partindo do

Inicialmente foi realizada uma visita à escola para obtenção de informações sobre os critérios de autorização para prosseguir com a pesquisa. Assim feito, foram

Contudo, os resultados permitem também perceber que é possível aos investidores, numa perspetiva de longo prazo, adotar uma estratégia de investimento que

2 Docente do curso de Direito do Centro Universitário “Antonio Eufrásio de Toledo” de Presidente Prudente. [email protected] Orientador do trabalho.. Quantum

Ou seja, o gradiente de um escalar (tensor de ordem zero) resulta em um vetor (tensor de primeira ordem), o gradiente de um vetor resulta em uma matriz (tensor de segunda ordem),