Vous êtes sur la page 1sur 131

Ponteiros em Pascal

Variveis ponteiros so aquelas que guardam o endereo de outra, possibilitando o acesso a seu contedo. Declarao em Pascal:
var ptInt: ^integer; {ponteiro para uma varivel inteira } ptReal: ^real; {ponteiro para uma varivel real}
1

Operador @ Operador unrio que retorna o endereo de uma varivel


program soma; var S,A,B:integer; PtS,PtA,PtB : ^integer; begin readln(A,B); PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; writeln('Resultado: ',PtS^); end.
2

Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.

PtA

PtB

PtS

Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.

PtA

PtB

PtS

A 2

Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.

PtA

PtB

PtS

A 2

B 3

Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.

PtA

PtB

PtS

A 2

B 3

Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.

PtA

PtB

PtS

A 2

B 3

Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.

PtA

PtB

PtS

A 2

B 3

Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.

PtA

PtB

PtS

A 2

B 3

S 5

Alocao de memria
program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.

PtA

PtB

PtS

A 2

B 3

S 5

10

procedure New( )
Cria dinamicamente (em tempo de execuo) uma nova varivel e faz uma varivel ponteiro apontar para ela.
type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.

11

Alocao de memria type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.

12

Alocao de memria type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.

13

Alocao de memria type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.

Bom Dia!

14

Alocao de memria Bom Dia! type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.

Bom Dia!

15

Alocao de memria type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.

OBS: a procedure Dispose libera uma varivel criada dinamicamente, para que o SO possa reutilizar o espao de memria correspondente.
16

Um ponteiro recebendo o valor de um outro...


U m ponteiro recebe o valor de um outro atravs do comando de atribuio... Ex: q:= p; Quando isso acontece, ele passa a apontar para o mesmo objeto que o outro aponta

17

Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :

18

Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :

19

Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :

20

Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :

21

Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :

22

Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :

23

Alocao de memria 5
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :

24

Alocao de memria
var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :

25

Alocao de memria ATENO: observe que a partir de q:=p;, perdeu-se o acesso varivel criada com var new(q)... p,q,r: ^integer; Portanto, o manuseio de ponteiros begin exige cuidado! new(p); p^ := 5; new(q); p r q q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q);{ou p ou r } :

26

Listas lineares
Em vrias situaes em programao temos que lidar com listas de elementos cujo tamanho exato desconhecido. Estratgias: Empregar um agregado homogneo (array) superdimensionado.
1 2 3

...

N-1 N

Empregar seqncias de clulas (ns) que contm dois elementos: um valor e um ponteiro para o prximo n.
p

...

27

Quando adotar uma ou outra soluo? Agregado homogneo: quando pudermos determinar com segurana o tamanho mximo. Listas encadeada: - quando for difcil estimar o tamanho mximo com segurana; e/ou... - quando se desejar maior agilidade nas incluses ou excluses de novos elementos.
28

Lista: uma estrutura recursiva:


Ex: definio de uma lista de inteiros: Lista vazia; Um inteiro seguido de uma lista de inteiros.
Lista vazia / p 4 Um inteiro seguido de uma lista de inteiros... p 7 1 9 /
29

Lista: uma estrutura recursiva:


Ex: definio de uma lista de inteiros:
O ponteiro contido no Lista vazia; primeiro n aponta para a lista formada pelos demais ns lista de Um inteiro seguido de uma

inteiros.

Lista vazia / p

Um inteiro seguido de uma lista de inteiros... p 4 7 1 9 /


30

Lista: uma estrutura recursiva:


Ex: definio de uma lista de inteiros:
OBS: para se ter acesso aos elementos da lista vazia; necessrio que haja sempre uma Lista varivel apontando para a cabea da Um inteiro seguido de uma lista de lista...

inteiros.

Lista vazia / p

Um inteiro seguido de uma lista de inteiros... p 4 7 1 9 /


31

Lista: uma estrutura recursiva:


Ex: definio de uma lista de inteiros:
...a partir de cada n, pode-se ter Lista vazia; acesso ao seguinte. Assim, pode-se percorrer a lista lista toda. Um inteiro seguido de uma de

inteiros.

Lista vazia / p

Um inteiro seguido de uma lista de inteiros... p 4 7 1 9 /


32

Lista: uma estrutura recursiva:


Ex: definio de uma lista de inteiros:
Quando a lista estiver vazia o ponteiro que Lista vazia; deveria apontar o primeiro elemento, guarda o valor nil ( lista / ). de Um inteiro seguido de uma

inteiros.

Lista vazia / p

Um inteiro seguido de uma lista de inteiros... p 4 7 1 9 /


33

Definio (recursiva) de um n:
type tDado = integer; { ou real, char, etc.} tPtNo = ^tNo; tNo = record Dado:tDado; Prox :tPtNo; end; var p,q: tPtNo;

34

Definio (recursiva) de um n:
type tDado = integer; { ou real, char, etc.} tPtNo = ^tNo; tNo = record Dado:tDado; Prox :tPtNo; end; var p,q: tPtNo;

35

Semanticamente, uma definio semelhante seria...


type tDado = integer; { ou real, char, etc.} tNo = record Dado:tDado; Prox :^tNo; end; var p,q: tPtNo;

Contudo, as regras de Pascal exigem a definio na forma anteriormente exposta.


36

type dinamicamente, ser empregados tDado = integer; { ou real, char, etc.} para se construir uma lista. tPtNo = ^tNo; tNo = record Dado:tDado; Prox :tPtNo; end; var p,q: tPtNo;

Definio (recursiva) de um n: OBS: no incio da execuo do programa s h ponteiros (p,q) para ns. Estes podero,

37

Exemplo de uso: criao de uma lista com dois elementos:


var p,q: tPtNo; begin new(p); p^.Dado := 7; acesso ao acesso ao new(q); objeto apontado campo q^.Dado := 3; por p especfico p^.Prox := q; q^.Prox := nil; :

p^.Dado

38

Exemplo de uso: criao de uma lista com dois elementos:


var p,q: tPtNo; begin new(p); p^.Dado := 7; acesso ao acesso ao new(q); objeto apontado campo q^.Dado := 3; por p especfico p^.Prox := q; q^.Prox := nil; :

p^.Prox

39

Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :

40

Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :

41

Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :

42

Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :

43

Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :

44

Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :

45

Alocao de memria var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :

3 /

46

Exemplo 2: dada a lista abaixo, inserir um novo n entre os dois existentes e armazenar nele o valor 2.
: new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; : p q

3 /

47

Alocao de memria

: new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; :

3 /

48

Alocao de memria

: new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; :

3 /

49

Alocao de memria

: new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; :

2 7 3 /

50

Alocao de memria

: new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; :

2 7 3 /

51

Alocao de memria

: new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; :

2 7 3 /

52

Alocao de memria

: new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; :

q / 2

3 /

53

Alocao de memria

OBS: por convenincia, representamos esquematicamente os ns lado a lado. : Entretanto, as suas localizao no heap new(q); podem ser bastante dispersas... q^.Dado := 2;
q^.Prox := p^.Prox; p^.Prox := q; q := nil; : 7 p q /

3 /

54

Representao esquemtica ideal p q ... 7 2 3 /


3 /

p q

7 2

h e a p

Uma possvel . disposio fsica .

...

55

Dvidas freqentes:
1) sempre que precisar de um ponteiro, preciso cri-lo, com new?

56

Dvidas freqentes:
1) sempre que precisar de um ponteiro, preciso cri-lo, com new? No. >> o simples fato de se declarar o ponteiro (varivel global, local ou parmetro) faz com que o sistema aloque memria para ele.

57

Dvidas freqentes:
1) sempre que precisar de um ponteiro, preciso cri-lo, com new? No. >> o simples fato de se declarar o ponteiro (varivel global, local ou parmetro) faz com que o sistema aloque memria para ele. >> new() deve ser usado para criar um objeto (sem identificao) para o qual o ponteiro usado como argumento apontar.

58

Dvidas freqentes:
1) sempre que precisar de um ponteiro, preciso cri-lo, com new? No. >> o simples fato de se declarar o ponteiro (varivel global, local ou parmetro) faz com que o sistema aloque memria para ele. >> new() deve ser usado para criar um objeto (sem identificao) para o qual o ponteiro usado como argumento apontar. >> o tipo do objeto criado depender do tipo de ponteiro.
59

Dvidas freqentes:
Caso seja executado o cdigo abaixo, p. ex...
new(q); q:=p;{apontarparaoprimeiroelemento dalista}

3 /

60

Dvidas freqentes:
Caso seja executado o cdigo abaixo, p. ex...
new(q); q:=p;{apontarparaoprimeiroelemento dalista}

a) criou-se um elemento, fazendo-se q apontar para ele. p q

3 /

61

Dvidas freqentes:
Caso seja executado o cdigo abaixo, p. ex...
new(q); q:=p;{apontarparaoprimeiroelemento dalista}

a) criou-se um elemento, fazendo-se q apontar para ele. p q b) perdeu-se esse elemento...

3 /

62

Dvidas freqentes:
2) ao encerrar um mdulo, devo desalocar os ponteiros, empregando dispose?

63

Dvidas freqentes:
2) ao encerrar um mdulo, devo desalocar os ponteiros, empregando dispose? No. >> no encerramento do mdulo, todas as variveis locais e parmetros (inclusive ponteiros) so desalocados automaticamente.

64

Dvidas freqentes:
2) ao encerrar um mdulo, devo desalocar os ponteiros, empregando dispose? No. >> no encerramento do mdulo, todas as variveis locais e parmetros (inclusive ponteiros) so desalocados automaticamente. >> ao se utilizar dispose(r), o objeto referenciado por r que ser excludo. No o ponteiro em si.
65

Dvidas freqentes:
3) quando se cria um objeto (comando new) empregando-se um ponteiro, s se pode empregar aquele ponteiro para desalocar aquele objeto?

66

Dvidas freqentes:
3) quando se cria um objeto (comando new) empregando-se um ponteiro, s se pode empregar aquele ponteiro para desalocar aquele objeto? No. >> o n no pertence ao ponteiro que foi empregado na sua criao.

67

Dvidas freqentes:
3) quando se cria um objeto (comando new) empregando-se um ponteiro, s se pode empregar aquele ponteiro para desalocar aquele objeto? No. >> o n no pertence ao ponteiro que foi empregado na sua criao. >> qualquer ponteiro que esteja apontando para certo objeto pode ser usado para a sua desalocao.
68

Dvidas freqentes:
4) ao empregar-se uma varivel local (ponteiro) para alocar um objeto, esse objeto ser tambm local, desaparecendo portanto aps a execuo daquele mdulo?

69

Dvidas freqentes:
4) ao empregar-se uma varivel local (ponteiro) para alocar um objeto, esse objeto ser tambm local, desaparecendo portanto aps a execuo daquele mdulo? No. >> o objeto criado alocado na rea de memria denominada heap (rea prpria para alocao dinmica).

70

Dvidas freqentes:
4) ao empregar-se uma varivel local (ponteiro) para alocar um objeto, esse objeto ser tambm local, desaparecendo portanto aps a execuo daquele mdulo? No. >> o objeto criado alocado na rea de memria denominada heap (rea prpria para alocao dinmica). >> variveis de heap no so nem globais nem locais.
71

Dvidas freqentes:
Atente bem: Variveis globais: seu tempo de vida o intervalo de tempo de execuo do programa.

72

Dvidas freqentes:
Atente bem: Variveis globais: seu tempo de vida o intervalo de tempo de execuo do programa. Variveis locais: seu tempo de vida o intervalo de execuo do mdulo onde foram declaradas.

73

Dvidas freqentes:
Atente bem: Variveis globais: seu tempo de vida o intervalo de tempo de execuo do programa. Variveis locais: seu tempo de vida o intervalo de execuo do mdulo onde foram declaradas. Variveis de heap: seu tempo de vida arbitrrio, dependendo de uma criao (new) e da posterior desalocao.
74

Manuseio de listas encadeadas


Para tratar de forma genrica todas as possveis manipulaes de uma lista encadeada, definido um conjunto de rotinas. Exemplos: inserir/excluir um elemento no incio inserir /excluir um elemento no final inserir /excluir um elemento na ensima posio calcular a soma dos elementos
75

Exemplo: inserir elemento V no final


Duas situaes a se considerar: Lista vazia Lista no vazia

/ p

...

76

Para lista vazia:

Alocao de memria V 5 p

: ... ... ...

77

Para lista vazia:

Alocao de memria V 5 p

: ...? ... ...

criar novo n

78

Para lista vazia:

Alocao de memria V 5 p

: new(p); ... ...

79

Para lista vazia:

Alocao de memria V 5 p

: new(p); ... ...

80

Para lista vazia:

Alocao de memria V 5 p

: new(p); ...? ...

guardar o valor de V

81

Para lista vazia:

Alocao de memria V 5 p

: new(p); p^.Dado:=V; ...

82

Para lista vazia:

Alocao de memria V 5 p

: new(p); p^.Dado:=V; ...

83

Para lista vazia:

Alocao de memria V 5 p

: new(p); p^.Dado:=V; ...?

caracterizar ltimo n 5

84

Para lista vazia:

Alocao de memria V 5 p

: new(p); p^.Dado:=V; p^.Prox:=nil;

85

Para lista vazia:

Alocao de memria V 5 p

: new(p); p^.Dado:=V; p^.Prox:=nil;

5 /

86

Para lista no vazia:

87

Para lista no vazia:

q 1 /

Condio facilitadora: fazer com que um ponteiro auxiliar aponte para o ltimo n...
88

Alocao de memria V 5 p q

:
q:= p;

while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...

3 /

89

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...

3 /

90

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...

3 /

91

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...

3 /

92

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...

3 /

93

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ... ... ... ...

3 /

94

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; ...? ... criar novo n ... ...

3 /

95

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); ... ... ...

3 /

96

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); ... ... ...

3 /

97

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); ...? ... guardar o ... valor de V

3 /

98

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; ... ...

3 /

99

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; ... ...

3 /

100

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; ...? ...

caracterizar ltimo n

3 /

101

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^Prox:=nil; ...

3 /

102

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; ...

3 /

5 /

103

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; ...?

ligar ns

3 /

5 /

104

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;

3 /

5 /

105

Alocao de memria V 5 p q

:
q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;

5 /

106

Juntando as duas situaes...


{lista vazia} new(p); p^.Dado:=V; p^.Prox:=nil;

{lista no vazia} while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;
107

Juntando as duas situaes...


{lista vazia} new(p); p^.Dado:=V; p^.Prox:=nil;

observe as semelhanas...

{lista no vazia} while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;
108

Juntando as duas situaes...


{lista vazia} new(p); p^.Dado:=V; p^.Prox:=nil;

observe as semelhanas...

{lista no vazia} while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;
109

Juntando as duas situaes...


{lista vazia} new(p); p^.Dado:=V; p^.Prox:=nil;

observe as semelhanas...

{lista no vazia} while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;
110

Juntando as duas situaes...


procedure InsereNo(var p: tPtNo; V : tDado); var q,r: tPtNo; begin ... end;

Como existe a possibilidade de p mudar seu contedo, ele passado por referncia.
111

Juntando as duas situaes...


procedure InsereNo(var p: tPtNo; V : tDado); var q,r: tPtNo; begin new(r); r^.Dado:=V; r^.Prox:=nil; if p = nil then p:= r else begin q:= p; while q^.Prox <> nil do q:=q^.Prox; q^.Prox:=r; end; end;

112

Listas duplamente encadeadas


Nas listas duplamente encadeadas, os ns so ligados, no s aos posteriores, mas tambm aos anteriores...

p /

...

/
113

Listas duplamente encadeadas


Nas listas duplamente encadeadas, os ns so ligados, no s aos posteriores, mas tambm aos anteriores... Portanto, a estrutura do n deve possuir 2 ponteiros...
p /

...

/
114

Listas duplamente encadeadas


Nas listas duplamente encadeadas, os ns so ligados, no s aos posteriores, mas tambm aos anteriores... Portanto, a estrutura do n deve possuir 2 ponteiros...
p /

no h n anterior...

...

/
115

Listas duplamente encadeadas


Nas listas duplamente encadeadas, os ns so ligados, no s aos posteriores, mas tambm aos anteriores... Portanto, a estrutura do n deve possuir 2 ponteiros...
p / no h n posterior.. .

no h n anterior...

...

/
116

Listas duplamente encadeadas


Estrutura:
tDado = integer; { ou real, char, etc.} tPtNo = ^tNo; tNo = record Esq: tPtNo Dado: tDado; Dir: tPtNo; end; var p,q: tPtNo;

p /

...

/
117

Listas duplamente encadeadas


Operaes:
Partindo-se das operaes com listas de encadeamento simples, basta fazer alguns ajustes.
necessrio considerar que h dois ponteiros...

p /

...

/
118

Considere a rotina de insero no final para encadeamento simples:


procedure InsereNoFinal(var p:tPtNo; V: tDado); var q,r: tPtNo; begin new(r); r^.Dado:=V; r^.Prox:=nil; if p = nil then p:= r else begin q:= p; while q^.Prox <> nil do q:=q^.Prox; q^.Prox:=r; end; end;

119

...ajustes necessrios:
procedure InsereNoFinal(var p:tPtNo; V: tDado); var q,r: tPtNo; begin new(r); r^.Dado:=V; r^.Dir:=nil; if p = nil then begin p:= r; r^.Esq:= nil; end; else begin q:= p; while q^.Dir <> nil do q:=q^.Dir; q^.Dir:=r; r^.Esq := q; end; end;

120

Exerccios (encadeamento simples e duplo): Construir mdulos que faam as seguintes operaes:
1- Inserir no incio da lista; 2- Excluir o primeiro elemento; 3- Excluir o ltimo elemento; 4- Inserir na ensima posio; 5- Excluir o ensimo n; 6- Fornecer o tamanho da lista 7- Fornecer a soma dos elementos da lista.
121

Orientaes...
1- Sempre pla neje antes de codi fi car . a) faa um esquema visual do problema! -> use lpis e borracha, pois os ponteiros so dinmicos...

122

Orientaes...
1- Sempre pla neje antes de codi fi car . a) faa um esquema visual do problema! -> use lpis e borracha, pois os ponteiros so dinmicos... b) ateno especial list a de parme tros : quais so os parmetros necessrios, seus tipos, mecanismo de passagem (valor ou referncia);
123

Orientaes...
c) procure identificar co ndie s fa ci li tadoras para a soluo de um problema. Por exemplo, para excluir o ensimo n, ser necessrio um ponteiro auxiliar apontando para ele.
p ... q

/
124

Orientaes...
c) procure identificar co ndie s fa ci li tadoras para a soluo de um problema. Por exemplo, para excluir o ensimo n,
...mas isso ser necessrio um ponteiro auxiliar ser suficiente?? apontando para ele. p ... q

/
125

Orientaes...
No. No processo de excluso, p. ex., do n que guarda o valor 8, ser necessrio encadear o anterior com o sucessor...

p ...

/
126

Orientaes...
Portanto a condio facilitadora pede tambm um ponteiro para o n anterior...

p ...

/
127

Orientaes...
Portanto a condio facilitadora pede tambm um ponteiro para o n anterior...

Agora ficou simples... p ... r q

/
128

Orientaes...
...a identificao da condio facilitadora permite a diviso do problema em duas etapas, reduzindo-se a complexidade...

129

Orientaes...
2 - Primeiramente, procure a soluo para o caso mais geral. Depois considere as situaes especiais...

130

Orientaes...
2 - Primeiramente, procure a soluo para o caso mais geral. Depois considere as situaes especiais... Ex: Inserir na ensima posio: raciocinar para lista no vazia e insero no meio da lista. Depois considerar... - e se a lista estiver vazia? - e se a posio for a primeira (ou a ltima)? Quando a soluo geral no funcionar para esses casos, inserir o tratamento especial.
131

Vous aimerez peut-être aussi