Você está na página 1de 5

Operaes

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

ndice > Lista > Generalizada > Operaes

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

Operaes
Definio:
Type pont_no = ^no; no = record cauda: pont_no; case tag: boolean of true: (pont: pont_no); false: (atomo: tipo_elem); End; Lista = pont_no;

Para definir uma implementao para Listas Generalizadas, definimos alguns termos: elemento: um n da lista, normalmente manipulado na forma de um ponteiro para este n: (elem = pont_no), ou alternativamente como o prprio n (elem = no). valor: o contedo de um determinado elemento. o objeto armazenado pela lista individualmente. Ento, valor = tipo_elem. ponteiro externo: um ponteiro que NO elemento de uma lista. ponteiro interno: um ponteiro que faz parte de uma lista, como elemento dela. (isto , armazenado no campo pont).

Operaes usuais em Lista Generalizada


Algumas operaes tpicas de Lista Generalizada so: Obs: retorno das operaes em itlico. cabea (lista,valor) Fornece o valor do primeiro elemento de lista (a cabea). cauda (lista1,lista2) Fornece a lista obtida removendo-se do primeiro elemento de lista (a cabea) isto , o ponteiro para a cauda. primeiro (lista, elem) Retorna o elemento correspondente cabea da lista. info (elem, valor) Retorna o valor correspondente ao elemento elem. prximo (elem, proxElem) Retorna o elemento seguinte ao elemento elem da lista.

1 de 5

25/2/2008 20:06

Operaes

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

tipo_n (elem,tipo) Retorna o tipo do elemento, isto , se ele lista ou tomo. define_cabea (lista, x:no) Substitui a cabea da lista pelo elemento dado por x. insere_incio (lista, x:no, lista1) Insere um elemento no incio da lista, mas no altera a cabea da lista. Retorna um ponteiro para essa 'nova' lista em lista1. define_prximo (elem1, elem2) Substitui o prximo elemento a elem1 por elem2. Como tudo em elem2 fica intacto, essa operao equivalente a trocar todo o restante da lista que contem elem1, a a partir do prximo elemento. define_cauda (l, list1) Define a lista list1 como sendo a cauda da lista l. define_info (elem, valor) Atribui valor ao contedo do elemento elem. vazia (list) Determina se a lista list est vazia inicializa (list) Inicializa list como uma lista vazia. esvazia (list) Torna a lista vazia. Algoritmos Baseados nas Operaes Acima Suponha que se deseja criar as seguintes listas: Lista 1

Lista 2

2 de 5

25/2/2008 20:06

Operaes

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

Qual a sequncia das operaes acima para construo da lista acima? -> Refazer a sequncia de operaes aps definir as operaes, isto , definindo os comandos Pascal para construo da lista. Definio de algumas operaes: supondo implementao sem cabealho Function primeiro (lista:pont_no): pont_no; Begin primeiro:=lista; End; -> Perguntas: Por que, em Pascal, necessrio retornar o ponteiro? Porque razovel contruir a Function primeiro, se ela retorna a prpria lista? Procedure prximo (elem: pont_no; VAR proxElem:pont_no); Begin proxElem:= pont_no^.cauda; End; Procedure info_el (elem:pont_no; Var valor:tipo_elem); Begin if (not elem^.tag) then valor:=elem^.atomo else valor:= valorNulo; End; Procedure info_l (elem:pont_no; Var lista:pont_no); Begin if (elem^.tag) then lista:=elem^.pont else valor:= pontNulo; End; -> Necessidade de determinar um elemento nulo - > usurio -> Se o registro do elemento, na definio do incio da pgina, fosse feita mais adequadamente, seria possvel retornar a informao de um n por uma nica operao, info, que retornaria o contedo (ponteiro ou tomo) e o tipo do contedo. Procedure define_cabea (lista: pont_no; x:no) var p:pont_no; Begin x^.cauda = lista^.cauda; lista^:=x; End; Function insere_incio (lista:pont_no, x:no): pont_no; var p:pont_no; Begin

3 de 5

25/2/2008 20:06

Operaes

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

new(p); p^:=x; p^.cauda := lista; insere_incio := p; End; Procedure define_prximo (elem1, elem2:pont_no); var p:pont_no; Begin p:= elem1^.cauda; elem1^.cauda:=elem2; -> -> O que fazer com a antiga cauda, isto , o resto da lista a partir de elem1? End; Procedure define_cauda (l, list1: pont_no); Begin define_prximo (l,list1); End Procedure define_info (elem: pont_no, valor:no); -> Ateno. Aqui, seria melhor se o objeto da lista estivesse definido como contedo (atomo ou lista+tag) e cauda, em dois campos separados. Begin valor^.cauda = elem^.cauda; elem^:=valor; End; Procedure tipo_n (elem:no): boolean; -> Aqui seria melhor se o tipo do elemento fosse definido por enumerao. Begin tipo_n:= elem^.tag; End; -> Completar a definio das operaes acima -> Fazer as alteraes sugeridas acima para o tipo lista, e re-fazer todas as operaes para o novo tipo. As alteraes sugeridas so: . Usar tipo enumerado, ao invs de boolean, para definir o contedo de um n. . Separar o registro referente a um elemento da lista em dois, um contento o contedo (ou info), que contm tag e valor (seja ele ponteiro ou atomo), e o outro contendo o ponteiro para o prximo (ou cauda). Lembre-se de definir uma nica operao info.

4 de 5

25/2/2008 20:06

Operaes

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

-> Considerar condies de erro, pr-condies e ps-condies das operaes definidas acima. -> Re-fazer as operaes, considerando que lista tem um cabealho. -> Fazer busca -> Extrair o TAD, e implementar as operaes de interface do mesmo. -> Implementar as demais operaes

Exerccios

Listas Generalizadas

5 de 5

25/2/2008 20:06

Você também pode gostar