Você está na página 1de 16

Estruturas de Dados

Aula 014
Listas Duplamente Encadeadas

Listas Duplamente Encadeadas


Uma lista duplamente encadeada aquela em que cada nodo possui duas referncias em vez de uma s. A primeira usada para indicar o nodo anterior e a segunda serve para apontar o prximo nodo. As Listas Duplamente Encadeadas podem ou no ter header.
Lista 21 33 52

Declarao da Estrutura sem Header


struct nodo { struct nodo *anterior; int dados; struct nodo *proximo; }; struct nodo *inicio = NULL, *fim = NULL;

Operaes com Listas Duplamente Encadeadas sem Header Inserindo elemento a esquerda da estrutura
void insere_esquerda(struct nodo **inicio, struct nodo **fim, int valor, int *status) { struct nodo *p; *status = 0; p = (struct nodo *) malloc(sizeof(struct nodo)); if (p != NULL) { p->dados = valor; p->anterior = NULL; p->proximo = *inicio; if (*inicio == NULL) { *fim = p; } else { (*inicio)->anterior = p; } *inicio = p; *status = 1; } }

Declarao da Estrutura com Header


struct nodo { struct nodo *anterior; int dados; struct nodo *proximo; }; struct header { struct nodo *inicio; int qtde; struct nodo *fim; }; Lista 3

21

33

52

Operaes com Listas Duplamente Encadeadas com Header Inserindo elemento antes do primeiro nodo ( esquerda)
void insere_esquerda(struct header *lista, int valor, int *status) struct nodo *p; *status = 0; if (lista != NULL) { p = (struct nodo *) malloc(sizeof(struct nodo)); if (p != NULL) { p->dados = valor; p->anterior = NULL; p->proximo = lista->inicio; if (lista->inicio == NULL) { lista->fim = p; } else { (lista->inicio)->anterior = p; } lista->inicio = p; lista->qtde = lista->qtde + 1; *status = 1; } } } {

Inserindo elemento no final da lista ( direita)


void insere_direita(struct header *lista, int valor, int *status) { struct nodo *p; *status = 0; if (lista != NULL) { p = (struct nodo *) malloc(sizeof(struct nodo)); if (p != NULL) { p->dados = valor; p->proximo = NULL; p->anterior = lista->fim; if (lista->inicio == NULL) { lista->inicio = p; } else { (lista->fim)->proximo = p; } lista->fim = p; lista->qtde = lista->qtde + 1; *status = 1; } } }

Remove o primeiro nodo da lista ( esquerda)


int remove_esquerda(struct header *lista, int *status) { struct nodo *aux; int valor; *status = 0; if ((lista != NULL) && (lista->qtde > 0)) { aux = lista->inicio; lista->inicio = aux->proximo; if (lista->inicio == NULL) { lista->fim = NULL; } else { (lista->inicio)->anterior = NULL; } valor = aux->dados; free(aux); lista->qtde = lista->qtde 1; *status = 1; } return valor; }

Remove o ltimo nodo da lista ( direita)


int remove_direita(struct header *lista, int *status) { struct nodo *aux; int valor; if ((lista != NULL) && (lista->qtde > 0)) { aux = lista->fim; lista->fim = aux->anterior; if (lista->fim == NULL) { lista->inicio = NULL; } else { (lista->fim)->proximo = NULL; } valor = aux->dados; free(aux); lista->qtde = lista->qtde 1; *status = 1; } return valor; }

Exerccios

Exerccio 1 Elabore um programa que permita a leitura de 10 valores inteiros e armazene em uma Lista Duplamente Encadeada com header (insere no incio da lista). Mostre os elementos existentes na lista. Aps a incluso dos elementos remova o primeiro elemento inserido na lista. Mostre os elementos existentes na lista Leia um novo valor, que deve ser inserido antes do nodo que contm o maior elemento da lista (escreva uma funo para descobrir o maior elemento da lista). Mostre o maior elemento da lista antes de incluir um novo elemento e depois de inserir o novo elemento. No final, mostre todos os valores armazenados na lista e ento a libere.

Exerccio 2 Escreva um procedimento que receba uma lista duplamente encadeada, com header, e troca o primeiro elemento com o ltimo, o segundo com o penltimo, e assim sucessivamente. O prottipo do procedimento : void comuta(struct header *Lista) Monte um programa para testar o procedimento acima, o qual dever receber n valores inteiros fornecidos pelo usurio, inserindo-os em uma lista duplamente encadeada com header. Mostre os elementos contidos na lista. Chame o procedimento comuta(). Mostre a lista resultante. Libere a lista e encerre o programa.

Exerccio 3 Escreva uma funo que receba duas listas duplamente encadeadas com header, L1 e L2, e retorne verdadeiro se os elementos da lista L1 esto contidos na lista L2, ou falso, em caso contrrio. O prottipo do procedimento : int esta_contido(struct header *L1, struct header *L2) Monte um programa para testar o procedimento acima, o qual dever receber do usurio n caracteres para compor a lista L1 e m caracteres para compor a lista L2. Mostre os elementos contidos nas duas listas. Teste se a lista L1 est contida em L2, emitindo uma mensagem apropriada. A seguir teste se a lista L2 esta continda em L1, emitindo uma mensagem apropriada. Libere as listas e encerre o programa.

Exerccio 4 Escreva uma funo que receba duas listas duplamente encadeadas com header, L1 e L2, e retorne uma nova lista encadeada duplamente com header ordenada contendo os valores de L1 e L2. A nova lista no deve conter repetio de elementos. A funo dever fazer a insero dos elementos na nova lista de forma ordenada, no pondendo ser utilizada nenhuma rotina de classificao disponibilizada pela linguagem, como qsort(), por exemplo. O prottipo do procedimento : struct header * uniao(struct header *L1, struct header *L2) Monte um programa para testar o procedimento acima, o qual dever receber do usurio n caracteres para compor a lista L1 e m caracteres para compor a lista L2. Mostre os elementos contidos nas duas listas. Chame a funo uniao() e mostre a lista resultante. Libere as listas e encerre o programa.

Exerccio 5 Escreva uma funo que receba duas listas duplamente encadeadas com header, L1 e L2, e retorne uma nova lista encadeada duplamente com header contendo a interseo de L1 e L2. O prottipo do procedimento : struct header * intersecao(struct header *L1, struct header *L2) Monte um programa para testar o procedimento acima, o qual dever receber do usurio n valores inteiros para compor a lista L1 e m valores inteiros para compor a lista L2. Mostre os elementos contidos nas duas listas. Chame a funo intersecao() e mostre a lista resultante. Libere as listas e encerre o programa.

Exerccio 6 Escreva uma funo que receba como parmetro uma lista L1 duplamente encadeada com header, contendo apenas caracteres, um valor inteiro positivo p representando a posio de um nodo da lista, e um inteiro positivo n representando uma quantidade de nodos. A funo dever retornar uma sublista contendo n elementos obtidos a partir do elemento na posio p da lista L1 (isto , p indica a partir de qual elemento a sublista dever ser computada). O prottipo do procedimento : struct header * subLista(struct header *L1, int p, int n) Monte um programa para testar o procedimento acima, o qual dever receber do usurio m caracteres para compor a lista L1. Mostre os elementos contidos nas duas listas. Receber do usurio a posio p do elemento inicial e o tamanho n da sublista a ser obtida de L1. Chame a funo subLista() e mostre a lista resultante. Libere as duas listas e encerre o programa.

Você também pode gostar