Вы находитесь на странице: 1из 5

Lista com descritor (continuao)

Rotina para remover o primeiro elemento de uma LLSECD:


char removeInicioLLSECD(TDescritor *l, TInfo val) { PNo p; if (l->qtd==0) return 0; else { p = l->prim; l->prim=p->prox; if (l->qtd==1) l->ult = NULL; l->qtd--; strcpy(val, p->info); free(p); return 1; } }

Rotina para remover o ltimo n da lista:


char removeUltimoLLSECD(TDescritor *l, TInfo val) { PNo p, q; if (l->qtd==0) return 0; else { p = l->prim; while (p->prox) { q = p; p = p->prox; } l->qtd--; val = p->info; if (l->qtd==0) { l->prim = NULL; l->ult = NULL; } else { l->ult = q; q->prox = NULL; } free(p); return 1; } }

Listas Lineares Duplamente Encadeada (LLDE)


Lista Maria Jos Pedro

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;

Iniciao de uma LLDECD:


void iniciaLLDECD(TDescritor *l) { l->prim=l->ult=NULL; l->qtd=0; };

Insero de um n no incio da lista:


void insereInicioLLDECD(TDescritor *l, TInfo val) { PNo p; p = (PNo)malloc(sizeof(TNo)); strcpy(p->info, val); p->esq = NULL; p->dir = l->prim; if (l->qtd==0) l->ult=p; else l->prim->esq = p; l->prim = p; l->qtd++; }

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);

Remoo do ltimo n da lista:


char removeUltimoLLDECD(TDescritor *l, TInfo val) { PNo p; if (l->qtd==0) return 0; else { p = l->ult; l->ult = p->esq; l->qtd--; if (l->qtd==0) l->prim = NULL; else l->ult->dir = NULL; strcpy(val, p->info); free(p); return 1; } }

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.

Listas Circulares Duplamente Encadeadas com Descritor (LCDECD)


Neste tipo de lista o campo dir do ltimo n indica o endereo do primeiro n e o campo da esq do primeiro n contm o endereo do ltimo n. O descritor para este tipo de lista tem o seguinte formato:
typedef char TInfo[30]; typedef struct TNo *PNo; struct TNo { TInfo info; PNo esq, dir; }; typedef struct { PNo prim; int qtd; } TDescritor; TDescritor lista;

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

Representao de LCDECD com apenas um n: prim qtd 1

Representao de LCDECD com trs ns: prim qtd 3

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

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