Você está na página 1de 14

LISTAS ENCADEADAS OU NO- SEQENCIAIS

Estrutura de Dados

Listas Lineares
Como visto anteriormente, as operaes bsicas para o nosso TAD Lista Linear so:
FLVazia Vazia Retira Insere Imprime

A implementao atravs de arrays possui a grande desvantagem de ter que prever a quantidade mxima de elementos da lista antes de sua utilizao efetiva
Estrutura de Dados

Os elementos (ns ou clulas) da lista so registros com um dos componentes destinado a guardar o endereo do seu sucessor

Implementao de Listas com Ponteiros

x0

x1

x2

...

xn

NULL

Desta forma, cada item da lista encadeado com o seguinte atravs de uma varivel do tipo Ponteiro Os ns da lista esto dispostos de maneira aleatria na memria (posies no obrigatoriamente contguas) e so interligados por ponteiros: por isso tambm chamada de lista no-seqencial
Estrutura de Dados

A Lista Encadeada
Assim, cada n (ou clula) deve conter um item da lista e um campo extra para um apontador para o n seguinte A alocao dinmica de memria a tcnica utilizada: as posies de memria so alocadas (desalocadas) quando so necessrias (desnecessrias) Como visto, C faz a gerncia de memria atravs das declaraes malloc e free Existem outras implementaes: simplesmente ou duplamente encadeadas e listas encadeadas circulares; com ou sem ns sentinela
Estrutura de Dados

Vantagens e Desvantagens
Desvantagens
1. Acesso indireto aos elementos 2. Tempo varivel para acessar os elementos (depende da posio do elemento) 3. Gasto de memria maior pela necessidade de um novo campo para o ponteiro

Vantagens
1. A insero e remoo de elementos podem ser feitas sem deslocar os itens seguintes da lista 2. No h necessidade de previso do nmero de elementos da lista; o espao necessrio alocado em tempo de execuo 3. Facilita o gerenciamento de vrias listas (fuso, diviso,...)

Estrutura de Dados

Lista Simplesmente Encadeada


Deve existir sempre uma indicao do primeiro n: a partir dele a lista percorrida (numa lista seqencial, como seria?) Ento, seria necessrio um cuidado especial no tratamento do primeiro n da lista: Uma pequena variao na estrutura, com a adio de um n chamado n-cabea, evita alguns testes com o 1o. n e melhora o desempenho das operaes na lista O n-cabea no contm informaes relacionadas aos dados da lista e nunca removido
Estrutura de Dados

Testes em algoritmos de insero e remoo para verificar se este ponteiro ou no igual a NULL

Representao
Lista encadeada sem n-cabea

Primeiro

x0

x1

...

xn

Lista encadeada com n-cabea

Primeiro

x0

x1

...

xn

OBS: A implementao a seguir de uma lista encadeada com n-cabea (ver mais informaes nas referncias indicadas)
Estrutura de Dados

Estrutura da Lista Encadeada


typedef int TipoChave; typedef struct { TipoChave Chave; /* outros componentes */ } TipoItem; typedef struct Celula_str *Apontador; typedef struct Celula_str { TipoItem Item; Apontador Prox; } Celula; typedef struct { Apontador Primeiro, Ultimo; } TipoLista;

Estrutura de Dados

Implementao: FLVazia e Vazia


void FLVazia(TipoLista *Lista) { Lista->Primeiro = malloc(sizeof *(Lista->Primeiro)); Lista->Ultimo = Lista->Primeiro; Lista->Primeiro->Prox = NULL; } int Vazia(TipoLista Lista) { return (Lista.Primeiro == Lista.Ultimo); }

Estrutura de Dados

Insero em lista encadeada


Primeiro

ltimo

ltimo

x0

x1
Ultimo

malloc(sizeof *(Lista->Ultimo->Prox))

Lista->Ultimo->Prox=malloc(sizeof *(Lista->Ultimo->Prox)); Lista->Ultimo = Lista->Ultimo->Prox; Lista->Ultimo->Item = x; Lista->Ultimo->Prox = NULL;

Estrutura de Dados

Implementao: Insere
void Insere(TipoItem x, TipoLista *Lista) { Lista->Ultimo->Prox = malloc(sizeof *(Lista->Ultimo->Prox)); Lista->Ultimo = Lista->Ultimo->Prox; Lista->Ultimo->Item = x; Lista->Ultimo->Prox = NULL; }

Estrutura de Dados

Remoo em lista encadeada


Primeiro

ltimo

ltimo

x0
aux aux = p->Prox; *Item = aux->Item; p->Prox = aux->Prox; if(p->Prox == NULL) Lista->ltimo = p; free(aux);

X1

x2

x1

Estrutura de Dados

Implementao: Retira
void Retira(Apontador p, TipoLista *Lista, TipoItem *Item) { /* --- Obs.: o item a ser retirado eh o seguinte ao apontado por p --- */ Apontador aux; if (Vazia(*Lista) || p == NULL || p->Prox == NULL) { printf(" Erro: Lista vazia ou posicao nao existe\n"); return; } aux = p->Prox; *Item = aux->Item; p->Prox = aux->Prox; if (p->Prox == NULL) Lista->Ultimo = p; free(aux); }

Estrutura de Dados

Implementao: Imprime
void Imprime(TipoLista Lista) { Apontador Aux; Aux = Lista.Primeiro->Prox; while (Aux != NULL) { printf("%d\n", Aux->Item.Chave); Aux = Aux->Prox; } }
Estrutura de Dados

Você também pode gostar