Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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
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 de Dados
Estrutura de Dados
ltimo
ltimo
x0
x1
Ultimo
malloc(sizeof *(Lista->Ultimo->Prox))
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
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