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

LISTAS ENCADEADAS DINMICAS

CONCEITOS BSICOS: uma sequencia de ns, cuja relao de sucesso estabelecida por um ponteiro de endereo do prximo n. Diferentemente das listas sequenciais, em que a sucesso dos ns estabelecida de forma fsica ou contgua, nas listas encadeadas, a sucesso dos ns estabelecida de forma lgica. Para cada novo elemento inserido na estrutura, alocamos um espao de memria para armazen-lo. Dessa forma, o espao total de memria gasto pela estrutura proporcional ao nmero de elementos armazenado. No entanto, no podemos garantir que os elementos armazenados na lista ocuparo um espao de memria contguo; portanto, no temos acesso direto aos elementos da lista. Para percorrer todos os elementos, devemos explicitamente guardar o seu encadeamento, o que feito armazenando-se, junto com a informao de cada elemento, um ponteiro para o prximo elemento da lista. Sendo assim, em uma lista encadeada dinmica, cada elemento chamado n. Cada n composto por dois campos: info: contm a informao do n; prox: contm o endereo do prximo n. Os ns da lista esto ligados entre si pelo campo prox e mostram o encadeamento (a ligao de um n a n). O campo prox chamado ponteiro para o prximo n. Lista encadeada dinmica = acessada a partir de um ponteiro p que aponta para o primeiro elemento (n) da lista. O campo prox do ltimo n da lista armazena o valor NULL, que indica o final da lista.

Arranjo da memria de uma lista encadeada

A estrutura consiste em uma sequencia encadeada de elementos, os ns da lista. A lista representada por um ponteiro para o primeiro elemento (n). Do primeiro elemento, podemos alcanar o segundo, seguindo o encadeamento, e assim por diante. O ltimo elemento da lista armazena, como prximo elemento, um ponteiro invlido, com valor NULL, e sinaliza, assim, que no existe um prximo elemento. Uma lista sem n chamada lista vazia ou lista nula e seu ponteiro p nulo (NULL). Exemplo:

Declarao do N da Lista
struct no { <tipo> info; struct no *prox; }; typedef struct no Lista; ou typedef struct no { <tipo> info; struct no *prox; } Lista;

Sabendo que <tipo> pode ser:


int char float vetor struct ....

O tipo Lista representa um n da lista, e a estrutura de lista encadeada representada pelo ponteiro para seu primeiro elemento (tipo Lista*). Lista x; Lista *p; //n da lista //ponteiro para um n da lista p = (Lista*) malloc(sizeof(Lista));

p = &x; ou

Temos que x um n da lista, portanto: x.info; x.prox; //acessa a informao do n //acessa o endereo do prximo n

Temos que p um ponteiro para um n da lista, portanto: p->info; p->prox; //acessa a informao do n //acessa o endereo do prximo n

O endereo de uma lista encadeada o endereo do seu primeiro n. Portanto, se p aponta para o primeiro n da lista, ento podemos dizer que p a lista, pois ele o nico endereo acessvel diretamente. Se p uma lista, ento: p = NULL; //lista vazia

p->prox; // uma lista

Operaes com Listas Alm da representao dos ns, temos os procedimentos bsicos sobre listas encadeadas, que so: (a) definio da estrutura da lista; (b) inicializao da lista; (c) insero tendo um endereo com referencia; (d) alocao de um endereo do n para insero na lista; (e) remoo tendo um endereo como referencia para excluso do n; (f) desalocao do n que foi removido da lista; (g) localizao de um elemento da lista. (h) etc... Todas estas operaes sero discutidas e implementadas.

Funo de Criao A funo que cria uma lista vazia deve ter como valor de retorno uma lista sem nenhum elemento. Como a lista representada pelo ponteiro para o primeiro elemento, uma lista vazia representada pelo ponteiro NULL, pois no existem elementos na lista. A funo tem como valor de retorno a lista vazia inicializada, isto , o valor de retorno NULL. Uma possvel implementao da funo de criao:
/* funo de criao: retorno uma lista vazia */

Lista * cria_lista(void) { return NULL; } Funo de Insero Criada a lista vazia, podemos inserir nela novos elementos. Em uma lista com/sem cabea, podemos inserir um novo elemento: no incio; no final; no meio; antes/depois de um elemento; antes/depois de uma posio

Para cada elemento inserido, devemos alocar dinamicamente a memria necessria para armazenar o elemento e encade-lo na lista existente.
A funo de insero mais simples insere o novo elemento no incio da lista.

Insero no Incio Lista SEM cabea 1 passo) Alocao de memria 2 passo) Preencher o campo info 3 passo) novo->prox = p; 4 passo) p = novo; Ilustrao de lista vazia:

Ilustrao de lista com elementos:

IMPLEMENTAO Uma possvel implementao dessa funo mostrada a seguir. Devemos notar que o ponteiro que representa a lista deve ter seu valor atualizado, pois a lista deve passar a ser representado pelo ponteiro para o novo primeiro elemento. Por essa razo, a funo de insero recebe como parmetros de entrada a lista na qual ser inserido o novo elemento e a informao do novo elemento e tem como valor de retorno a nova lista, representada pelo ponteiro para o novo elemento.
/* insero no incio: retorna a lista atualizada */

Lista * insere_lista(Lista *p, int x) { Lista *novo; novo = (Lista *) malloc(sizeof(Lista)); novo->info = x;

novo->prox = p; p = novo; return (p); } main() { int x; char resp = S; Lista *p = NULL; do { puts(Insira um numero inteiro: ); scanf(%d, &x); p= insere_lista(p,x); puts(Insere outro elemento [S/N]: ); fflush(stdin); scanf( %c, &resp); } while (resp == S || resp == s); }

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