Vous êtes sur la page 1sur 3

Lista Dinamica

http://www.icmc.usp.br/~sce182/ldinam.html

ndice > Lista > Dinmica

Instituto de Cincias Matemticas de So Carlos Departamento de Computao e Estatstica SCE182 - Algoritmos e Estruturas de Dados 1 Profs. Resp.: Graa Pimentel, Maria Cristina e Rosane

Lista Dinmica
Conceitos de Ponteiro e implementao de Ponteiros em Pascal
As linguagens de programao modernas tornaram possvel explicitar no apenas o acesso aos dados, mas tambm aos endereos desses dados. Isso significa que ficou possvel a utilizao de ponteiros explicitamente. Assim, existe um distino de notao entre um dado e a sua referncia (ou endereo). A notao introduzida por Wirth, com a introduo de Pascal, :
type T = meu_tipo; . . . Type Tp = ^T

Essa declarao expressa que valores do tipo Tp so ponteiros para dados do tipo T. Ele armazena um endereo de memria. Esse endereo deve ser a posio de incio do armazenamento de um dado do tipo T. Portanto, lemos o simbolo ^ como sendo ponteiro para... , e na declarao acima lemos 'Tp um ponteiro para variveis do tipo T'. O fato de que o tipo dos elementos apontados ser evidente na declarao do ponteiro tem importncia fundamental. Isso distingue ponteiros de linguagens de alto nvel de endereos em Assembly. Valores para ponteiros so gerados quando dados correspondentes a seus tipos so alocados/desalocados dinamicamente. Em Pascal, os procedimentos dispose existem com esse propsito. Portanto, deixa-se a cargo do programa (via linguagem de programao), e no do programador, prover e devolver espao para inseres e eliminaes em tempo de execuo (Veja algumas operaes em lista utilizando ponteiros). Custo: Tempo de execuo comprometido. Idia: O programador declara apenas o tipo de registro que contm um elemento da lista, e avisa que a alocao ser dinmica. Sempre que requisitar um registro novo para a insero, ou liberar um registro a ser eliminado, o programador lana mo de duas rotinas pr-definidas para este fim.

1) Registros com ponteiros


Dizemos que uma varivel do tipo prec aponta para, ou um ponteiro para um registro do tipo rec . Ponteiro o nico tipo que pr-referencia outro em Pascal.
Type prec = ^rec;

1 de 3

25/2/2008 19:40

Lista Dinamica

http://www.icmc.usp.br/~sce182/ldinam.html

Lista = prec; rec = record info: T; lig: Lista; End; Var p, L: Lista;

{seu tipo preferido}

{nossos ponteiros }

Um ponteiro do tipo Lista pode assumir o conjunto de valores que correspondem a endereos reais de memria. Por exemplo, sendo var p: Lista podemos ter:

onde o contedo de p corresponderia ao endereo do objeto. Esses endereos sero as ligaes das listas encadeadas dinmicas. Sendo o registro: O acesso ao registro depende do tipo da alocao. Se compararmos alocao em array com alocao dinmica com ponteiros, temos que para acessar o contedo de uma varivel fazemos:
alocao array L.A[p] alocao dinmica p^

Para designar ponteiro, objeto e campos, a notao utilizada :

ponteiro: objeto: campos:

p p^ p^.info p^.lig

2) Endereo nulo (terra)


Pascal prov uma constante pr-definida para denotar o endereo nulo nil. Podemos utiliz-la para atribuies e testes, como nos exemplos abaixo:
1: 2: L := nil; If (p = nil) Then ...

Ponteiro x Objeto Apontado Nos exemplos abaixo, ilustrada a diferena entre as operaes de atribuio entre ponteiros (por exemplo, p : = q ) e a atribuio entre o contedo dos registros apontados pelos ponteiros (isto : p^ : = q^).
var p,q: Lista;

Dada a situao abaixo, chamada de (a):

Dada a situao (a), aps a atribuio p : = q temos a representao abaixo (b). Esta atribuio s vlida para ponteiros do mesmo tipo e a nica operao entre ponteiros.

2 de 3

25/2/2008 19:40

Lista Dinamica

http://www.icmc.usp.br/~sce182/ldinam.html

Dada a situao (a), aps a atribuio p^ : = q^ temos a representao abaixo (c), onde o contedo atribuido (lembre que p^ equivale a L.A[p]).

Manipulao de Registros em Listas Encadeadas Dinmicas Operaes em Listas Encadeadas Dinmicas

Exerccios / Exemplo

ndice

3 de 3

25/2/2008 19:40

Vous aimerez peut-être aussi