Вы находитесь на странице: 1из 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.

Вам также может понравиться