Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduo ............................................................................................................................................... 2 Listas Ligadas ......................................................................................................................................... 3 Estrutura das Listas Ligadas ................................................................................................................... 3 Operaes de Listas Ligadas ................................................................................................................... 4 Funo de inicializao ....................................................................................................................... 4 Funo de insero.............................................................................................................................. 4 Funo que percorre os elementos da lista.......................................................................................... 5 Funo que verifica se lista est vazia ................................................................................................ 5 Funo de busca .................................................................................................................................. 5 Funo que retira um elemento da lista .............................................................................................. 6 Funo para liberar a lista ................................................................................................................... 7 Vantagens................................................................................................................................................ 7 Desvantagens .......................................................................................................................................... 7 Tipos de Listas Ligadas .......................................................................................................................... 8 Listas Ligadas Simples ....................................................................................................................... 8 Propriedadas das Listas Ligadas Simples ........................................................................................... 8 Listas duplamente ligadas ................................................................................................................... 8 Vantagens............................................................................................................................................ 9 Desvantagens ...................................................................................................................................... 9 Listas circulares .................................................................................................................................. 9 Lista circular duplamente encadeada ................................................................................................ 10 Vantagens.......................................................................................................................................... 10 Desvantagens .................................................................................................................................... 10 Projecto ................................................................................................................................................. 11 Concluso.............................................................................................................................................. 12 Referncias Bibliogrficas .................................................................................................................... 13
Introduo
Frequentemente precisamos agrupar vrios elementos/dados num conjunto. A partida podemos no saber o nmero exacto de elementos a ser agrupados. Em cada instante podemos acrescentar ou remover elemento ao conjunto. Em programao consideramos dois tipos de estruturas que permitem guardar uma coleco de elementos: estrutura esttica e estrutura dinmica. Os elementos podem ser organizados de um modo distinto. Uma matriz uma estrutura que fornecido em linguagens de programao. No entanto, tem pelo menos duas limitaes: (1) rearranjar o tamanho da matriz necessria para criar uma matriz com o tamanho pr-arranjo com o novo tamanho, e (2) nos dados de matriz so prximas umas das outras sequencialmente na memria, o que significa que para inserir um item para a matriz deve ser movido por outro arranjo. Esta limitao pode ser ultrapassada pela utilizao de estruturas ligadas. A estrutura relacionada uma coleo de ns que armazena os dados e links para outros ns. Assim, os ns podem ser localizado em qualquer lugar da memria e da passagem a partir de um n para o outro dentro da estrutura ligada conseguido atravs do armazenamento das referncias ou para outro n ou ns na estrutura. Uma lista encadeada a forma mais simples de representar uma coleco de elementos que juntos formam uma ordenao linear. Cada elemento da coleco representado pelo objecto da classe No . Mesmo quando as estruturas ligadas pode ser implementado numa variedade de formas, mais flexvel a utilizao de um objeto separado para cada n. Listas de dados so conjuntos de elementos de dados "alienado em uma linha", as inseres e excluses so feitas em qualquer parte de uma lista encadeada. As pilhas so importantes para compiladores e sistemas operativos, as inseres e delees so feitas apenas com uma extremidade da pilha isto , na parte superior. As filas de espera representam linhas, as inseres so feitas no final (tambm conhecido como o calcanhar) de uma fila, e delees so feitas a partir do topo (tambm conhecido como a cabea) de uma fila. As rvores fornecem busca e arquivos de dados ordinamiento sytem e expresses compilao em linguagem de mquina. Cada uma destas estruturas de dados tem muitas outras aplicaes interessantes. O presente trabalho tem como objectivo fazer uma abordagem as listas ligadas, para melhor compreenso e com isso sermos capazes de desenvolver uma aplicao cujo seja capaz de registar vrios servios num Registo Cvil como registos de nascimentos, casamentos entre outros.
Listas Ligadas
Uma lista ligada uma estrutura linear e dinmica, que corresponde a uma sequncia lgica de entradas ou ns. Tipicamente, em uma lista ligada h um ou dois pontos conhecidos de acesso, normalmente o topo da lista (seu primeiro elemento) e eventualmente o fim da lista (seu ltimo elemento). Cada n armazena tambm a localizao do prximo elemento na seqncia, ou seja, de seu n sucessor. Desse modo, o armazenamento de uma lista no requer uma rea contgua de memria.
Podemos notar que trata-se de uma estrutura auto-referenciada, pois, alm do campo que armazena a informao (no caso, um nmero inteiro), h um campo que um ponteiro para uma prxima estrutura do mesmo tipo. Embora no seja essencial, uma boa estratgia definirmos o tipo Lista como sinnimo de struct lista, conforme mostrado acima. O tipo Lista representa um n da lista e a estrutura de lista encadeada representada pelo ponteiro para seu primeiro elemento (tipo Lista*). Considerando a definio de Lista, podemos definir as principais funes necessrias para implementarmos uma lista encadeada. As listas ligadas apresentam operaes como: inicializa uma lista vazia, cria um novo n, inserir um n na lista, procurar um n na lista, imprimir a lista, remover um n na lista, liberar a lista (Remover todos os elementos) .
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. 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 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.
/* insero no incio: retorna a lista atualizada */ Lista* insere (Lista* l, int i) { Lista* novo = (Lista*) malloc(sizeof(Lista)); novo->info = i; novo->prox = l; return novo; }
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 representa a lista, que o ponteiro para o novo primeiro elemento. A Figura 2 ilustra a operao de insero de um novo elemento no incio da lista.
O trecho de cdigo que cria uma lista inicialmente vazia e insere nela novos elementos.
int main (void) { Lista* l; /* declara uma lista no inicializada */ l = inicializa(); /* inicializa lista como vazia */ l = insere(l, 23); /* insere na lista o elemento 23 */ l = insere(l, 45); /* insere na lista o elemento 45 */ ... return 0; }
No podemos deixar de actualizar a varivel que representa a lista a cada insero de um novo elemento.
Essa funo pode ser re-escrita de forma mais compacta, conforme mostrado abaixo:
/* funo vazia: retorna 1 se vazia ou 0 se no vazia */ int vazia (Lista* l) { return (l == NULL); }
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 busca: busca um elemento na lista */ Lista* busca (Lista* l, int v) { Lista* p; for (p=l; p!=NULL; p=p->prox) if (p->info == v) return p; return NULL; /* no achou o elemento */ }
Uma possvel implementao da funo para retirar um elemento da lista mostrada a seguir. Inicialmente, busca-se o elemento que se deseja retirar, guardando uma referncia para o elemento anterior.
/* funo retira: retira elemento da lista */ Lista* retira (Lista* l, int v) { Lista* ant = NULL; /* ponteiro para elemento anterior */ Lista* p = l; /* ponteiro para percorrer a lista*/ /* procura elemento na lista, guardando anterior */ while (p != NULL && p->info != v) { ant = p; p = p->prox; } /* verifica se achou elemento */ if (p == NULL) return l; /* no achou: retorna lista original */ /* retira elemento */ if (ant == NULL) {
/* retira elemento do inicio */ l = p->prox; } else { /* retira elemento do meio da lista */ ant->prox = p->prox; } free(p); return l; }
O caso de retirar o ltimo elemento da lista recai no caso de retirar um elemento no meio da lista, conforme pode ser observado na implementao acima. Mais adiante, estudaremos a implementao de filas com listas encadeadas. Numa fila, devemos armazenar, alm do ponteiro para o primeiro elemento, um ponteiro para o ltimo elemento. Nesse caso, se for removido o ltimo elemento, veremos que ser necessrio actualizar a fila.
Vantagens
A insero ou remoo de um elemento na lista no implica a mudana de lugar de outros elementos; No necessrio definir, no momento da criao da lista, o nmero mximo de elementos que esta poder ter. Ou seja, possvel alocar memria "dinamicamente", apenas para o nmero de ns necessrios. uma estrutura de dados dinmica, muito flexvel, que permite a fcil insero e remoo dos seus elementos. Facilita o gerenciamento de vrias listas (fuso, diviso,...) .
Desvantagens
A manipulao torna-se mais "perigosa" uma vez que, se o encadeamento (ligao) entre elementos da lista for mal feito, toda a lista pode ser perdida; Para aceder ao elemento na posio n da lista, deve-se percorrer os n - 1 anteriores. Acesso indirecto aos elementos . Tempo varivel para acessar os elementos (depende da posio do elemento) . Gasto de memria maior pela necessidade de um novo campo para o ponteiro .
Desta forma, dado um elemento, podemos acessar ambos os elementos adjacentes: o prximo e o anterior. Se tivermos um ponteiro para o ltimo elemento da lista, podemos percorrer a lista em ordem inversa, bastando acessar continuamente o elemento anterior, at alcanar o primeiro elemento da lista, que no tem elemento anterior (o ponteiro do elemento anterior vale NULL).
Para exemplificar a implementao de listas duplamente encadeadas, vamos novamente considerar o exemplo simples no qual queremos armazenar valores inteiros na lista. O n da lista pode ser representado pela estrutura abaixo e a lista pode ser representada atravs do ponteiro para o primeiro n.
struct lista2 { int info; struct lista2* ant; struct lista2* prox; }; typedef struct Lista2 Lista2;
Vantagens
Maior facilidade de controle da lista, maior confiabilidade e menor risco de perda acidental da lista.
Desvantagens
Maior gasto de espao em disco (2 ns a mais).
Listas circulares
Algumas aplicaes necessitam representar conjuntos cclicos. Por exemplo, as arestas que delimitam uma face podem ser agrupadas por uma estrutura circular. Para esses casos, podemos usar listas circulares. Numa lista circular, o ltimo elemento tem como prximo o primeiro elemento da lista, formando um ciclo. A rigor, neste caso, no faz sentido falarmos em primeiro ou ltimo elemento. A lista pode ser representada por um ponteiro para um elemento inicial qualquer da lista. A Figura 7 ilustra o arranjo da memria para a representao de uma lista circular.
Fig. 7 Arranjo da memria de uma lista circular.
Para percorrer os elementos de uma lista circular, visitamos todos os elementos a partir do ponteiro do elemento inicial at alcanarmos novamente esse mesmo elemento. O cdigo abaixo exemplifica essa forma de percorrer os elementos. Neste caso, para simplificar, consideramos uma lista que armazena valores inteiros.
Devemos salientar que o caso em que a lista vazia ainda deve ser tratado (se a lista vazia, o ponteiro para um elemento inicial vale NULL).
void imprime_circular (Lista* l) { Lista* p = l; /* faz p apontar para o n inicial */ /* testa se lista no vazia */ if (p) { { /* percorre os elementos at alcanar novamente o incio */ do { printf("%d\n", p->info); /* imprime informao do n */ p = p->prox; /* avana para o prximo n */ } while (p != l);
Vantagens
Economia de espao em disco (1 n a menos que a lista duplamente encadeada com sentinelas), maior confiabilidade em relao ao modelo comum.
Desvantagens
Maior complexidade nos algoritmos.
Projecto
Cartrio um nome genrico que designa uma repartio pblica ou privada que tem a custdia de documentos (cartas) e que lhes d f pblica. Registo civil o termo jurdico que designa o assentamento dos factos da vida de um indivduo, tais como o seu nascimento, casamento, divrcio ou morte (bito). Tambm so passveis de registro civil as interdies, as tutelas, as adopes, os pactos pr-nupciais, o exerccio do poder familiar (chamado de ptrio poder no antigo cdigo civil de 1916 do Brasil; em Portugal: poder paternal), a opo de nacionalidade, entre outros fatos que afectam diretamente a relao jurdica entre diferentes cidados.
Concluso
Uma Lista Ligada representa um conjunto de elementos denominados ns onde as informaes so armazenadas. Cada n deve obrigatoriamente possuir um apontador para o prximo elemento da lista, caracterizando assim uma ligao entre ns. Portanto, um n um registo que contm a informao a ser armazenada e o apontador ara o prximo n. A utilizao de listas ligadas resolve vrios problemas tpico que, se usando vectores seria muito trabalhoso. Alguns problemas exigem que certas prioridades dos elementos do vectores sejam garantidas como, por exemplo, a ordem em que o elementos so inseridos define a ordem que sero removidos. As listas ligadas conseguem ser mais vantajosas em relao aos vectores pois usando as listas ligadas, no h necessidade de redimensionar pois considera cada elemento individualmente, pois num vector o redimensionamento obrigatio. Nas Listas ligadas no preciso deslocar valores para garantir alguma ordem dos elementos, mas uma das desvantagens das listas ligadas que com estas no possvel fazer acesso imediato ou seja necessrio percorrer alguns elementos. Podemos utilizar a estrutura dinmica simplesmente encadeada ou duplamente encadeada para implementao da lista circular. Para implementao deste tipo de lista devemos especificar classe NoD composto por elemento, referncia para o elemento seguinte e referncia para o elemento anterior. Listas circulares so listas onde o primeiro e ltimo elemento esto ligados. Uma lista encadeada a forma mais simples de representar uma coleco de elementos que juntos formam uma ordenao linear. Cada elemento da coleco representado pelo objecto da classe No . A ordenao determinada armazenando num n uma referncia para um elemento e uma referncia, chamada de prximo, para o prximo n da coleco. As listas duplamente ligadas consiste quando cada No da lista duplamente encadeada possui uma ligao no s para o prximo elemento, mas tambm para o elemento anterior da lista. Esta variante da lista simplesmente encadeada permite a insero e a remoo na cabea e na cauda da lista com o tempo de execuo O(1). Listas circulares so listas onde o primeiro e ltimo elemento esto ligados. Podemos utilizar a estrutura dinmica simplesmente encadeada ou duplamente encadeada para implementao da lista circular.
Referncias Bibliogrficas
Adam Drozdek, Estructura de datos y algoritmos en Java, Thomson, 2. Edicon. Grupo Papime Pe - 100205, Introduccon a las cincias de La computacin con Java, Universidad Nacional Autnoma de Mxico, 1 Edicin, 2007 Detel, Harvey M. Y Deitel, Paul J., Cmo programar en C/C++ y Java, Pearson Educacin, Mxico, 2004, Cuarta Edicin. Caelum Ensino e Solues em Java CS -14 Algoritmos Estruturas de Dados em Java http://www.cin.ufpe.br/~jndm/edados/referencias/Algoritmos%20e%20Estruturas%20 de%20Dados%20em%20Java.pdf (acessado a 15/03/2012) Algoritmos e Tipos Abstractos de Informao, 2003 http://ltodi.est.ips.pt/atai/index_files/TADs%20em%20Java%20e%20Estruturas.pdf (acessado a 15/03/2012) MC 102 Aoritmos e Programao de Computadores - Listas Ligadas, 2007 http://www.lis.ic.unicamp.br/~mc102/files/mc102jk-a28-4pp.pdf (acessado a 21/03/2012) Estruturas de Dados Dinmicas e Genricos em Java Adaptado dos slides do livro: Java, an Introduction to Problem Solving and Programming, 4d Walter Savitch http://pwp.net.ipl.pt/cc.isel/cvaz/Textos/POO/EDDG.pdf (acessado a 21/03/2012) W. Celes e J. L. Rangel, Listas Encadeadas http://www.ic.unicamp.br/~ra069320/PED/MC102/1s2008/Apostilas/Cap10.pdf (acessado a 25/03/2012) Nelson Freire , Linguagem JAVA Contentores de Objetos http://www.dei.isep.ipp.pt/~nfreire/JAVA%20-%20Contentores.pdf (acessado a 25/03/2012) Prof. Daniel Lucrdio , Desenvolvimento de Software Orientado a Objetos http://www2.dc.ufscar.br/~daniel/files/dsoo/08.poo.parte2.pdf (acessado a 27/03/2012)