You are on page 1of 29

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

1. Recurso 1.1 Definio


Um objeto dito recursivo se ele consistir parcialmente ou for definido em termos de si prprio. Recurses ocorrem na matemtica, informtica, no dia a dia... Exemplos de recurso em definies matemticas: Nmeros naturais: 0 um nmero natural; O sucessor de um nmero natural um nmero natural; Funo Fatorial (n!) para inteiros positivos: 0! = 1 n>0: n! = n * (n - 1)!

1.2 Algoritmos Recursivos


Um algoritmo que para resolver um problema divide-o em subproblemas mais simples, cujas solues requerem a aplicao dele mesmo, chamado recursivo. Em programao, uma subrotina (procedimento ou funo) recursiva quando ela chama a si mesma. Suponha uma rotina recursiva R formada por um conjunto de comandos C (que no contm chamadas a R) e uma chamada (recursiva) R:

1.3 Tipos de Recurso


Recurso Direta
quando em uma subrotina existe uma chamada para a prpria subrotina, independentemente dos valores dos parmetros:

Prof. Cludio H. S. Grecco

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Recurso Indireta
As subrotinas so conectadas atravs de uma cadeia de chamadas sucessivas que acaba retornando primeira que a desencadeou:

1.4 Funcionamento da Recurso


A subrotina permite que seja dado um nome a um conjunto de comandos. Um desses comandos pode ser a chamada prpria subrotina. As subrotinas possuem objetos locais sem significado fora dela (variveis, parmetros, constantes, tipos e subrotinas). Toda vez que tal subrotina for executada recursivamente, um novo conjunto de variveis locais e parmetros so criados. Ainda que variveis e parmetros tenham o mesmo nome os identificadores se referem ao conjunto criado mais recentemente (seus valores so diferentes). Como ocorre nos comandos repetitivos, as chamadas recursivas possibilitam a no terminao (looping). Para tal, deve ser condicionado uma expresso lgica que, em algum instante, tornar-se- false e permitir que a recurso termine: R [C,TR], sendo T um teste lgico Tcnica bsica para garantir o trmino: definir uma funo f(x), sendo x um conjunto de variveis, tal que f(x) 0 implica em uma condio de terminao; garantir que f(x) descresce a cada passo da repetio. R [C, (f(x)>0)R(x-1)], onde x decresce a cada chamada Na prtica, ao definir rotinas recursivas, o problema dividido da seguinte forma: soluo trivial: dada por definio, isto , no necessita de recurso (resolvida pelo conjunto de comandos C); soluo geral: parte do problema que em essncia igual ao problema original, porm menor (resolvida pela chamada recursiva R).

Prof. Cludio H. S. Grecco

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Um teste define, a cada momento, se o problema ter soluo trivial ou geral. Em termos matemticos, a recurso uma tcnica que, atravs de substituies sucessivas, reduz o problema a um caso de soluo trivial

Exemplo de Recurso: fatorial Clculo da Fatorial (nmeros naturais positivos):


soluo trivial: 0! = 1 (condio de parada) soluo geral: n! = n*(n-1)! Algoritmo em Pascal para clculo da fatorial

FUNCTION fat(n: INTEGER):INTEGER; BEGIN IF n= 0 THEN fat:= 1 ELSE fat:= n * fat (n-1); END;

1.5 Profundidade da Recurso


Profundidade o nmero de vezes que uma rotina recursiva chama a si prpria, at obter o resultado. Muitas vezes a profundidade de uma recurso no to clara, at mesmo para definies simples.

Exemplo: profundidade da fatorial de 4:

Valores de n: da chamada 4, do 1o nvel 3, do 2o nvel 2 do 3o nvel 1 e do 4o nvel 0.

Prof. Cludio H. S. Grecco

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

1.6 Exemplo de recurso: Torres de Hanoi


Enunciado do problema
H muito tempo atrs, no alto das montanhas de Hanoi, havia um mosteiro onde habitavam sacerdotes brmanes; entre eles, era praticado um ritual para predizer o fim do mundo. Conta a lenda, que no mosteiro havia trs torres, sendo que na primeira delas estavam empilhados 64 discos de ouro em tamanhos decrescentes. Os sacerdotes acreditavam que quando eles terminassem de transferir todos os discos da primeira torre para a terceira (usando a segunda), sem nunca colocar um disco maior sobre um menor, ento, neste dia, o mundo acabaria! Para facilitar, vamos supor a existncia de trs discos:

O objetivo transferir os trs discos da torre A para a torre C, usando a torre B como auxiliar. Somente o primeiro disco de uma torre pode ser deslocado para outra, e um disco maior nunca pode ser colocado sobre outro menor. Processo para transferir os trs discos:

Matematicamente possvel demonstrar que o tempo necessrio para mover n discos da ordem de n! (ou maior).

Prof. Cludio H. S. Grecco

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Soluo usando recurso:


soluo trivial: Se n=1, transfira o disco da torre A para a torre C; soluo geral: a) transfira n-1 discos da torre A para a torre B, usando C como auxiliar; b) transfira o ltimo disco da torre A para a torre C; c) transfira n-1 discos da torre B para torre C, usando A como auxiliar.

Algoritmo em Pascal para a soluo do problema


PROCEDURE Hanoi(n:INTEGER; Org,Aux,Dst:CHAR); BEGIN IF n= 1 THEN writeln(Mova disco 1 da torre ,Org, para , Dst) ELSE BEGIN Hanoi(n-1,Org,Dst,Aux); writeln(Mova disco ,n, da torre ,Org, para , Dst); Hanoi(n-1,Aux,Org,Dst); END; END;

Quando a chamada Hanoi (3,A,B,C) for executada, ser produzida a seguinte sada: Mova disco 1 da torre A para C Mova disco 2 da torre A para B Mova disco 1 da torre C para B Mova disco 3 da torre A para C Mova disco 1 da torre B para A Mova disco 2 da torre B para C Mova disco 1 da torre A para C

1.7 Uso da Recurso


Nem sempre recomendado o uso de recurso. Alguns problemas so impossveis de solucionar com recurso. Problemas: Custo de tempo e espao: Cada vez que a subrotina chamada, todas as variveis locais so recriadas (gerenciamento do registro de ativao e espao por ele ocupado); Dificuldade na depurao de programas, particularmente se a recurso for profunda.

Prof. Cludio H. S. Grecco

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Por que usar recurso?


Se bem empregada, torna o algoritmo muito elegante, isto , claro, simples e conciso. Algoritmos recursivos so apropriados quando o problema for definido em termos recursivos. Programas onde a recurso deve ser evitada podem ser evitados por um esquema que exiba o padro da sua composio: R [TC,R] R [C,TR] a caracterstica desses programas possuir uma s chamada a R no final (chamada de recurso de cauda). os programas que se encaixam nesse esquema, como o exemplo do clculo da fatorial, possuem uma soluo iterativa (no recursiva) mais eficiente.

1.8 Recurso de Cauda


Na recurso de cauda a chamada recursiva est no final do cdigo, tendo como funo criar um lao que ser repetido at a condio de parada. Para eliminar a recurso de cauda: Se uma rotina R(x) tem como ltima instruo uma chamada recursiva R(y), ento troca-se R(y) pela atribuio xy, seguido de um desvio para o incio de R. Utiliza-se uma repetio condicionada expresso de teste usada na verso recursiva.

1.9 Verso Iterativa do Clculo de fatorial


FUNCTION fat(n:INTEGER):INTEGER; VAR result:INTEGER; BEGIN result:=1; WHILE n>0 DO BEGIN result:= result*n; n:= n-1; END; fat := result; END;

Embora fatorial seja mais eficiente de forma iterativa, um excelente exemplo para se entender o que recurso.

Prof. Cludio H. S. Grecco

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

2. Listas Lineares
So estruturas dinmicas caracterizadas por manter uma seqncia ordenada de elementos. So compostas por elementos que podem ser dados primitivos ou estruturados. Os elementos so chamados de nodos. Seja uma lista X, formada por nodos X1,X2, ... Xn, tal que: 1) Existem n nodos na lista (n>=0); 2) X1 o primeiro nodo; 3) Xn o ltimo nodo; 4) Para todo i,j entre 1 e n, se i<j, ento o elemento Xi antecede Xj; 5) Caso i = j -1, Xi o antecessor de Xj e Xj o sucessor de Xi. 6) Quando a lista no possui nodos (n=0) a lista dita vazia. Exemplos de listas: lista de clientes de uma banco, lista de chamada, lista de compras, etc.

2.1 Operaes sobre Listas


Percurso
Operao que permite utilizar cada um dos elementos de uma lista linear. A lista pode ser percorrida de vrias formas, do incio ao fim, de trs para frente, etc.

Busca
Operao que procura um elemento especfico. A busca pode ser feita de duas formas: ou o elemento identificado por sua posio relativa ou pelo seu contedo.

Insero de Elementos por Posio Retirada de Elementos por Posio

Prof. Cludio H. S. Grecco

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

2.2 Alocao de Memria


Esttica
Quantidade total de memria utilizada pelos dados definida em tempo de compilao de forma imutvel; Durante toda execuo a quantidade de memria utilizada no varia; Ideal para uso com listas seqencias.

Dinmica
O programa capaz de criar novas variveis enquanto executa; reas de memria passam a existir durante a execuo do programa; Ideal para uso com listas encadeadas.

2.3 Lista Seqencial


Serve para armazenar uma lista no computador colocando seus elementos em clulas de memria consecutivas, um aps o outro (contigidade fsica). Com isso, cada clula tem um endereo nico e ocupa o mesmo espao de memria. Dado o endereo inicial da rea alocada e o ndice de um elemento qualquer, possvel acess-lo imediatamente. Quando so necessrias inseres ou remoes no meio da lista necessria a movimentao de elementos. Caractersticas de uma lista seqencial: Contm nodos representados por endereos contguos (de igual distncia); Armazenados na memria um ao lado do outro; Lista pode ser implementada atravs de um vetor; Nmero de elementos da lista pode variar durante a execuo (deve-se armazenar a quantidade de elementos na lista); Com o uso de alocao esttica, a quantidade mxima de elementos determinada no cdigo-fonte; Representao fsica e lgica so iguais.

2.4 Estrutura Fsica e Lgica


Estrutura Lgica como os dados so vistos pelos programadores. Estrutura Fsica como os dados so efetivamente armazenados na memria.

Prof. Cludio H. S. Grecco

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

2.5 O Tipo Lista em Pascal


Componentes da lista:
Nmero de nodos da lista (total) Vetor de nodos (memo) Tamanho total da Lista (MAX)

Declarao em Pascal:
CONST MAX = 50; SUCESSO = 1; LISTACHEIA = 2; LISTAVAZIA = 3; POSICAOINVALIDA = 4; TYPE Elem = INTEGER; Lista= RECORD total: integer; memo: ARRAY [1..MAX] OF Elem; END;

2.6 Trabalhando com Listas em Pascal


Criando Listas:
PROCEDURE CriaLista (VAR l: Lista); BEGIN l.total :=0; END;

Prof. Cludio H. S. Grecco

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Inserindo no Fim de Listas:


FUNCTION IncluiFim (VAR l: Lista; no: Elem):BYTE; BEGIN IF l.total = MAX THEN IncluiFim := LISTACHEIA ELSE BEGIN l.total:= l.total+1; l.memo[l.total] := no; IncluiFim := SUCESSO; END; END;

Inserindo no Incio de Listas:


FUNCTION IncluiInicio (VAR l: Lista; no: Elem):BYTE; VAR i: integer; BEGIN IF l.total = MAX THEN IncluiInicio := LISTACHEIA ELSE BEGIN l.total:= l.total+1; FOR i:=l.total DOWNTO 2 DO l.memo[i] := l.memo[i-1]; l.memo[1]:=no; IncluiInicio := SUCESSO; END; END;

Inserindo em Posio Especfica:


FUNCTION IncluiPos(VAR L:Lista;no:Elem; pos:INTEGER):BYTE; VAR i:integer; BEGIN IF l.total=MAX THEN IncluiPos:=LISTACHEIA ELSE IF (pos>0) AND (pos<=l.total+1) THEN BEGIN l.total:=l.total+1; FOR i:=l.total DOWNTO pos+1 DO l.memo[i]:=l.memo[i-1]; l.memo[pos]:=no; IncluiPos:=SUCESSO; END ELSE IncluiPos:=POSICAOINVALIDA; END;

Prof. Cludio H. S. Grecco

10

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Removendo do Fim:
FUNCTION RetiraFim (VAR l: Lista; VAR no:Elem):BYTE; BEGIN IF l.total = 0 THEN RetiraFim := LISTAVAZIA ELSE BEGIN no := l.memo[l.total]; l.total:= l.total-1; RetiraFim := SUCESSO; END; END;

Removendo do Incio:
FUNCTION RetiraInicio (VAR l: Lista; VAR no: Elem):BYTE; VAR i: integer; BEGIN IF l.total = 0 THEN RetiraInicio := LISTAVAZIA ELSE BEGIN no:=l.memo[1]; l.total:= l.total-1; FOR i:=1 TO l.total DO l.memo[i] := l.memo[i+1]; RetiraInicio := SUCESSO; END; END;

Removendo em Posio Especfica:


FUNCTION RetiraPos(VAR L:Lista;VAR no:Elem; pos:INTEGER):BYTE; VAR i:integer; BEGIN IF l.total=0 THEN RetiraPos:=LISTAVAZIA ELSE IF (pos>0) AND (pos<=l.total) THEN BEGIN no:=l.memo[pos]; l.total:=l.total-1; FOR i:=pos TO l.total DO l.memo[i]:=l.memo[i+1]; RetiraPos:=SUCESSO; END ELSE RetiraPos:=POSICAOINVALIDA; END;

Prof. Cludio H. S. Grecco

11

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

2.7 Alternativa de Implementao


Para facilitar as inseres e remoes no incio da lista, pode-se inserir a partir do meio do vetor.
CONST MAX = 50; TYPE Elem = INTEGER; Lista= RECORD inicio,fim: integer; memo: ARRAY [1..MAX] OF Elem; END;

Caso incio = 0 e fim = 0 a lista est vazia; Caso incio = 1 e fim = MAX a lista est cheia; Na inicializao o fim e o incio so zerados; Na primeira insero: incio igual a MAX DIV 2 e fim igual a incio; Mesmo assim, pode ser necessria a movimentao.

2.8 Concluso sobre Lista Seqencial


A representao fsica da lista pode variar conforme o extremo das inseres/remoes. Uma posio especfica para consulta pode ser calculada (acesso aleatrio). Uma lista seqencial facilita a transferncia de dados, pois armazena tudo em rea contga de dados, alm disso, inseres e remoes podem exigir movimentao de dados. A lista seqencial mantm um espao de memria ocioso, devido a alocao esttica e os limites devem ser testados constantemente.

2.9 Disciplinas de Acesso


Considerando-se somente operaes de acesso, insero e remoo, restritas aos extremos da listas, temos os seguintes casos especiais:

Pilha: lista linear onde os acessos, inseres e remoes so realizados em um nico extremo. Listas do tipo LIFO (Las-tin Fist-out, ltimo a entrar o primeiro a sair); Fila: lista linear onde as inseres so feitas em um extremo e os acessos e remoes no outro. Listas do tipo FIFO (First-in First-out, primeiro a entrar o primeiro a sair); Fila Dupla ou DEQUE (Double Ended Queue): lista linear onde as inseres, remoes e acessos so feitos em qualquer extremo. Casos especiais: Entrada Restrita e Sada Restrita.

Prof. Cludio H. S. Grecco

12

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

2.10 Pilhas (Stacks)


Nas pilhas, as inseres e remoes ocorrem em um mesmo extremo da lista, denominado topo. Os elementos so removidos em ordem inversa quela em que foram inseridos (LIFO - Last-in First-out).

Operaes Bsicas:
Inicializa Pilha Insere Pilha (empurra / push) Remove Pilha (puxa / pop) Consulta Topo (top) Vazia (isempty) Cheia (isfull)

2.11 Implementando Pilhas em Pascal


Componentes da Pilha:
um vetor, para armazenar os elementos contidos; um ndice, para indicar a posio do topo.

Prof. Cludio H. S. Grecco

13

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Registro em Pascal:
CONST MAX = 50; TYPE Elem = CHAR; Pilha= RECORD topo: INTEGER; memo: ARRAY[1..MAX] OF Elem; END;

Inicializando a Pilha:
PROCEDURE Inicializa(VAR p:Pilha); BEGIN p.topo:=0; END;

Verificando Limites:
FUNCTION Vazia(VAR p:Pilha):BOOLEAN; BEGIN IF p.topo=0 THEN Vazia := TRUE ELSE Vazia := FALSE; END; FUNCTION Cheia(VAR p:Pilha):BOOLEAN; BEGIN IF p.topo=MAX THEN Cheia := TRUE ELSE Cheia := FALSE; END;

Empilhando:
PROCEDURE Insere(VAR p:Pilha; no:Elem); BEGIN IF NOT Cheia(P) THEN BEGIN p.topo:=p.topo+1; p.memo[p.topo] := no; END ELSE WRITELN(Pilha Cheia!); {Stack Overflow} END;

Desempilhando:
FUNCTION Remove(VAR p:Pilha):Elem; BEGIN IF NOT Vazia(P) THEN BEGIN Remove:= p.memo[p.topo]; p.topo:=p.topo-1; END ELSE WRITELN(Pilha Vazia!); {Stack Underflow} END;

Prof. Cludio H. S. Grecco

14

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Consulta o Topo:
FUNCTION Topo(VAR p:Pilha):Elem; BEGIN IF NOT Vazia(P) THEN Topo:= p.memo[p.topo] ELSE WRITELN(Pilha Vazia!); END;

2.12 Exemplos do Uso de Pilha


Exemplo 1: Controle de Subrotinas
sempre que uma subrotina chamada, uma pilha utilizada para armazenar o valor de retorno.

Exemplo 2: Imprimir nmero decimal em binrio


dividir um inteiro sucessivamente por dois, at obter um quociente igual a zero. Ento tomar os restos da diviso em ordem inversa.

Exemplo 2
PROCEDURE DEC2BIN(n:INTEGER); VAR resto, quoc:INTEGER; p:pilha; BEGIN inicializa(p); REPEAT resto:= n MOD 2; insere(P,resto); n := n DIV 2; UNTIL N=0; WHILE NOT vazia(P) DO BEGIN resto := remove(P); WRITE(resto); END; WRITELN; END;

Prof. Cludio H. S. Grecco

15

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

2.12 Filas (Queues)


As inseres ocorrem em um extremo ficando as remoes restritas a outro. Os elementos so removidos na mesma ordem em que foram inseridos (FIFO-First-in First-out).

Operaes Bsicas:

Inicializa Lista Insere Lista (enfileira / enqueue) Remove Lista (desenfileira / dequeue) Vazia (isempty) Cheia (isfull)

2.13 Implementao de Filas


Componentes da Fila:
vetor para armazenar os elementos; varivel apontando para o primeiro elemento; varivel apontando para primeira posio livre.

Registro em Pascal:
TYPE Fila= RECORD comeo, fim: INTEGER; memo: ARRAY[1..MAX] OF Elem; END;

Prof. Cludio H. S. Grecco

16

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Problema de Implementao:
Cada vez que um elemento removido, o comeo desloca-se para direita. Aps a remoo de todos os elementos no ser mais possvel inserir na lista.

Soluo para o problema


Uso de lista circular: o fim do vetor emenda no incio; Cada posio liberada por um elemento disponvel torna-se prontamente disponvel; necessrio que logicamente a posio 1 esteja aps a posio MAX;

2.14 Implementao de Filas em Pascal


Componentes da Fila:
vetor para armazenar os elementos; varivel apontando para o primeiro da fila; varivel apontando para o ltimo da fila; quantidade de elementos da fila.

Registro em Pascal:
CONST MAX= 50; TYPE Elem= REAL; TYPE Fila= RECORD comeco, final, total: INTEGER; memo: ARRAY[1..MAX] OF Elem; END;

Inicializando Fila:
PROCEDURE Inicializa(VAR f:Fila); BEGIN f.total:=0; f.comeco:=1; f.final:=1; END;

Prof. Cludio H. S. Grecco

17

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Verificando Limites:
FUNCTION BEGIN Vazia := END; FUNCTION BEGIN Cheia := END; Vazia(VAR f:Fila):BOOLEAN; (f.total = 0); Cheia(VAR f:Fila):BOOLEAN; (f.total = MAX);

Insere Elemento na Fila:


PROCEDURE Insere(VAR f:Fila; no:Elem); BEGIN IF NOT Cheia(f) THEN BEGIN f.memo[f.final] := no; f.total :=f.total +1; f.final:=(f.final MOD MAX)+1; END ELSE WRITELN(Fila Cheia!); END;

Remove Elemento da Fila:


FUNCTION Remove(VAR f:Fila):Elem; BEGIN IF NOT Vazia(f) THEN BEGIN Remove:=f.memo[f.comeco]; f.total:=f.total -1; f.comeco:=(f.comeco MOD MAX)+1; END ELSE WRITELN(Fila Vazia!); END;

2.15 Exemplo do Uso de Filas


Colorindo Regies Grficas
Algoritmos para colorir regies de desenhos (matrizes de pontos); Regio um conjunto de pontos conectados entre si e que tm a mesma cor; Diz-se que dois pontos Pi e Pj esto conectados entre si, se e somente se, possvel partir de Pi incrementando (ou decrementando) sua abcissa (ou ordenada) e chegar ao ponto Pj.

quatro pontos conectados a P0

Prof. Cludio H. S. Grecco

18

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

2.16 Algoritmo para Colorir Regies


Para colorir uma regio R, faa:
obtenha um ponto inical P0, de cor C0, seguramente pertencente regio R; obtenha uma nova cor C1 para a regio R; coloque P0 em uma fila V, inicialmente vazia; enquanto a fila no esvaziar: Remova um ponto P da fila V; Insira em V todos os pontos conectados a P, cuja cor seja C0; altere a cor de P para C1.

O desenho ser representado por uma matriz NxN


cada elemento da matriz representa um ponto; cada pixel discriminado pelas coordenadas da sua posio na matriz; cada elemento da matriz armazena um nmero correspondente cor do ponto.

TYPE Ponto = RECORD ABCISSA: INTEGER; ORDENADA: INTEGER; END; Elem = PONTO; Ou ento PROCEDURE InsPonto (VAR V:Fila; X,Y:INTEGER); BEGIN insere(V,X); insere(V,Y); END; PROCEDURE RemPonto (VAR V:Fila; VAR X,Y:INTEGER); BEGIN X:=remove(V); Y:=remove(V); END;

Prof. Cludio H. S. Grecco

19

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

PROCEDURE Colorir(VAR M:Imagem; X,Y, Cor:INTEGER); VAR V:Fila; C0: INTEGER; BEGIN C0:=M[X,Y]; inicializa(V); InsPonto(V,X,Y); WHILE NOT vazia(V) DO BEGIN RemPonto (V,X,Y); IF M[X+1,Y]=C0 THEN InsPonto(V,X+1,Y); IF M[X-1,Y]=C0 THEN InsPonto(V,X-1,Y); IF M[X,Y+1]=C0 THEN InsPonto(V,X,Y+1); IF M[X,Y-1]=C0 THEN InsPonto(V,X,Y-1); M[X,Y]:=Cor; END; END;

2.17 Filas Duplas (Deques)


So filas de duas extremidades, onde as inseres, remoes e consultas so permitidas apenas nos extremos (Double-Ended-Queue). Alm do tipo convencional existem dois tipos: Entrada Restrita: a insero s pode ser efetuada em uma das extremidades (no incio ou no final); Sada Restrita: a remoo s pode ser efetuada em um dos extremos (incio ou final).

2.18 Implementao de Fila Dupla


A Fila Dupla representada por uma lista circular.

Registro em Pascal
CONST MAX= 50; TYPE Elem= REAL; TYPE Deque= RECORD comeco, final, total: INTEGER; memo: ARRAY[1..MAX] OF Elem; END;

Alm do insere da fila (InsereFinal) e do remove da fila (RemoveIncio) possvel criar o InsereInicio e o RemoveFinal As funes Vazia e Cheia so idnticas

Prof. Cludio H. S. Grecco

20

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

3. Lista Encadeada 3.1 Alocao de Memria


Esttica
A quantidade total de memria utilizada pelos dados definida em tempo de compilao de forma imutvel e durante toda execuo a quantidade de memria utilizada no varia. Ideal para uso com listas seqenciais.

Dinmica
O programa capaz de criar novas variveis enquanto executa; reas de memria passam a existir durante a execuo do programa; Ideal para uso com listas encadeadas.

3.2 Alocao Dinmica em Pascal


Tipo de alocao onde cada varivel possui um nmero indefinido de bytes alocados na memria. Durante a execuo alocada ou desalocada memria para a varivel com qualquer tamanho. As variveis locais em Pascal so alocadas dinamicamente, porm de forma automtica. necessrio o uso de uma varivel do tipo Ponteiro, para a utilizao de alocao dinmica. Um ponteiro uma varivel que ocupa 4bytes e aponta para um endereo de memria; Na definio de um ponteiro indicado o tipo que ir conter no endereo.

Definio de um ponteiro:
Var nome_do_ponteiro:^tipo_base; Exemplo: VAR pint: ^INTEGER; {aponta
p/ inteiro}

Alocar um ponteiro (reservar espao de memria):


New(p); Procedimento que aloca memria do tamanho do tipo_base.

Desalocar um ponteiro (liberar espao alocado):


Dispose(p); Procedimento que desaloca memria alocada pelo procedimento New(p).

Prof. Cludio H. S. Grecco

21

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

3.3 Ponteiros em Pascal


Quando um ponteiro no aponta para endereo algum (no foi alocada memria para ele ainda) contm o valor NIL ( palavra reservada que representa um ponteiro nulo). Caso seja definido em um programa um ponteiro P, as seguintes definies so vlidas: P contm o endereo de memria apontado pelo ponteiro; P^ representa o contedo do ponteiro. Caso se utilize @n, sendo n uma varivel qualquer diferente de ponteiro, retorna o endereo de n.

3.4 Exemplos do uso de Ponteiro


Exemplo 1:
TYPE PTR=^INTEGER; VAR p: PTR; BEGIN NEW(p); IF p=NIL THEN WRITELN(ERRO: Falta de Memria) ELSE BEGIN p^:= 1500; WRITELN(p^); DISPOSE(p); END; END.

Exemplo 2:
VAR n:INTEGER; p:^INTEGER; BEGIN n:= 486; p:= @n; WRITELN(Contedo:,p^); END.

Prof. Cludio H. S. Grecco

22

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

3.5 Ponteiros em Pascal


Outras subrotinas em Pascal para alocao dinmica:
GetMem(p, nbytes): procedimento que aloca uma rea de memria com tamanho nbytes; FreeMem(p,nbytes): procedimento que desaloca uma rea de memria com tamanho nbytes; MemAvail: retorna o nmero de bytes disponvel na memria; MaxAvail: retorna o nmero de butes do maior bloco disponvel na memria; SEG(varivel): funo que retorna o segmento da varivel passada; OFS(varivel): funo que retorna o deslocamento (offset) da varivel passada;

3.6 Implementando um Lista Encadeada


Ao invs de manter os elementos agrupados numa rea contgua de memria, na lista encadeada os elementos podem ocupar quaisquer clulas. Para manter a relao da ordem linear, junto com cada elemento armazenado o endereo do prximo (um ponteiro para o elemento seguinte). Os elementos so armazenados em blocos de memria denominados nodos que contm: um elemento da lista; um ponteiro para o prximo elemento; Para acessar a lista encadeada basta saber o endereo do primeiro elemento; o ltimo elemento da lista aponta para NIL, indicando o fim da lista. Caracterstica de uma lista encadeada: Facilidade de insero e remoo no meio da lista, pois no necessita realizar movimentaes; A lista cresce indeterminadamente, enquanto houver memria livre; Para acessar um elemento especfico da lista, deve-se percorrer todos os anteriores; Espao adicional perdido para guardar os ponteiros;

Prof. Cludio H. S. Grecco

23

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

3.7 Estrutura Fsica e Lgica

3.8 O Tipo Lista Encadeada em Pascal


Componentes da lista:
Nodos da lista (composto por um elemento e um ponteiro para o prximo); Endereo do primeiro nodo.

Declarao em Pascal:
CONST SUCESSO = 1; FALTADEMEMORIA = 2; LISTAVAZIA = 3; TYPE Elem = INTEGER; PtrNodo = ^Nodo; Nodo = RECORD memo: Elem; elo: PtrNodo; END; ListaEnc = ^Nodo;

3.9

Trabalhando com Lista Encadeada

Criando Listas Encadeadas:


FUNCTION CriaLista (VAR l:ListaEnc); BEGIN l:=NIL; END;

Prof. Cludio H. S. Grecco

24

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Inserindo no Incio da Lista:


FUNCTION InsereInicio (VAR l:ListaEnc; no:Elem):BYTE; Var pn : PtrNodo; BEGIN NEW (pn); IF pn = NIL THEN InsereInicio:=FALTADEMEMORIA ELSE BEGIN pn^.memo:=no; pn^.elo:=l; l:= pn; InsereInicio:=SUCESSO; END; END;

Removendo do Incio:
PROCEDURE RemoveInicio(VAR l:ListaEnc;VAR no:Elem):BYTE; Var pn : PtrNodo; BEGIN IF l = NIL THEN RemoveInicio:=LISTAVAZIA ELSE BEGIN pn:=l; l:= pn^.elo; no:= pn^.memo; DISPOSE (pn); RemoveInicio:=SUCESSO; END; END;

Removendo do Incio:
PROCEDURE RemoveInicio(VAR l:ListaEnc;VAR no:Elem):BYTE; Var pn : PtrNodo; BEGIN IF l = NIL THEN RemoveInicio:=LISTAVAZIA ELSE BEGIN pn:=l; l:= pn^.elo; no:= pn^.memo; DISPOSE (pn); RemoveInicio:=SUCESSO; END; END;

3.10 Lista Encadeada com Descritor


Algumas dificuldades da lista encadeada podem ser resolvidas com a adio de um descritor. O uso do descritor serve para: determinar o nmero de elementos, pois, sem utilizar descritor, deve-se percorrer toda a lista;

Prof. Cludio H. S. Grecco

25

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

acessar o ltimo elemento da lista, pois, sem empregar o descritor, deve-se visitar todos os elementos intermedirios;

Descritor contm:
endereo do primeiro elemento; endereo do ltimo elemento; quantidade de elementos da lista.

3.11 Lista Encadeada com Descritor em Pascal


Declarao em Pascal:
TYPE Elem = INTEGER; PtrNodo = ^Nodo; Nodo = RECORD memo: Elem; elo: PtNodo; END; ListEnc = RECORD primeiro, ultimo :PtrNodo; total :Integer; END;

3.12 Encadeamento com Descritor em Pascal


Criando Listas Encadeadas com Descritor:
PROCEDURE CriaLista (VAR l:ListaEnc); BEGIN l.primeiro:=NIL; l.ultimo:=NIL; l.total:=0; END;

Determinando a quantidade de Elementos:


FUNCTION TamLista (l:ListaEnc):INTEGER; BEGIN TamLista:=l.total; END;

Prof. Cludio H. S. Grecco

26

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

Inserindo no Incio da Lista Encadeada com Descritor:


FUNCTION InsereInicio (VAR l:ListaEnc; no:Elem):BYTE; Var pn : PtrNodo; BEGIN NEW (pn); IF pn = NIL THEN InsereInicio:=FALTADEMEMORIA ELSE BEGIN pn^.memo:=no; pn^.elo:=l.primeiro; l.primeiro:= pn; IF l.total= 0 THEN l.ultimo := pn; l.total:=l.total+1; InsereInicio:=SUCESSO; END; END;

Inserindo no Fim da Lista Encadeada com Descritor:


FUNCTION InsereFim (VAR l:ListaEnc; no:Elem):BYTE; Var pn : PtrNodo; BEGIN NEW (pn); IF pn = NIL THEN InsereFim:=FALTADEMEMORIA ELSE BEGIN pn^.memo:=no; pn^.elo:=NIL; IF l.total= 0 THEN l.primeiro := pn ELSE l.ultimo^.elo:=pn; l.ultimo:=pn; l.total:=l.total+1; InsereFim:=SUCESSO; END; END;

3.13 Lista Duplamente Encadeada


Algumas dificuldades da lista encadeada (com ou sem descritor) podem ser resolvidas com o duplo encadeamento, neste caso, a lista s pode ser percorrida em um sentido, pois possui um elo apenas para o prximo elemento.Na lista duplamente encadeada cada nodo possui: um elemento; um ponteiro para o prximo elemento; um ponteiro para o primeiro elemento. Quando um nodo no possui prximo ou anterior o elo respectivo aponta para NIL.

Prof. Cludio H. S. Grecco

27

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

3.14 Lista Duplamente Encadeada em Pascal


Declarao em Pascal
TYPE Elem = INTEGER; PtrNodo = ^Nodo; Nodo = RECORD memo: Elem; anterior, posterior: PtrNodo; END; ListaDEnc = RECORD primeiro, ultimo :PtrNodo; total :Integer; END;

Inserindo no Incio de um Lista Duplamente Encadeada


FUNCTION InsereInicio (VAR l:ListaDEnc; no:Elem):BYTE; Var pn : PtrNodo; BEGIN NEW (pn); IF pn = NIL THEN InsereInicio:=FALTADEMEMORIA ELSE BEGIN pn^.memo:=no; pn^.anterior:=NIL; IF l.total=0 THEN l.ultimo:=pn ELSE l.primeiro^.anterior:=pn; pn^.posterior:=l.primeiro; l.primeiro:=pn; l.total:=l.total+1; InsereInicio:=SUCESSO; END; END;

Inserindo no Fim da Lista Encadeada com Descritor


FUNCTION InsereFim (VAR l:ListaDEnc; no:Elem):BYTE; Var pn : PtrNodo; BEGIN NEW (pn); IF pn = NIL THEN InsereFim:=FALTADEMEMORIA ELSE BEGIN pn^.memo:=no; pn^.posterior:=NIL; IF l.total = 0 THEN l.primeiro := pn ELSE l.ultimo^.posterior:=pn; pn^.anterior:=l.ultimo; l.ultimo:=pn; l.total:=l.total+1; InsereFim:=SUCESSO; END; END;

Prof. Cludio H. S. Grecco

28

Universidade Castelo Branco

Algoritmos e Estruturas de Dados II

3.15 Outras formas de Encadeamento


Encadeamento Circular
Em uma lista com encadeamento circular o campo de ligao do ltimo nodo armazena o endereo do primeiro. A varivel ponteiro para lista pode apontar para o ltimo elemento, com isso, o acesso ao primeiro e o ltimo rpido.

Encadeamento Duplo Compacto


Tcnica que permite armazenar tanto o endereo do nodo anterior quanto do posterior na mesma varivel ponteiro. Realiza-se um Ou-Exclusivo entre os dois endereos.

Prof. Cludio H. S. Grecco

29

You might also like