Академический Документы
Профессиональный Документы
Культура Документы
Nas listas com descritores vistas anteriormente a operao de remoo do ltimo n apresenta a necessidade de percorrer os ns seqencialmente, a partir do primeiro elemento, at chegarmos ao penltimo n. Para se evitar esse percurso, possvel estruturar uma lista de forma que possa ser percorrida em ambos os sentidos (do incio at o fim e do fim at o incio). Uma organizao implementando esse tipo de percurso denominada lista duplamente encadeada. Esquematicamente podemos representar uma Lista Linear Duplamente Encadeada (LLDE) como: prim qtd 3 Maria Jos Pedro ult
Cada n de uma lista desse tipo possui pelo menos trs campos. Um campo ponteiro indicando o prximo n, outro ponteiro indicando o n anterior e o terceiro campo contendo os dados. Os tipos em C para manter uma LLDECD podem ser definidos como:
typedef struct TNo *PNo; struct TNo { TInfo info; PNo esq, dir; }; typedef struct { PNo prim, ult; int qtd; } TDescritor; TDescritor lista;
Exerccios: Responda: numa representao de uma LLDE sempre possvel se dizer que: p igual a p->dir->esq e igual a p->esq->dir.? Faa uma rotina para inserir um n no fim da lista usando LLDECD. Rotina para remover o primeiro n da lista:
char removeInicioLLDECD(TDescritor *l, TInfo val) { PNo p; if (l->qtd==0) return 0; else { p = l->prim; l->prim = p->dir; l->qtd--; if (l->qtd==0) l->ult = NULL; else l->prim->esq = NULL; strcpy(val, p->info); free(p); return 1; } }
Trecho da incluso de um n entre dois ns (o n antes do ponto de incluso indicado pelo ponteiro q):
p=(PNo)malloc(sizeof(TNo)); p->esq = q; p->info = val; // atribuio genrica, qualquer tipo p->dir = q->dir; q->dir = p; p->dir->esq = p;
Trecho para excluir um n entre dois outros (o n a ser excludo indicado pelo ponteiro p):
p->esq->dir = p->dir; p->dir->esq = p->esq; val = p->info; free(p);
Obs.: note que na rotina acima no h mais a necessidade de se percorrer a lista desde o incio para se encontrar o penltimo n.
Note acima que no h necessidade do campo ult. Inicia uma LCDECD vazia:
void iniciaLLDECD(TDescritor *l) { l->prim=NULL; l->qtd=0; }
prim
qtd 0
Maria
Jos
Pedro
Exerccios: 1. Crie as rotinas para manipular LCDECD. 2. Polinmios podem ser representados por listas, cujos ns so registros com 3 campos: coeficiente, expoente e referncia ao n seguinte. Por exemplo, o polinmio 3x5+2x+1 pode ser representado por: Poli1 3 5 2 1 1 0
Crie uma rotina para ler um polinmio em uma lista a partir do teclado. Crie uma rotina que some dois polinmios. Crie uma rotina para multiplicar dois polinmios. 3. Faa um programa que leia um arquivo texto e carregue cada linha em um n de uma lista linear duplamente encadeada com descritor. Aps o arquivo estar completamente lido, as teclas s (sobe) e d (desce) do teclado podem ser usadas para mostrar uma linha do texto armazenado na lista. A tecla s serve para mostrar a linha acima da linha atualmente sendo apresentada, a tecla d mostra a abaixo da linha atual. Veja abaixo a representao de uma lista desse tipo criada a partir de um arquivo com trs linhas de texto. Considere que o tamanho mximo de cada linha de texto de 250 caracteres. Para ler as setas
Linha 1 do arquivo
Linha 2
ltima linha