Você está na página 1de 7

6.

Tcnicas de Encadeamento para listas com alocao dinmica e encadeada As tcnicas de encadeamento fornecem mecanismos para que se possa construir algoritmos mais simples e eficientes para manipular listas ligadas. As tcnicas de encadeamento mais usadas so: - n cabealho - encadeamento circular - encadeamento duplo 6.1 N cabealho Consiste de um n extra mantido sempre na primeira posio da lista encadeada. Este n no usado para arma enar um elemento da lista! tendo como "nico ob#eti$o simplificar os procedimentos de insero e remoo! $e#a %igura &.'.

a' a+ ( %igura &.' ) campo de informao do n cabealho fica sem uso. Este campo pode conter! por exemplo o n"mero de ns da lista. Com o uso de n cabealho! uma lista $a ia tem pelo menos um n. *esta forma uma lista $a ia passa a ter a seguinte representao! $e#a %igura &.+.

( %igura &.+ ,e#amos como esta pequena alterao pode tornar os procedimentos de insero e remoo em listas ordenadas bem mais simples. a- iniciali ar uma lista encadeada usando n cabealho inteiro .niciali ar/(ista0endereo do ponteiro da listainicio

aloca um n1 se a alocao no foi poss2$el ento a funo retorna 3'1 atribui ao campo de ponteiro do no$o n o $alor 45((1 atribui ao endereo da lista o endereo do no$o n1 a funo retorna '1 fim1 b- inserir um no$o elemento em uma lista encadeada ordenada. 6ara fa ermos a comparao $amos escre$er o algoritmo sem usar n cabealho e depois usando n cabealho. b'- insero sem usar n cabealho. 4este caso duas possibilidades tem que ser identificadas: insero na cabea da lista e insero no meio da lista. tipo .nsere/Elem0endereo da lista! elementoinicio aloca um no$o n1 se a alocao no foi poss2$el ento a funo retorna 3'1 insere o elemento no campo de informao do no$o n alocado1 78 o elemento a ser inserido o primeiro da lista ou a lista est9 $a ia 87 se lista $a ia ou elemento menor que o primeiro elemento da lista ento inicio campo de ponteiro do no$o n recebe o endereo do primeiro elemento da lista1 inicio da lista passa a apontar para o no$o n1 fim 78 insere no meio da lista 87 seno inicio atribui a pos o inicio da lista1 enquanto o n que sucede pos for diferente de 45(( e elemento for maior que campo de informao do n que sucede pos faa pos passar a apontar para o seu sucessor1 fim do enquanto1 o campo de ponteiro do no$o n passa a apontar para o sucessor de pos1 o campo de ponteiro de pos passa a apontar para o no$o n1 fim1 a funo retorna '1 fim1 b+- .nsero usando n cabealho tipo .nsere/Elem0endereo da lista! elemento-

inicio aloca um no$o n1 se a alocao no foi poss2$el ento a funo retorna 3'1 insere o elemento no campo de informao do no$o n alocado1 78 o elemento ser9 inserido sempre no meio da lista87 atribui a pos o inicio da lista1 enquanto o n que sucede pos for diferente de 45(( e elemento for maior que campo de informao do n que sucede pos faa pos passar a apontar para o seu sucessor1 fim do enquanto1 o campo de ponteiro do no$o n passa a apontar para o sucessor de pos1 o campo de ponteiro de pos passa a apontar para o no$o n1 a funo retorna '1 fim1 c- :emoo de um elemento de lista c'- sem usar n cabealho: neste caso de$e ser considerada a remoo no inicio e meio da lista separadamente. tipo :emo$e/Elemento0endereo do endereo da lista! elementoinicio se lista $a ia ou elemento menor que o primeiro elemento da lista ento a funo retorna 3'1 seno se elemento for igual ao primeiro elemento da lista ento inicio atribui ao ponteiro pos o primeiro n da lista1 o primeiro elemento da lista passa a ser o n apontado pelo sucessor de pos1 libera n apontado por pos1 a funo retorna '1 fim seno inicio atribui ao ponteiro pos o inicio da lista1 enquanto o sucessor de pos for diferente de 45(( e elemento for maior que o campo de informao do sucessor de pos faa pos passa a apontar para o seu sucessor1 fim do enquanto1 se sucessor de pos for diferente de 45(( e elemento igual ao $alor do campo info do sucessor de pos ento inicio atribui ao ponteiro p o sucessor de pos1 o campo ponteiro de pos passa a apontar para o sucessor de p1

libera o n apontado por p1 a funo retorna '1 fim seno a funo retorna 3' fim fim c+- remoo de um elemento de uma lista ordenada usando n cabealho tipo :emo$e/Elemento0ponteiro da lista! elementoinicio atribui ao ponteiro pos o inicio da lista1 enquanto o sucessor de pos for diferente de 45(( e elemento for maior que o campo de informao do sucessor de pos faa pos passa a apontar para o seu sucessor1 fim do enquanto1 se sucessor de pos for diferente de 45(( e elemento igual ao $alor do campo informao do sucessor de pos ento inicio atribui ao ponteiro p o sucessor de pos1 o campo ponteiro de pos passa a apontar para o sucessor de p1 libera o n apontado por p1 a funo retorna '1 fim seno a funo retorna 3' fim

6.2 Encadeamento circular 4uma lista com encadeamento circular! o campo de ponteiro do "ltimo n da lista passa a apontar para o primeiro n da lista. Como o endereo do primeiro n da lista pode ser facilmente obtido a partir do campo de ponteiro do "ltimo n da lista! a $ari9$el ponteiro para uma lista circular guarda o endereo do "ltimo n da lista! $e#a %igura &.;. ( a' a+ a;

%igura &.; 3 lista circular

Esta tcnica de encadeamento muito "til quando se dese#a inserir no final da lista e remo$er da cabea da lista. 5ma lista circular $a ia se o ponteiro para a lista 45(( 5ma lista circular com apenas um elemento tem a estrutura apresentada na %igura &.< ( a;

%igura &.< 3 lista circular com apenas um elemento Como exemplo $amos escre$er um algoritmo que insere um elemento no fim de uma lista circular e remove um elemento do inicio da lista. tipo .nsere/Elem0 endereo da lista! elementoinicio aloca um no$o n1 se no foi poss2$el alocar um no$o n ento a funo retorna 3'1 campo de informao recebe o elemento1 se a lista $a ia ento inicio a $ari9$el que aponta para o inicio da lista passa a apontar para o no$o n1 campo de ponteiro do no$o n passa a apontar para ele mesmo1 fim1 seno inicio o campo de ponteiro do no$o n aponta para quem o campo ponteiro do inicio da lista aponta1 o campo de ponteiro do inicio da lista passa a apontar para o no$o n1 a $ari9$el que aponta para o inicio da lista passa a apontar para o no$o n1 fim a funo retorna o $alor '1 fim1

tipo :emo$e/Elem0 endereo da listainicio se lista $a ia a funo retorna o $alor 3'1 atribui a pos o n apontado pelo campo de ponteiro da $ari9$el que indica inicio de lista1 atribui ao campo ponteiro da $ari9$el que indica inicio de lista o campo ponteiro de pos1 libera o n apontado por pos1 a funo retorna o $alor '1 fim1 4ota: 5ma lista circular pode manter um n cabealho. 4este caso a facilidade de inserir no final perdida. 6.3 Encadeamento duplo 4uma lista com encadeamento duplo cada n tem dois campos de ponteiro! sendo que um deles aponta para o n antecessor e o outro aponta para o sucessor de um dado n. 5m exemplo dado na %igura &.= (

%igura &.=- lista duplamente encadeada As listas duplamente encadeadas podem ser lineares ou circulares e podem conter ou no um n cabealho! $e#a as %iguras &.& e &.>. (

%igura &.& 3 lista circular duplamente encadeada (

cabealho %igura &.> 3 lista circular duplamente encadeada com cabealho

) encadeamento duplo requer mais memria! no entanto apresenta a $antagem de tornar a implementao das fun?es b9sicas sobre listas mais f9ceis e elegantes.