Você está na página 1de 9

Lista encadeada

A estrutura consiste numa seqncia encadeada de elementos, em geral chamados de ns da lista. A lista representada por um ponteiro para o primeiro elemento (ou n). Do primeiro elemento, podemos alcanar o segundo seguindo o encadeamento, e assim por diante. O ltimo elemento da lista aponta para NULL, sinalizando que no existe um prximo elemento. Para exemplificar a implementao de listas encadeadas, vamos considerar um exemplo simples em que queremos armazenar valores inteiros numa lista encadeada. O n da lista pode ser representado pela estrutura abaixo:

Considerando a definio de Lista, podemos definir as principais funes necessrias para implementarmos uma lista encadeada.

Funo de inicializao
A funo que inicializa uma lista deve criar uma lista vazia, sem nenhum elemento.

Funo de insero
Uma vez criada a lista vazia, podemos inserir novos elementos nela. Para cada elemento inserido na lista, 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. Devemos notar que o ponteiro que representa a lista deve ter seu valor atualizado, pois a lista deve passar a ser representada pelo ponteiro para o novo primeiro elemento. Por esta razo, a funo de insero recebe como parmetros de entrada a lista onde 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.

Esta funo aloca dinamicamente o espao para armazenar o novo n da lista, guarda a informao no novo n e faz este n apontar para (isto , ter como prximo elemento) o elemento que era o primeiro da lista. A funo ento retorna o novo valor que representa a lista, que o ponteiro para o novo primeiro elemento.

Funo que percorre os elementos da lista


Para ilustrar a implementao de uma funo que percorre todos os elementos da lista, vamos considerar a criao de uma funo que imprima os valores dos elementos armazenados numa lista. Uma possvel implementao dessa funo mostrada a seguir.

Funo que verifica se lista est vazia


Pode ser til implementarmos uma funo que verifique se uma lista est vazia ou no. A funo recebe a lista e retorna 1 se estiver vazia ou 0 se no estiver vazia. Como sabemos, uma lista est vazia se seu valor NULL. Uma implementao dessa funo mostrada a seguir:

Essa funo pode ser re-escrita de forma mais compacta, conforme mostrado abaixo:

Funo de busca
Outra funo til consiste em verificar se um determinado elemento est presente na lista. A funo recebe a informao referente ao elemento que queremos buscar e fornece como valor de retorno o ponteiro do n da lista que representa o elemento. Caso o elemento no seja encontrado na lista, o valor retornado NULL.

Funo que insere um elemento da lista


A funo para inserir um elemento no final da lista mais complexa, Devemos fazer com que o ultimo valor da lista passe a ser o ponteiro para o novo elemento.

Se o elemento a ser inserido estiver no meio da lista, devemos fazer com que o elemento anterior a ele passe a apontar para o novo elemento e o novo elemento apontar para o seguinte.

Funo que retira um elemento da lista


A funo tem como parmetros de entrada a lista e o valor do elemento que desejamos retirar, e deve retornar o valor atualizado da lista, pois, se o elemento removido for o primeiro da lista, o valor da lista deve ser atualizado. A funo para retirar um elemento da lista mais complexa. Se descobrirmos que o elemento a ser retirado o primeiro da lista, devemos fazer com que o novo valor da lista passe a ser o ponteiro para o segundo elemento, e ento podemos liberar o espao alocado para o elemento que queremos retirar. Se o elemento a ser removido estiver no meio da lista, devemos fazer com que o elemento anterior a ele passe a apontar para o elemento seguinte, e ento podemos liberar o elemento que queremos retirar. Devemos notar que, no segundo caso, precisamos do ponteiro para o elemento anterior para podermos acertar o encadeamento da lista.

Programa final

Criando uma biblioteca de funes para lista


Diretivas uma construo de algumas linguagens de programao que especifica como o compilador ou montador deve processar o cdigo fonte A Diretiva include A diretiva #include j foi usada durante o nosso curso diversas vezes. Ela diz ao compilador para incluir, na hora da compilao, um arquivo especificado. Sua forma geral : #include "nome_do_arquivo" ou #include <nome_do_arquivo> A diferena entre se usar " " e < > somente a ordem de procura nos diretrios pelo arquivo especificado. Se voc quiser informar o nome do arquivo com o caminho completo, ou se o arquivo estiver no diretrio de trabalho, use " ". Se o arquivo estiver nos caminhos de procura pr-especificados do compilador, isto , se ele for um arquivo do prprio sistema (como o caso de arquivos como stdio.h, string.h, etc...) use < >. Observe que no h ponto e vrgula aps a diretiva de compilao. Esta uma caracterstica importante de todas as diretivas de compilao e no somente da diretiva #include A Diretiva ifndef A diretiva #ifndef funciona ao contrrio da diretiva #ifdef. Sua forma geral : #ifndef nome_da_macro sequncia_de_declaraes #endif A sequncia de declaraes ser compilada se o nome da macro no tiver sido definido. A Diretiva define A diretiva #define tem a seguinte forma geral: #define nome_da_macro sequncia_de_caracteres Quando voc usa esta diretiva, voc est dizendo ao compilador para que, toda vez que ele encontrar o nome_da_macro no programa a ser compilado, ele deve substitu-lo pela sequncia_de_caracteres fornecida. Isto muito til para deixar o programa mais geral. Veja um exemplo: #include <stdio.h> #define PI 3.1416 #define VERSAO "2.02" int main () { printf ("Programa versao %s",VERSAO); printf ("O numero pi vale: %f",PI); return 0; } Se quisermos mudar o nosso valor de PI, ou da VERSAO, no programa acima, basta mexer no incio do programa. Isto torna o programa mais flexvel. H quem diga que, em um programa, nunca se deve usar constantes como 10, 3.1416, etc., pois estes so nmeros que ningum sabe o que significam (muitas pessoas os chamam de "nmeros mgicos"). Ao invs disto, deve-se usar apenas #defines. uma conveno de programao (que deve ser seguida, pois torna o programa mais legvel) na linguagem C que as macros declaradas em #defines devem ser todas em maisculas.

Um outro uso da diretiva #define o de simplesmente definir uma macro. Neste caso usa-se a seguinte forma geral: #define nome_da_macro Neste caso o objetivo no usar a macro no programa (pois ela seria substituda por nada), mas, sim, definir uma macro para ser usada como uma espcie de flag. Isto quer dizer que estamos definindo um valor como sendo "verdadeiro" para depois podermos test-lo.

Criado a List.h
Vimos as 3 diretivas mais importantes no momento para podermos criar nossa biblioteca de funes para listas, existem outras mas no entraremos em detalhes agora s quando for conveniente. Na list.h criamos todos os prottipos das funes q sero usadas nos nossos programas.

Criando a List.cpp
Na List.cpp ou List.c criaremos a funes para serem chamadas na funes principal.

Criando a main.cpp
Na main.cpp ou main.c chamaremos todas as funes que precisarmos para nosso programa nesse arquivo, agora nosso programa ser todo desenvolvido nesse arquivo. Podemos ver q nosso programa fico muito mais limpo e mais fcil de trabalhar, se precisar fazer qualquer alterao na lista ou nos funes da lista essas alteraes sero feitas nos outros arquivos criados acima.

Projeto
timo j tenho meus arquivos prontos mas e agora como fao para compilar e executar meu programa ??? Darei dois exemplos de como compilarem seus programas. Microsoft Visual C++ 2010 Express Visual Studio fornece dois recipientes para ajudar com eficincia a gerenciar os itens que so exigidos por seu esforo de desenvolvimento, tais como referncias, conexes de dados, pastas e arquivos. Esses recipientes so chamados solues e projetos. O Visual Studio fornece Pastas de Soluo para organizar os projetos relacionados em grupos e executar aes nesses grupos de projetos. O Solution Explorer uma interface para exibir e gerenciar esses recipientes e seus itens associados, parte do o ambiente integrado de desenvolvimento (IDE).

Como podemos ver na imagem acima utilizando o Solution Explorer fica mais fcil gerenciar e organizar nosso projeto e na hora de compilar tambm, se os arquivos estiverem nas pastas corretas o prprio programas se encarrega de interliga os arquivos na hora de debugar.

Makefile
O que O makefile um arquivo para configurao de compilao utilizado pelo programa Make, cuja idia simplificar e agilizar a compilao de programas. Forma de utilizao Para utilizar o makefile basta criar o arquivo com o nome makefile no diretrio onde se encontram os arquivos fonte para compilao e executar o programa make no mesmo diretrio.
CC=g++ SRCS= List.c main.c ( pode ser .cpp ) OBJS=$( SRCS:.cpp=.o) TARGET=main ALL: $(TARGET) $(TARGET) : $(OBJS) $(CC) $(OBJS) o $@ .cpp.o: $(CC) -c $< Clean: rm f *.o *.hi*~

No vamos entrar em detalhes sobre o makefile no momento. Apenas substituindo os nomes dos arquivos no SRCS e mandar executar o arquivo make j funcionara. Uma outra oportunidade entraremos mais afundo em detalhes.

Você também pode gostar