Você está na página 1de 4

ESTRUTURAS DE DADOS Prof. H.

Senger

1 Listas
Existem duas maneiras bastante utilizadas na construo de listas. Utilizando vetores Utilizando alocao dinmica de memria

2 Implementao de LISTAS usando vetores


A implementao de listas baseada em vetores traz alguns problemas: Necessidade de deslocar os dados existentes, cada vez que um dado tiver de ser removido ou includo na lista. No exemplo abaixo, se quisermos inserir um novo dado na posio 1 do vetor, preciso deslocar para frente todos os dados que esto a partir dessa posio, at o fim.

0 A

1 W

2 S

3 R

4 D

6 E

...

Dados a serem deslocados uma posio frente Posio onde o novo dado deve ser includo

Tamanho fixo: Depois que o programa foi compilado e iniciou a execuo, no mais possvel mudar o tamanho do vetor.

Soluo : Implementar de outra forma. Se possvel, de um modo que Permita acrescentar e remover dados, consumindo a quantidade de memria exata ( s o necessrio, nem mais, nem menos ) No exija o deslocamento dos dados a cada insero/remoo

3 Implementao de LISTAS usando alocao dinmica


De agora em diante, os dados da lista no mais sero guardados em um vetor, mas em clulas com o seguinte aspecto : Primeiro Joo Yara Ana

Note que cada clula contm um dado, e aponta (isto , indica) qual a prxima clula. 3.1 Criao de uma lista

O algoritmo abaixo fica constantemente incluindo novos dados na lista : Loop Ler_teclado (novo_dado); Criar (nova_clula); Nova_clula novo_dado; /* guarda novo_dado em nova_celula*/ Atualiza( Primeiro); Fim-loop 3.2 Destruio da lista /* loop infinito */

medida que o programa no precise mais de um dado da lista, ele pode remov-lo. O algoritmo abaixo fica continuamente retirando dados da lista, destruindo a clula de onde o dado foi retirando e liberando a memria: Loop /* loop infinito */ Dado contedo da clula; /* guarda o contedo da primeira clula*/ Utiliza(dado); /* faz alguma coisa com o dado ... */

Segundo Prximo_de (Primeiro); /* guarda quem o segundo */

Destri_celula_indicada_por (Primeiro); Primeiro Segundo; Fim-loop /*Atualiza o indicador de incio da lista*/

PROBLEMA: Imagine como construir um programa com as seguintes caractersticas : tem de armazenar ( na memria ) uma grande quantidade de dados esse programa ser executado juntamente com outros programas no mesmo computador, e portanto, ele s deve Alocar (reservar, usar) a quantidade de memria realmente necessria em algum momento, o usurio pode pedir para digitar mais dados apagar alguns dados existentes SOLUO: Esse programa deveria possuir o seguinte algoritmo : Loop /* loop infinito */ L_teclado_ou_mouse (comando); Se ( comando = Incluir) ento Incio Ler_teclado (novo_dado); Criar (nova_clula); Nova_clula novo_dado; /* guarda novo_dado */ Atualiza( Primeiro); Fim-se Seno Se ( comando = Apagar) ento Incio Segundo Prximo_de (Primeiro); /* guarda end. do segundo */ Destri_celula_indicada_por (Primeiro); Primeiro Segundo; /*Atualiza o indicador de incio da lista*/

Fim-se; Fim-loop