Você está na página 1de 20

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof.

Raquel Marcia Mller

Listas Lineares
Dentre as estruturas de dados no primitivas, as listas lineares so as de manipulao mais simples. Uma lista linear agrupa informaes referentes a um conjunto de elementos que, de alguma forma, se relacionam entre si. Ela pode se constituir, por exemplo, de informaes sobre os funcionrios de uma empresa, sobre notas de compras, itens de estoque, notas de alunos, etc. Uma lista linear, ou tabela, ento um conjunto de n 0 ns L[1], L[2], ..., L[n] tais que suas propriedades estruturais decorrem, unicamente, da posio relativa dos ns dentro da seqncia linear. Tem-se: se n > 0, L[1] o primeiro n; para 1 < K n, o n L[k] precedido por L[k-1]; Operaes Mais Freqentes Em Listas: busca; incluso; remoo; So operaes bsicas, que precisam de algoritmos eficientes. Outras Operaes: alterao; combinao de duas listas; ordenao; determinao do primeiro e do ltimo n da lista.

Casos Particulares de Lista: deque (insero e remoo s nas extremidades da lista); pilha (insero e remoo s em um extremo); pilha( insero em um extremo e remoes no outro).

Tipo de armazenamento de uma lista: alocao seqencial; alocao encadeada.

Alocao Seqencial Maneira mais simples de se manter uma lista na memria. Como a implementao de alocao seqencial em linguagens de alto nvel geralmente realizada com reserva de memria alocao esttica. Obs.: Insero e Remoo de ns no ocorrem de fato: simulao. Ideal para filas e pilhas. Seja uma lista linear. Cada n formado por campos, que armazenam as caractersticas distintas dos elementos da lista. Alm disso, cada n da lista possui, geralmente, um identificador, denominado chave. Para evitar ambigidades, supe-se

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

que todas as chaves so distintas. A chave, quando presente, se constitui em um dos campos do n. Os ns podem se encontrar ordenados, ou no, segundo os valores de suas chaves lista ordenada ou no-ordenada. Ex. 1: Considere uma lista L de n elementos. N 1 N 2 N 3 N 4 N 5

Chave

Nome

Endereo

REGISTRO

Ex.1.1: Algoritmo que realiza a busca de um elemento na lista L. Funo busca (x); {x o elemento procurado} inicio i 1; busca 0; enquanto i n faa se L[i].chave = x ento {chave encontrada} busca i; i n +1; seno i i + 1; {pesquisa prossegue} fim se fim enquanto fim; Ex.1.1a: Outra maneira de escrever o algoritmo: Funo busca (x); {x o elemento procurado} inicio L[n+1].chave x; enquanto L[i].chave x faa i i + 1; fim enquanto se i n + 1 ento busca i; seno busca 0; fim se fim;

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

Ex.2: Algoritmo para busca na lista ordenada: Funo busca_ord (x); {x o elemento procurado} inicio L[n+1].chave x; enquanto L[i].chave x faa i i + 1; fim enquanto se i n + 1 ou L[i].chave x ento busca_ord 0; seno busca_ord i; fim se fim; Ex.3: Um mtodo bem mais eficiente: Busca Binria. Funo busca_binaria (x); {x o elemento procurado} inicio inf 1; sup n; busca_binaria 0; enquanto inf sup faa meio L[inf + sup)/2]; {ndice a ser buscado} se L[meio].chave = x ento busca_binaria meio; {elemento encontrado} inf sup + 1; seno se L[meio].chave < x ento inf meio + 1; seno sup meio -1; fim se fim se fim enquanto fim; Para realizar as operaes de insero e remoo utilizamos o procedimento de busca. No caso da insero, o objetivo evitar chaves repetidas e, no caso da remoo, a necessidade de localizar o elemento a ser removido.

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

Ex:4: O algoritmo abaixo efetua a insero de um n na lista. Algoritmo {insero de um n na lista L} se n < m ento se busca(x) = 0 ento L[n+1] novo_valor; n n + 1; seno escreva (elemento j existe na tabela); fim se seno escreva (overflow); fim se Fim algoritmo Ex 5: O algoritmo abaixo efetua a remoo de um n da lista. Algoritmo {remoo de um n na lista L} se n 0 ento ndice busca(x); se ndice = 0 ento valor_recuperado L[ndice]; para i de 1 at n 1 faa L[i] L[i+1]; fim para n n 1; seno escreva (elemento no se encontra na tabela); fim se seno escreva (underflow); fim se fim algoritmo Ambos os algoritmos consideram tabelas no ordenadas. A memria pressuposta disponvel tem m posies (na realidade m+1, porque necessria uma posio extra para a busca). Overflow: no h mais espao para insero; Undrflow: remoo em lista vazia. Obs.: Ambos os casos fazer tratamento No caso de tabelas ordenadas, o algoritmo de remoo no se modifica. O algoritmo de insero, entretanto, precisa ser refeito, uma vez que, nesse caso, a posio do n torna-se relevante.

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

Armazenamento seqencial ideal quando inseres e remoes no acarretam movimentao de ns, o que ocorre se os elementos a serem inseridos e removidos esto em posies seqenciais, como a primeira ou a ltima posio. Pilhas e filas satisfazem tais condies. Pilhas Utiliza-se indicadores especiais, denominados ponteiros, para o acesso a posio selecionadas. No caso da pilha, usa-se apenas um ponteiro, o ponteiro topo, pois as inseres e remoes so executadas na mesma extremidade da lista. Ex1.: Pilha Situao 1: inicial: pilha vazia 1 2 3 ... m
topo

Pilhas e Filas

Situao 2: inserir informao A 1 A


topo

3 ...

Situao 3: inserir informao B 1 A 2 B


topo

3 ...

Situao 4: retirar informao B 1 A


topo

3 ...

Situao 5: inserir informao C 1 A 2 C


topo

3 ...

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

Situao 6: retirar informao C 1 A


topo

3 ...

Situao 7: retirar informao A 1


topo

3 ...

pilha vazia Ex.1a: Algoritmo de insero na pilha P Algoritmo se topo M ento topo topo + 1; P [topo] novo_valor; seno escreva(overflow); fim se Fim Algoritmo Ex. 1b: Algoritmo de remoo da pilha P Algoritmo se topo 0 ento valor_recuperado P [topo]; topo topo - 1; seno escreva(underflow); fim se Fim Algoritmo Filas Filas exigem uma implementao mais elaborada. So necessrios dois ponteiros: incio da fila (I) e retaguarda (R). Isso porque na fila as inseres so feitas sempre no final da fila e as remoes sempre no incio da fila. Para a insero de um elemento, move-se o ponteiro R; para a retirada, move-se o ponteiro I. A fila vazia representada por I = R = 0.

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

Ex2.: Fila Situao 1: inicial: fila vazia 1 2 3 ... m


I R

Situao 2: inserir informao A 1 A


I R

3 ...

Situao 3: inserir informao B 1 A


I

2 B
R

3 ...

Situao 4: retirar informao A 1 2 B


I R

3 ...

Situao 5: inserir informao C 1 2 B


I

3 ... C
R

Situao 6: retirar informao B 1 2 3 ... C


I R

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

Situao 7: retirar informao C 1


topo

3 ...

fila vazia Ex: 2a: Algoritmo de insero da fila F Algoritmo inicio prov r mod M+1; se prov I ento r prov; F[r] novo_valor; se I = 0 ento I 1; fim se seno escreva (overflow); fim se Fim Algoritmo Ex: 2b: Algoritmo de remoo da fila F Algoritmo inicio se I 0 ento valor_recuperado F[I]; se I = R ento I R 0; seno I I mod n + 1; fim se seno escreva (underflow); fim se Fim Algoritmo medida que os ponteiros so incrementados na memria disponvel, a fila se move, o que pode dar origem falsa impresso de memria esgotada. Para eliminar esse problema, consideram-se os m ns alocados como se estivessem em crculo, onde F[1] segue F[m]. Notao Polonesa: Aplicao Para Pilhas Uma representao para expresses aritmticas que seja conveniente do ponto de vista computacional, aumento de interesse, por exemplo, na rea de compiladores. A

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

notao tradicional ambgua e, portanto, obriga ao pre-estabelecimento de regras de prioridade, o que torna a tarefa computacional mais complexa, Considerando apenas operaes binrias, temos outros tipos de representao: notao completamente parentizada: acrescenta-se sempre um para de parnteses a cada par de operandos e a seu operador. EX: notao tradicional: A * B C / D notao parentizada: ((A * B) (C/D)) notao polonesa: os operandos aparecem imediatamente antes dos operandos. Essa notao explicita quais operandos, e em que ordem, devem ser calculados. Por esse motivo, dispensa o uso de parnteses, sem ambigidades. EX: notao tradicional: A * B C / D notao polonesa: -* A B / C D notao polonesa reversa: notao polonesa com os operadores aparecendo aps os operandos. (usada em mquinas de calcular). EX: notao tradicional: A * B C / D notao polonesa: A B * C D / Tanto a expresso original quanto a expresso resultante devem ser armazenadas em listas. Antes de colocar o algoritmo, exemplificar. Expresso parentizada: ((3*4) (10/2))

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

10

Algoritmo Para Converso da Notao Parentizada na Notao Polonesa Reversa: os operandos aparecem na mesma ordem na notao tradicional e na notao polonesa reversa. Na notao polonesa reversa na notao polonesa reversa os operandos aparecem na ordem em que devem ser calculados (da esquerda para a direita); o operandos aparecem imediatamente depois de seus operandos. A principal preocupao do algoritmo deve ser a ordem e a posio dos operadores. Na notao parentizada, essa ordem indicada pelos parnteses; os mais internos significam operaes prioritrias. Ex: 1: Algoritmo que realiza a converso da notao parentizada para a polonesa reversa Algoritmo index 1; {ndice da expresso parentizada} indpol 0; {ndice da expresso polonesa} topo 0; {ponteiro da pilha} enquanto indexp fim ento se exp[indexp] operando ento {passa para a nova lista} indpol indpol +1; pol[indpol] exp[indexp]; seno se exp[indexp] operador ento {coloca na pilha} topo topo + 1; pilha[topo] exp[indexp]; seno se exp[indexp] = ) ento se topo 0 ento {forma a operao} operador pilha[topo]; topo topo - 1; indpol indpol + 1; pol[indpol] operador; seno "Expresso errada!"; fim se fim se fim se fim se indexp indexp + 1; fim enquanto Fim Algoritmo Uma anlise sinttica prvia na expresso pressuposta (verificar se a expresso vlida!). Para efetuar a converso, devem-se remover os parnteses e estabelecer a ordem conveniente de operadores. Estes devem ser armazenados at que um ")" seja encontrado, o que indica que a operao mais interna, e por conseguinte a primeira a ser executada, foi detectada. O ltimo operador armazenado corresponde a essa operao. Portanto, a estrutura utilizada no armazenamento dos operadores deve

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

11

ser uma pilha. A expresso a ser convertida se encontra no vetor exp e o resultado da converso, no vetor pol. A varivel fim indica a dimenso da expresso. Exerccios 1. Utilizando o algoritmo visto em sala, converta as expresses abaixo para a notao polonesa reversa: a) (((5 * 2) / 5) - (9 / 5)) b) (7 - ((4 * (3 - 2)) * 2 )) c) (4 * (((3 - 8) / 4) - 5)) 2. Proponha um algoritmo para achar o resultado das expresses na notao polonesa reversa. 3. Use o algoritmo desenvolvido no tem anterior e calcule o resultado das expresses do exerccio 1. 4. Proponha mudanas no algoritmo que converte expresses parentizadas para notao polonesa reversa, para tratar o operador unrio - e nmeros com mais de um dgito. Soluo do exerccio 2: indpol 1; topo 0; enquanto indpol fim faa se pol[indpol] operando ento Push(pol[indpol]); {insere na pilha} seno se pol[indpol] operador ento oper1 pop(); {retira dois operandos do topo da pilha} oper2 pop(); result calcula_oper(oper2, oper1, pol[indpol]); push( result ); {empilha resultado parcial} fim se fim se fim enquanto

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

12

Listas Lineares em Alocao Encadeada


Operaes em listas implementadas com alocao seqencial so muito fracas; Na utilizao de mais de duas listas, a gerncia de memria mais complexa usar alocao dinmica (ou alocao encadeada). Na alocao encadeada, as posies de memria so alocadas (ou desalocadas) na medida em que so necessrias (ou dispensadas). Os ns de uma lista encontram-se aleatoriamente dispostos na memria e so interligados por ponteiros, que indicam a posio do prximo elemento da tabela. Cada n ter, agora, um campo adicional, que conter o endereo do prximo n da lista.
1 2 3 4 ... n

Lista seqencial: Lista encadeada:


n 1 n 2 n 3 n 4

Vantagens e desvantagens dos tipos de alocao: - A alocao encadeada mais conveniente quando o problema inclui o tratamento de mais de uma lista; - O acesso ao k-simo elemento da lista imediato na alocao seqencial, enquanto na alocao encadeada obriga ao percurso na lista at o elemento desejado. Como em uma lista encadeada os ns no esto, obrigatoriamente, em posies contguas da memria, ao se realizar uma insero ou remoo, h a necessidade de encontrar novas posies de memria para armazenamento e liberar outras que possam ser reutilizadas posteriormente. preciso, portanto, gerenciar a memria disponvel. As linguagens geralmente possuem um mdulo de gerncia de memria disponvel ao usurio, bastando apenas que este se refira s rotinas internas de ocupao e devoluo de ns da lista de espao disponvel. Em Pascal, as rotinas new(pt) e dispose(pt) executam essa tarefa. Nos algoritmos, usamos uma notao especial: - a indicao do endereo de um n, feita por um ponteiro, ser representada pelo smbolo . Cada ponteiro utilizado associado a um nico tipo de n. Assim, ptinfo representa o campo info do n apontado por pt; ptprox representa o endereo do campo prox apontado por pt.
pt info prox n

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

13

Um conjunto de ns encadeados formam uma tabela. A associao do ponteiro pt ao tipo de n definida previamente na declarao das variveis. Exemplo: declare No registro (Info numrico, Prox ponteiro No); declare Pt ponteiro No;
pt infor n prox infor n prox

Listas simplesmente encadeadas


Qualquer estrutura, inclusive listas, que seja armazenada em alocao encadeada requer o uso de um ponteiro que indique o endereo de seu primeiro n. O percurso de uma lista feito, ento, a partir desse ponteiro. A idia consiste em seguir, consecutivamente, pelos endereos existentes no campo que indica o prximo n (semelhante ao ndice da alocao seqencial). Algoritmo que percorre uma lista para impresso do campo info: Obs.: ptlista o ponteiro para o primeiro n. Algoritmo Pont ptlista; {pont um ponteiro auxiliar} enquanto pont null faa {null indica o final da lista} escreva pont info; Pont pont prox; fim enquanto Fim algoritmo Fazer esquema para facilitar visualizao! Algoritmo de busca: consideraes - deve ser eficiente; - primeira insero e ltima remoo exigem testes especiais. Soluo: n-cabea, nunca removido, que ser indicado pelo ponteiro de incio da lista (esse n ter essa utilidade especfica, no contendo, portanto, informaes relacionadas tabela propriamente dita). Lista vazia:
ptlista n-cabea

ptlista

n 1

n 2

n 3

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

14

Algoritmo de busca: - ptlista: guarda o n cabea da lista - x: chave procurada Procedimento BuscaEnc( x, ant, pont ); incio Ant ptlista; Ptr ptlista prox; {ptr: ponteiro de percurso} Pont null; enquanto ptr null faa se ptr chave < x ento Ant ptr; {atualiza ant e ptr} Ptr ptr prox; seno se ptr chave = x ento Pont ptr; {chave encontrada} fim se Ptr null; fim se fim enquanto fim; o parmetro pont retorna apontando para o elemento procurado e, ant para o elemento anterior ao procurado; se o elemento no for encontrado, pont aponta para null e ant indica o elemento anterior ao ltimo procurado.

Insero e remoo Aps a realizao da busca, as operaes de insero e remoo em uma lista encadeada so triviais. Trs fases devem ser cumpridas: - alocao / desalocao de memria; - utilizao do n; - acerto da lista Exemplo: insero
ant

ptlista

n 1

n 2

n 3

pt

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

15

Algoritmo que realiza a insero de um novo n na lista: Algoritmo BuscaEnc( x, ant, pont ); se pont = null ento Alocar( pt ); {alocar n} pt info novo_valor; pt chave x; {utilizar n} pt prox ant prox; ant prox pt; {arrumar lista} seno Elemento j est na lista!; fim se Fim Algoritmo; - insero do n contido na varivel novo, aps o n apontado por ant; - mantm a lista ordenada. Desenhar esquema. Algoritmo que realiza a remoo de um n da lista: Algoritmo BuscaEnc( x, ant, pont ); se pont null ento ant prox pont prox; {arrumar lista} valor_recuperado pont info; {utilizar n} Desocupar( pont ); {desalocar memria} seno Elemento no se encontra na lista!; fim se Fim Algoritmo; Exerccios 1. Usando os procedimentos anteriores (insero, remoo e busca), escreva um algoritmo que leia um conjunto de N valores numricos, mantendo-os em uma lista ordenada. Depois verifique se aparece o valor 12 nesta lista, liberando o n com esse valor da memria e indicando qual era a sua posio na lista. 2. Apresente os procedimentos de insero, remoo e busca, para uma lista no ordenada. 3. Usando os procedimentos escritos no exerccio 2, escreva um algoritmo que leia uma string e uma palavra, armazenando-as em duas listas, e verifique se a palavre ocorre na string. Obs.: o algoritmo de insero deve aceitar elementos repetidos (ou usar o recurso da chave).

Listas Circulares
A busca em uma lista ordenada, vista anteriormente, pode ser considerada pouco eficiente quando comparada s outras buscas anteriormente mencionadas. Uma pequena modificao na estrutura fsica da lista pode ser de grande auxlio: obrigar o ltimo n da lista a apontar para o n-cabea, criando uma lista circular encadeada.

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

16

... ptlista n 1 n 2 n n

Desta forma, o teste de fim de lista nunca satisfeito. A preocupao passa a ser um critrio de parada que possa ser incorporado ao teste da busca propriamente dita. A soluo colocar a chave procurada no n-cabea, de forma que uma resposta positiva seja sempre encontrada. O algoritmo abaixo apresenta a nova busca, no caso de listas ordenadas. O ponteiro pont tem o valor de ptlista se o elemento no encontrado. Naturalmente, modificaes correspondentes devem ser introduzidas nos algoritmos de insero e remoo. Algoritmo: Procedimento Busca_Circ (X, Ant, Pont); {lista circular ordenada} Incio Ant Ptlista; Ptlista Chave X; Pont Ptlista Prox; enquanto Pont Chave < X faa Ant Pont; Pont Pont Prox; fim enquanto se Pont Ptlista ento escreva "Chave localizada"; seno escreva "Chave no localizada"; fim se Fim; Como ficam os algoritmos de Insero e Remoo? Os algoritmos de insero e remoo no mudam. O que muda que na alocao do n-cabea, o ponteiro prox deve apontar no mais para null, mas para o prprio n-cabea.
ptlista

{alocao do n-cabea} Alocar (Ptlista); Ptlista Prox Ptlista;

Como ficam os algoritmos para lista circular no ordenada?

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

17

Listas Duplamente Encadeadas


Nos algoritmos vistos at agora para listas lineares utilizando alocao encadeada, o ponteiro ant se mostrou sempre til. Sua funo "rastrear" o ponteiro que percorre a lista, permitindo sempre o retorno ao n anterior. Algumas vezes, entretanto, isto no suficiente, pois pode-se desejar o percurso da lista nos dois sentidos indiferentemente.

ptlista
n1 n2 nn

A lista duplamente encadeada incorpora um novo campo de ponteiro. Os campos de ponteiros tomam os nomes de ant e post (n anterior e n seguinte, respectivamente). Os algoritmos de busca, insero e remoo em tabelas ordenadas so muito simples. Na busca, a funo retorna indicando o n procurado ou, se este no foi encontrado, o n que seria seu consecutivo. Busca em uma lista duplamente encadeada ordenada: Funo Busca_Dup (X) : ponteiro; Incio Ultimo Ptlista Ant; se X Ultimo Chave ento Pont Ptlista Post; enquanto Pont Chave < X faa Pont Pont Prox; fim enquanto Busca_Dup Pont; seno Busca_Dup Ptlista; fim se Fim; Insero em lista duplamente encadeada ordenada:

n1

n2

nn

ptlista

pt

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

18

Algoritmo Pont Busca_Dup (X); se Pont = Ptlista ou Pont Chave X ento Anterior Pont Ant; Ocupar (Pt); Pt Info Novo_valor; Pt Chave X; Pt Ant Anterior; Pt Post Pont; Anterior Post Pt; Pont Ant Pt; seno escreva "Elemento j se encontra na lista"; fim se Fim Algoritmo Remoo em lista duplamente encadeada ordenada: Algoritmo Pont Busca_Dup (X); se Pont Ptlista e Pont Chave = X ento Anterior Pont Ant; Posterior Pont Post; Anterior Post Posterior; Posterior Ant Anterior; Valor_recuperado Pont Info; Desocupar (Pont); seno escreva "Elemento no se encontra na lista"; fim se Fim Algoritmo

ptlista
n1 n2 nn

pont

Aplicao: Ordenao Topolgica Uso pontencial todas as vezes em que o problema abordado envolve uma ordem parcial. Uma ordem parcial de um conjunto S uma relao entre os objetos de S, representada pelo smbolo , satisfazendo as seguintes propriedades para quaisquer objetos x, y e z, no necessariamente distintos em S: i) se x y e y z, ento x z (transitiva);

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

19

ii) iii)

se x y e y x, ento x = y (anti-simtrica); x x (reflexiva);

A notao x y pode ser lida "x precede ou iguala y". Se x y e x = y, escreve-se x < y e diz-se "x precede y". Tem-se ento: i') se x < y e y < z, ento x < z (transitiva); ii') se x < y, ento y x (assimtrica);

iii') x x (irreflexiva). A notao y x significa "y no precede x". Assume-se aqui que S um conjunto finito, uma vez que se deseja trabalhar no computador. Exemplo de aplicao: Execuo de um conjunto de tarefas necessrias, por exemplo, montagem de um automvel. Uma ordem parcial dessas tarefas pode ser representada assim:
1 5

Cada caixa na figura representa uma tarefa a ser executada; cada tarefa numerada arbitrariamente. Se existe a indicao de um caminho da caixa x para a caixa y, isto significa que a tarefa x deve ser executada antes da tarefa y. A ordenao topolgica trata de imergir a ordem parcial em uma ordem linear, isto , rearrumar os objetos numa seqncia a1, a2, ..., an, tal que sempre que aj < ak, temse j < k.

Universidade Estadual de Mato Grosso do Sul - Curso de Cincia da Computao Disciplina: Estruturas de Dados Prof. Raquel Marcia Mller

20

Como obter a ordenao topolgica: - inicialmente, considera-se um objeto que no precedido por nenhum outro na ordem parcial. Esse objeto o primeiro na sada, isto , na ordem final; - removemos o objeto do conjunto S; - o conjunto resultante obedece novamente a uma ordem parcial. O processo , ento, repetido at que todo o conjunto esteja ordenado. Implementao: Os objetos a serem ordenados so numerados de 1 a n, em qualquer ordem, e alocados seqencialmente na memria. A entrada do algoritmo so os pares (j, k), significando que o objeto j precede o objeto k. O nmero de objetos n e o nmero de pares m tambm so fornecidos. Devem constar da entrada somente os pares necessrios caracterizao da ordem parcial; pares suprfluos no constituem erro. Ex.: o par (8,7) desnecessrio, pois pode ser deduzido dos pares (8,6) e (6,7).

0 1 2 3 4 5 6 7 8

0 0 2 2 1 0 2 1 1 CB

3 6 4 2 7 3 6 8 2 -

O algoritmo lida com n listas encadeadas, uma para cada objeto. Na lista i, esto indicados todos os objetos k que aparecem em pares (i, k), isto , sucessores de i. Para cada lista criado um n-cabea, chamado CB. No n-cabea da lista i, alm do ponteiro para os sucessores de i, est armazenado o nmero de pares (k, i) existentes, isto , o nmero de vezes em que i aparece como sucessor de outro objeto. Essa informao denominada contador. Uma vez organizadas as listas, os ns-cabea so percorridos em busca de um objeto que no seja sucessor de nenhum outro, isto , cujo campo contador seja nulo (zero). Todos aqueles que obedecem tal condio, so encadeados pelo prprio campo contador, que passa a ter nova funo. Em seguida, o objeto retirado da tabela original, isto , todos os contadores de seus sucessores so decrementados e imediatamente testados para que, ao chegarem a zero, sejam includos na seqncia de sada. O algoritmo termina quando todos os objetos forem retirados.