Académique Documents
Professionnel Documents
Culture Documents
http://www.icmc.usp.br/~sce182/ldinam.html
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 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;
{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^
p p^ p^.info p^.lig
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 (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]).
Exerccios / Exemplo
ndice
3 de 3
25/2/2008 19:40