Professional Documents
Culture Documents
ED 06 Listas Encadeadas
Prof. Dr. Marcelo Duduchi
Conforme j vimos, uma lista uma coleo de elementos do mesmo tipo dispostos linearmente que podem ou no seguir uma determinada organizao. Exemplo: [E1, E2, E3, E4, E5, ..., En], onde n deve ser > = 0; At aqui usamos alocao seqencial para implement-las mas a partir de agora usaremos a alocao encadeada.
Listas Encadeadas
Listas encadeadas so listas lineares em que os elementos no necessariamente encontram-se dispostos numa rea continua de memria; Como no se encontram numa rea continua de memria necessrio ter alguma forma de relacion-los entre s; A forma utilizada para relacion-los incluir em cada elemento, alm do valor armazenado uma referncia de onde est o prximo elemento da lista;
data
link
Lista encadeada
auto referncia
lista
new(lista); lista^.data = C; new(lista^.link); lista^.link.^data = A; new(aux); aux^.data = D; new(aux^.link); aux^.link^.data = E; aux^.link^.link = nil; lista^.link^.link = aux;
new(lista); lista^.data = C; new(lista^.link); lista^.link.^data = A; new(aux); aux^.data = D; new(aux^.link); aux^.link^.data = E; aux^.link^.link = nil; lista^.link^.link = aux;
new(lista); lista^.data = C; new(lista^.link); lista^.link.^data = A; new(aux); aux^.data = D; new(aux^.link); aux^.link^.data = E; aux^.link^.link = nil; lista^.link^.link = aux;
new(lista); lista^.data = C; new(lista^.link); lista^.link.^data = A; new(aux); aux^.data = D; new(aux^.link); aux^.link^.data = E; aux^.link^.link = nil; lista^.link^.link = aux;
new(lista); lista^.data = C; new(lista^.link); lista^.link.^data = A; new(aux); aux^.data = D; new(aux^.link); aux^.link^.data = E; aux^.link^.link = nil; lista^.link^.link = aux;
new(lista); lista^.data = C; new(lista^.link); lista^.link.^data = A; new(aux); aux^.data = D; new(aux^.link); aux^.link^.data = E; aux^.link^.link = nil; lista^.link^.link = aux;
new(lista); lista^.data = C; new(lista^.link); lista^.link.^data = A; new(aux); aux^.data = D; new(aux^.link); aux^.link^.data = E; aux^.link^.link = nil; lista^.link^.link = aux;
new(lista); lista^.data = C; new(lista^.link); lista^.link.^data = A; new(aux); aux^.data = D; new(aux^.link); aux^.link^.data = E; aux^.link^.link = nil; lista^.link^.link = aux;
new(lista); lista^.data = C; new(lista^.link); lista^.link.^data = A; new(aux); aux^.data = D; new(aux^.link); aux^.link^.data = E; aux^.link^.link = nil; lista^.link^.link = aux;
new(lista); lista^.data = C; new(lista^.link); lista^.link.^data = A; new(aux); aux^.data = D; new(aux^.link); aux^.link^.data = E; aux^.link^.link = nil; lista^.link^.link = aux;
Referncia auxiliar aux2
// coloca referncia da lista no link // do novo nodo
lista
aux2^.data = G;
// coloca G no data do novo nodo
aux2^.data = G;
// coloca G no data do novo nodo
aux2^.link = lista;
// coloca referncia da lista no link // do novo nodo
aux2
aux2^.link = lista;
// coloca referncia da lista no link // do novo nodo
lista
// faz lista referenciar o novo nodo G
lista = aux2;
lista = aux2;
// faz lista referenciar o novo nodo
new(aux2);
// cria na referncia aux2 o novo nodo
aux2^.data = G;
// coloca G no data do novo nodo
aux2^.data = G;
// coloca G no data do novo nodo
aux2^.link = lista;
// coloca referncia da lista no link // do novo nodo
aux2^.link = lista;
// coloca referncia da lista no link // do novo nodo
lista = aux2;
// faz lista referenciar o novo nodo
lista
G
lista = aux2;
// faz lista referenciar o novo nodo
aux2^.data = G;
// coloca G no data do novo nodo
lista
G C C A D E A D E
while(aux3<>nil) begin
// enquanto no chegar a nulo
writeln(aux3^.data);
// mostra o data
// mostra o data
lista
aux3=aux3^.link end;
lista
aux3=aux3^.link
// vai para o prximo aux3
end;
aux3 diferente de // referencia o inicio da lista em aux3 while(aux3<>nil) begin nulo ento entrar // enquanto no chegar a nulo no loop... writeln(aux3^.data);
// mostra o data Referncia auxiliar aux3
while(aux3<>nil) begin
// enquanto no chegar a nulo
writeln(aux3^.data);
// mostra o data
aux3=aux3^.link
// vai para o prximo
aux3=aux3^.link
// vai para o prximo
lista
end;
lista
aux3
end;
writeln(aux3^.data); writeln(aux3^.data);
// mostra o data // mostra o data
lista
Referncia auxiliar // vai para o prximo aux3 // vai para o prximo aux3
aux3=aux3^.link
Vai para o prximo // referencia o inicio da lista em aux3 while(aux3<>nil) begin referenciando a // enquanto no chegar a nulo rea onde est o writeln(aux3^.data); valor D...
// mostra o data Referncia auxiliar // vai para o prximo aux3
Como o link3 no // referencia o inicio da lista em aux3 while(aux3<>nil) begin nulo continua o // enquanto no chegar a nulo loop mostrando o writeln(aux3^.data); valor D...
// mostra o data Referncia auxiliar
aux3=aux3^.link end;
lista
aux3=aux3^.link
// vai para o prximo aux3
lista
end;
Vai para o prximo // referencia o inicio da lista em aux3 while(aux3<>nil) begin referenciando a // enquanto no chegar a nulo rea onde est o writeln(aux3^.data); valor E...
// mostra o data Referncia auxiliar aux3
Como o aux3 no // referencia o inicio da lista em aux3 nulo o loop no while(aux3<>nil) begin // enquanto no chegar a nulo encerrado e o valor writeln(aux3^.data); E mostrado...
// mostra o data Referncia auxiliar
aux3=aux3^.link
// vai para o prximo
aux3=aux3^.link
// vai para o prximo
lista
end;
lista
aux3
end;
writeln(aux3^.data);
// mostra o data
lista
aux3=aux3^.link end;
Exerccio 1
Implemente as outras rotinas da pilha usando alocao dinmica encadeada. Lembre-se que a rotina create s coloca nil no topo e a rotina destroy percorre a lista retirando os elementos. A top bem parecida com a pop s que no retira nenhum elemento.
Exerccio 2
Implemente uma fila usando alocao dinmica. Lembre-se que a fila ter dois ponteiros (front e rear). O front aponta para o primeiro da lista e o rear aponta para o ltimo. Cuidado com os detalhes de implementao. Ao incluir o 1 elemento deve-se fazer front e rear apontarem para ele e ao excluir o ltimo elemento deve-se apontar front e rear para nil
Tcnicas de Encadeamento
Conheceremos agora algumas tcnicas de encadeamento:
Lista circular; Lista duplamente encaminhada; Lista com nodos sentinelas;
Referncia inicial
C A D E
link
data
link
Nodos sentinelas
Os nodos sentinelas so nodos que ficam no incio e final da lista para que todas as operaes sejam realizadas entre os elementos da lista evitando manipulaes nas extremidades.
No incio coloca-se um valor menor que todos (Low-value ou LV) No final um valor maior que todos (high-value ou HV): lista
LV
HV