Vous êtes sur la page 1sur 15

Estrutura de Dados

1. 2. 2.1. 2.2. 3. 3.1. 3.2. 3.2.1. 3.2.2. 3.2.3. 3.2.4. 3.3. 3.3.1. 3.3.2. 3.3.3. 3.3.4. 3.4. 3.4.1. 3.4.2. 3.4.3. 3.4.4. 3.5. 3.5.1. 3.5.2. 3.5.3. 3.5.4. 4. 4.1. 4.2. 4.3. 5. 6. 6.1. 6.2. 6.3. 6.4. 7. 7.1. 7.2. 7.3. 7.4. 7.5. Consideraes Gerais Tipo Apontador (Ponteiro) Caractersticas Gerais Ponteiros no Pascal Listas Encadeadas Conceito Listas Simplesmente Encadeadas Definio Aplicao Operaes Bsicas (Incluso, Pesquisa, Alterao e Excluso) Exerccios Listas Duplamente Encadeadas Definio Aplicao Operaes Bsicas (Incluso, Pesquisa, Alterao e Excluso) Exerccios Filas Definio Aplicao Operaes Bsicas (Incluso e Excluso) Exerccios Pilhas Definio Aplicao Operaes Bsicas (Incluso e Excluso) Exerccios Deck Definio Aplicao Operaes Bsicas (Incluso e Excluso) Exerccios Hash Definio Aplicao Operaes Bsicas (Incluso, Pesquisa, Alterao e Excluso) Exerccios vores Definio rvores Binrias Aplicao Operaes Bsicas (Incluso, Pesquisa, Alterao, Excluso, transformao e Caminhamentos) Exerccios

8. 8.1. 8.2. 8.3. 8.3.1. 8.3.2. 8.3.3. 8.3.4. 8.3.5.

Classificao de Dados Definio Ambiente de Classificao Mtodos de Classificao Por Insero Por Troca Por Seleo Por Intercalao Por Distribuio

1. Consideraes Gerais A automatizao de tarefas um aspecto marcante da sociedade moderna e na cincia da computao houve um processo de desenvolvimento simultneo e interativo de mquinas (hardware) e dos elementos que gerenciam a execuo automtica (software) de uma tarefa. Nesta grande evoluo do mundo computacional, um fator de relevante importncia a forma de armazenar as informaes, j que, informtica a cincia da informao. Ento de nada adiantaria o grande desenvolvimento do hardware e do software, se a forma de armazenamento e tratamento da informao no acompanhasse esse desenvolvimento. Por isso a importncia das estruturas de dados, que nada mais so, que formas otimizadas de armazenamento e tratamento das informaes eletronicamente. As estruturas de dados, na sua maioria dos casos, foram espelhadas em formas naturais de armazenamento do nosso dia a dia, ou seja, nada mais so que a transformao de uma forma de armazenamento j conhecida e utilizada no nosso munda para o mundo computacional. Por isso, cada tipo de estrutura de dados possue vantagens e desvantagens e cada uma delas tem sua rea de atuao (massa de dados) tima. Este curso foi elaborado com o objetivo de introduzir o aluno, que j possua um conhecimento da linguagen Pascal, no mundo das estruturas de dados, bem como mostrar a teoria (conceitos) e a prtica (implementao) das estruturas de dados mais utilizadas no dia a dia do profissional de informtica. O aluno at aqui, somente teve contato com estruturas de dados estticas (vetores e matrizes), e deve estar familizarizado com suas facilidades e dificuldades de uso. Agora novas estruturas de dados sero apresendas, sendo que, todas elas sero estruturas de dados dinmicas, ou seja, crescem e diminuem de acordo com a necessidade, veremos que, para isso, sero necessrias vrias rotinas que controlam esta dinamicidade das estruturas. 2. Tipo Apontador (Ponteiro) Um das caractersticas mais marcantes do pascal permitir a criao e destruio de variveis durante a execuo do programa. O uso dessas variveis possibilita a implementao das estruturas de dados dinmicas. Essas variveis criadas e destrudas durante a execuo do programa so chamadas variveis dinmicas. Uma varivel dinmica no declarada na parte de declarao de variveis porque esta ainda no existe antes do seu tempo de execuo, ela no possui sequer um nome, ficando a cargo dos ponteiros desempenhar esta funo de nome. Uma varivel dinmica sempre referenciada indiretamente por um apontador, ou seja, para cada varivel dinmica criada deve existir um apontador, que literalmente aponta para ela, permitindo a sua manipulao. 2.1. Caractersticas Gerais Os apontadores so declarados como as demais variveis, seguindo a sintaxe da linguagem de programao utilizada. Eles so variveis que armazenam o endereo de memrias de outras variveis, funcionanddo assim, como meio de refrenciar uma varivel dinmica, permitindo o acesso a essa varivel. Outra caracterstica dos apontadores que na sua declarao deve ser indicada qual o tipo de varivel este ir armazenar o endereo. A principal funo dos ponteiros permitir a criao e a manipulao das variveis dinmicas, as quais iro compr as estruturas de dados dinmicas.

2.2.

Ponteiros no Pascal

Declarao : a sintaxe de declarao de um tipo ponteiro o seguinte. type identificador = ^tipo; {onde o smbolo ^ indica que o identificador um ponteiro} ,isso indica que teremos um ponteiro com o nome de identificacor com a capacidade de armazenar o endereo de memria de uma varivel desse tipo. Como os ponteiros so utilizados para implementar as estruturas de dados dinmicas, o mais comum que seja criado um tipo do ponteiro desejado (type) e depois declaramos (var) as variveis ponteiros deste tipo. Exemplo : type Nome : string[35]; PontNome : ^Nome; var nome1,nome2,nome3 : PontNome; Inicializao : como os ponteiros armazenam endereos de memria, assim que eles so declarados o seu contedo um valor desconhecido (como as demais variveis), ou seja, no podemos prever para qual rea de memria este esta apontando, por isso, a linguagem pascal permite que um ponteiro seja inicializado, da seguinte forma : identificador := nil; {nil um valor constantee pode ser armazenado em uma varivel do tipo apontador para indicar que a varivel no contm endereo de memria de nenhuma varivel dinmica } Criao de uma varivel dinmica : para criao de uma varivel dinmica necessrio que exista uma varivel do tipo apontador para o tipo da varivel que se desaja criar, e ento utiliz-se o procedimento new, cuja sintaxe a seguinte : new(identificador); {onde, identificador deve ser uma varivel do tipo ponteiro para o tipo de varivel a ser criada} Obs: quando uma varivel dinmica criada atravs do procedimento NEW, um espao de memria do tamanho da varivel criada alocado na memria heap e este espao ficar alocado at ser liberado. Destruio de uma varivel dinmica : para que o espao de memria heap seja liberado necessrio que a varivel dinmica seja destruida, isso pode ser feito atravs do procedimento dispose, utilizando a seguinte sintaxe; dispose(identificador); Referencia a uma varivel dinmica : quando uma varivel dinmica criada atravs de uma ponteiro, este pode ser utilizado para referenci-la, permitindo a manipulao (leitura, atribuio, escrita, etc) desta varivel como outra varivel qualquer, para isso devemos utilizar o smbolo ^ aps o nome da varivel do tipo ponteiro: identificador^

Marcao e liberao de uma rea no heap - mark(ponteiro) e release(ponteiro)

Ex: program ManipulacaoVariaveisDinamicas; type nome = string[30]; ponteiro = ^nome; var p1, p2 : ponteiro; begin new(p1); new(p2); readln(p1^); p2^ := 'Jos Maria'; p1^:= p1^ + ' ' + p2^; writeln(p1^); end. 1. Listas Encadeadas 1.1. Conceito Esta classe de estruturas de dados foi inspirada numa forma de armazenamento bastante comum na nossa vida cotidiana, pois, desde eras bastantes remotas, o homem utiliza-se da idia de listar coisas com o objetivo de melhor organiz-las. Baseado nesse conceito bastante simples (listagem) a estrutura de dados lista foi concebida, onde, cada elemento da lista armazena uma informao til e uma, ou mais, referencia(s) para outro elemento (limitao do mundo computacional) e assim por diante, desta forma, com o auxlio dos ponteiros, pode-se acrescentar ou retirar elementos conforme a necessidade. Listas encadeadas geralmente so utilizadas para criar vetores de extenso de memria desconhecida, pela sua caracterstica dinmica, permitindo que o vetor (lista) tenha sempre o tamanho necessrio. 1.2. Listas Simplesmente Encadeadas 1.2.1. Definio Este tipo de lista o mais simples e segue as seguintes regras: a. deve exstir um ponteiro que aponte para o primeiro elemento da lista (incio da lista); b. cada elemento, ou n, da lista aponta para o prximo sucessivamente (da o nome listas encadeadas) c. o ltimo elemento deve apontar para NIL, indicando o final da lista. Agora podemos definir a estrtura bsica de um n da lista

Representao grfica :

Info Declarao :

prox

= ^no; = record campos do registro; end; no = record info : InfoType; prox : apontador; end; ,onde, n um registro com dois campos : info e prox, info um tipo registro do tipo infotype contendo as informaes (variveis) teis e prox um ponteiro capaz de armazenar o endereo de memria de um registro do tipo n (elemento da lista). Graficamente a representao de uma lista simplesmente encadeada seria a seguinte :
INICIO N N

type apontador InfoType

Info

prox

Info

prox

,onde, INICIO um ponteiro que guarda o endereo de memria do primeiro elemento da lista. 1.2.2. Aplicao As listas simplesmente encadeadas so utilizadas quando h necessidade de criar vetores com tamanho varivel (dinmico), sua limitao, somente permitir, o caminhamento unideirecional na lista, pois, como as referncias iniciam no primeiro elemento da lista e seguem unidirecionalmente at o ltimo elemento, no possvel regressar no caminhamento atravs da lista. Mesmo com esta limitao, as listas simplesmente encadadas so largamente utilizadas, pela sua simplicidade de implementao fornecendo um bom ndice entre custo/benefcio, na gerencia, em memria, de conjuntos de dados no muito extensos.

1.2.3. Operaes Bsicas (Incluso, Pesquisa, Alterao e Excluso) Como toda estrutura de aramazenamento de dados, as listas simplesmente encadeadas deve suportar as operaes de cadastro das informaes. Uma particularidade das listas o fato de apresentarem uma pequena vario no cdigo de incluso e excluso, de acordo com o local onde o novo elemento dever ser inserido (no incio, no meio ou no fim), e ainda assim, est variao pode ocorrer de acordo com os mecanismo de controle utilizados na gerncia da lista, tais como, utilizao de um nico ponteiro apontando para o nicio da lista, ou dois ponteiros, um para o incio e outro para o final. As operaes de cadastro sobre listas devem tomar o cuidado especial de anlisar se o valor do ponteiro para o incio diferente de NIL, pois, se for igual a lista est vazia e certamente as rotinas devero efetuar procedimentos especiais. INCLUSO - Levando em considerao o uso de um nico ponteiro para o incio procedure InsereLista (var inicio : ponteiro ; info : InfoType); No incio No fim No meio INCLUSO - Levando em considerao o uso de dois ponteiros (incio e fim). procedure InsereLista (var inicio, fim : ponteiro; info : InfoType); No incio No fim No meio (ordenada) PESQUISA - normalmente, usa-se uma funo que, se encontrar, retornar o endereo do n, caso contrrio, retornar o valor NIL. function PesquisaLista (inicio : ponteiro ; info : InfoType) : ponteiro; ALTERAO - utilizando a funco de pesquisa, obtem-se o endereo do n a ser alterado e de posse deste endereo, altera-se os dados deste n. procedure AlteraLista (inicio : ponteiro ; info : InfoType); EXCLUSO - usa-se um procedimento recebendo o incio da lista e os dados do n ser excludo, ento, atravs do campo identificado (chave) efetua-se uma pesquisa e localiza-se o n anterior ao n a ser excludo, e ento devemos liberar o espao alocado para o n excludo e fazer o seu anterio apontar para o posterior. procedure ExcluiLista (inicio : ponteiro ; info : InfoType); No incio No meio No fim

1.2.4. Exerccios - Faa uma agenda eletrnica que utilize os seguintes campos : cdigo, nome, endereo, telefone e uma observao, que permita todas as operaes de cadastro (incluso, consulta, alterao e excluso). Esta agenda dever utilizar listas simplesmente encadeadas, onde, as informaes, devero ser carregadas e salvas em arquivos, da seguinte maneira, quando o programa agenda for carregdo, este dever carregar o arquivo em disco para uma lista em memria, e quando o programa for encerrado, a lista dever ser descarregada no arquivo em disco. 1.3. Listas Duplamente Encadeadas 1.3.1. Definio uma lista encadeada, onde cada elemento contm um ponteiro para o n anterior e um ponteiro para o n posterior, permitindo o caminhamento nos dois sentidos da lista, diferentemente, da lista simplesmente encadeada, que s permitia em um nico sentido. 1.3.2. Aplicao Aplicao das listas duplamente encadeadas semelhante as listas simplesmente encadeadas, mas aquela mais apropriada, quando h a necessidade de caminhamento em ambos os sentidos, isso faz com que, novas sub-rotinas sejam utilizadas nas listas duplamente encadeadas, tais como : Anterior, Posterior. 1.3.3. Operaes Bsicas (Incluso, Pesquisa, Alterao,Excluso, Anterior e Posterior) Anterior - dever retornar o endereo do n anterior ou NIL, caso no exista anterior. function Anterior (EnderecoNo : ponteiro) : ponteiro; Posterior - dever retornar o endereo do n posterior ou NIL, caso no exista posterior. function Posterior (EnderecoNo : ponteiro ) : ponteiro; 1.3.4. Exerccios - Utilizando a agenda criada anteriormente, acrescente a possibilidade de navegao (para frente e para traz) na rotina de pesquisa. 1.4. Filas 1.4.1. Definio Uma fila uma lista linear de informao que acessada na seguinte ordem, o primeiro que entra, primeiro que sai (FIFO). Uma fila no permite acesso a um elemento que no seja o primeiro. 1.4.2. Aplicao Normalmente as filas so utilizadas na administrao de recursos compartilhados, impondo uma prioridade por ordem de chegada. Um bom exemplo so as filas de impresso, onde, cada documento espera sua vez para ser impresso. 1.4.3. Operaes Bsicas (Incluso e Excluso) Existem, basicamente, duas operaes bsicas a serem implementadas na filas : adicionar e remover. comum a utilizao de um ponteiro para o incio e outro para o fim da fim, facilitando assim as operaes. Adicionar - procedure adiciona (var inicio : ponteiro ; info : InfoType); Remover - function remove (var inicio : ponteiro) : InfoType; 1.4.4. Exerccios

1.5. Pilhas 1.5.1. Definio Anlogo estrutura fila, a estrutura pilha tambm pr-define a posio de insero e remoo dos elementos, sendo que, a estratgia ltimo que entra, primeiro que sai (LIFO) 1.5.2. Aplicao Um bom exemplo da aplio das pilhas a gerencia das chamadas as sub-rotinas utilizadas pela maioria dos compiladores das linguagens de programao. 1.5.3. Operaes Bsicas (Incluso e Excluso) Por razes histricas, as duas operaes primrias de pilha - insero e retirada - so normalmente chamadas de push e pop, respectivamente. Assim para implementar uma pilha so necessrias duas funes : PUSH - coloca um elemento no topo da pilha procedure push (var inicio : ponteiro; info : InfoType); POP - retira um elemento do topo da pila function pop (var inicio : ponteiro) : InfoType; 1.5.4. Exerccios

2. Deck 2.1. Definio Esta estrutura de dados uma unio das pilhas e filas, ou seja, s permitido, manipular os elementos das extremidades. 2.2. Aplicao 2.3. Operaes Bsicas (Incluso e Excluso) Pode-se inserir e retirar no incio e no fim. 3. Exerccios 4. Hash 4.1. Definio A estrutura de dados HASH largamente utilizada para organizao dos arquivos em discos nos banco de dados, veremos aqui, uma particularidade do HASH utilizada em memria para melhorar o tempo de busca de elementos armazenados em listas encadeadas. A idia bsica criar uma srie de sub-listas no lugar de uma nica lista maior. A partir da aplicao de uma determinada funo (chamada funo de hashing) sobre aa chave de busca do elemento, decide-se em qual das sub-listas o elemento deve ser ou estar armazenado. Procede-se, ento, uma busca na sub-lista determinada. Portanto, ao invs de realizar a busca em toda a lista, faz-se uma busca num subconjunto da lista. Assim, consegue-se uma busca eficiente, embora os elementos no fiquem dispostos ordenadamente, o hash pemite uma melhora na eficincia da localizao idividual dos elemento em relao as listas. A questo principal escolher uma funo de hashing adequada para garantir uma distribuio uniforme dos elementos nas sub-listas, pois existe uma variedade enorme nas funes de hashing. Os ponteiros iniciais de cada sub-lista so dispostos num vetor. O nmero de sub-listas, isto , a dimenso deste vetor, define o tamanho da chamada tabela de hash. A forma mais comum da funo hashing a aplicao, no campo chave de ordenao, da funo mdulo pelo tamanho da hash table e o resultado desta operao indica qual a sub-lista do elemento. Caso o campo chave de ordenao no seja numerico, pode-se utilizar artifcios para transform-lo em um campo numeriro e, ento, aplicar a funo hashing.

4.2. Aplicao Como vimos, o hash utilizado para buscar uma melhor eficincia na busca de elementos. Este tipo de hash em memria muito utilizado nas implementaes das tabelas de smbolos dos compiladores das linguagens de programao. 4.3. Operaes Bsicas (Criao, Incluso, Pesquisa, Alterao e Excluso) 4.4. Exerccios

5. vores 5.1. Definio vores so estruturas de dados essencialmente dinmicas, permitindo a insero, pesquisa e destruio de elementos. rvores trazem, implicitamente, a idia de hierarquia, por isso so estruturas de dados muito utilizadas em gerenciamento de arquivos e validao de expresses. Uma rvore pode ser definida de vrias formas. Talvez, a maneira mais natural defin-las recursivamente. Assim, uma rvore composta por um conjunto de ns. Existe um n denominado raiz, que contm zero ou mais sub-rvores e cada sub-rvore pode ser considerada uma rvore. DESENHO RVORE GENRICA (liastas de filhos): Estrutura do n (com grau pr-definido e com grau inderterminado) Nomenclatura : Raiz - o n de mais alto nvel da rvore (primeiro n da rvore). Nvel - o nmero de ns que vai da raiz at um determinado n. Grau - o nmero de sub-rvores de um n Folha - n com grau igual a zero Altura - nvel mais alto da rvore Pai - a raiz de uma sub-rvore pai das raizes de suas sub-rvores Filho - os ns raizes de uma sub-arvores filho da raiz da rvore Irmo - ns razes das sub-rvores so irmos 5.2. rvores Binrias So rvores onde cada n tem no mximo dois filhos (grau mximo 2). Com isto, obtm-se uma estrutura apropriada para busca binria. Outra rea onde estas estruturas so muito utilizdas na validao de expresses. Isto porque um operador relaciona apenas um ou dois operandos. Uma propriedade importante de rvores binrias que possuem profundidade (altura) bastante inferior ao nnero de ns. ( comentar insero em ordem) 5.3. Aplicao A aplicao mais importante das rvores binrias seu uso em busca binria. A cada n da rvore associa-se uma chave que permite a realizao de uma ordenao. A Construo da rvore deve ser de tal forma que na sub-rvore esquerda de uma dada daiz s existam ns com chaves menores que a chave da raiz. E a sub-rvore direita s pode conter ns com chaves maiores que a da raiz. Com esta estruturao, a busca de um determinado n na rvore torna-se trivial, atravs do uso da recursidade. 5.4. Operaes Bsicas (Incluso, Pesquisa, Alterao, Excluso, transformao e Caminhamentos) Definio do n type ponteiro = ^no; no = record dado : byte; dir, esq : ponteiro; end;

Incluso function Pesquise( var raiz : ponteiro; dadoaux : byte) : ponteiro; begin if raiz = nil then Pesquise := nil else begin if raiz^.dado = dadoaux then Pesquise := raiz else begin if raiz^.dado < dadoaux then pesquise := pesquise(raiz^.dir,dadoaux) else pesquise:= pesquise(raiz^.esq,dadoaux) end; end; end; procedure InsereArvore( var raiz : ponteiro; dadoaux : byte); begin if raiz = nil then begin new(raiz); raiz^.dado:= dadoaux; raiz^.esq := nil; raiz^.dir := nil; end else begin if dadoaux < raiz^.dado then InsereArvore(raiz^.esq,dadoaux); if dadoaux > raiz^.dado then InsereArvore(raiz^.dir,dadoaux) end; end;

Alterao - efetua-se uma pesquisa e em seguida faz-se a alterao Excluso - Para a remoo de um n de uma rvore deve-se levar em considerao que seus filhos devem continuar na rvore e esta dever continuar ordenada (menor a esquerda maior a direita). E ento camos em trs possibilidades que devem ser tratadas separadamentes, afim de manter o estrutura da rvore binria. Sendo elas : 1. Quando o n a ser excludo no contenha filhos 2. Quando o n a ser excludo contenha somente um dos filhos 3. Quando o n a ser excludo contenha os dois filhos procedure Substitui( raiz : ponteiro; var sucessor : ponteiro); var ptr : ponteiro; begin if sucessor^.esq = nil then begin raiz^.dado := sucessor^.dado; ptr := sucessor; sucessor := sucessor^.dir; dispose(ptr); end else Substitui(raiz,sucessor^.esq); end;

procedure RemoveRaiz(var raiz : ponteiro; dadoaux : byte); var ptr : ponteiro; begin if raiz <> nil then begin if raiz^.dado = dadoaux then begin if raiz^.esq = nil then begin ptr := raiz; raiz := raiz^.dir; dispose(ptr); end else begin if raiz^.dir = nil then begin ptr := raiz; raiz := raiz^.esq; dispose(ptr); end else Substitui(raiz,raiz^.dir); end; end else if raiz^.dado < dadoaux then RemoveRaiz(raiz^.dir,dado) else RemoveRaiz(raiz^.esq,dado); end; end;

1. 1.1. 1.2. 1.3. 1.3.1. 1.3.2. 1.3.3. 1.3.4. 1.3.5.

Classificao de Dados Definio Ambiente de Classificao Mtodos de Classificao Por Insero Por Troca Por Seleo Por Intercalao Por Distribuio