Programação
MEAer
Bertinho Andrade da Costa
2011/2012
1º Semestre
Instituto Superior Técnico
Noções de listas e anéis duplamente ligados
Programação 2011/2012 DEEC-IST
Noções de listas e anéis duplamente ligados
1
Sumário
Lista dinâmica duplamente ligada
Anel duplamente ligado
Anel duplamente ligado com registo separado para a
base.
Operações:
Inserção (ordenada)
Procura
Remoção
Listar elementos
Programação 2011/2012 DEEC-IST
Noções de listas e anéis duplamente ligados
2
Lista simples com registo separado para a base
Motivação:
No código para a manipulação de uma lista simplesmente ligada, é necessário alterar o
contéudo do apontador base. Como essa alteração tem que ser feita por funções é então
necessário passar a variável da base por referência, ou em alternativa retornar o novo
valor para a base.
Para evitar passar a base por referência (reduzindo a complexidade das funções) podese criar um registo ligado à base mas que não é utilizado para armazenar dados úteis. A
inserção e eliminação de registos ocorre sempre a seguir ao registo que não é utilizado
(separado). Desta forma deixa de ser necessário passar a variável base por referência
ou retornar o novo valor da base.
O registo separado pode ser utilizado para guardar dados quando se efectua uma
operação de procurar ou de insercção.
Alterações ao código:
Na função inicializa base, deve ser alocado o registo e deve ser inicializado.
As restantes funções devem ser adaptadas tendo presente a finalidade do registo
separado para a base, que não é utilizado para armazenar dados de forma
permanente.
base
Programação 2011/2012 DEEC-IST
Registo vazio
W6
M7
endereço
endereço
NULL
Noções de listas e anéis duplamente ligados
3
Lista simples com registo separado para a base
Utilização:
A utilização de uma lista simplesmente ligada com um registo separado para a base
permite que alista seja manipulada, inserção e remoção de registos passando a
base por valor.
Quando se pretende inserir um novo elemento, é necessário efectuar uma procura.
A determinação do local de inserção e a operação de inserção são realizadas
utilizando dois apontadores (o actual e o anterior).
A variável actual é utilizada para determinar o local de inserção de um novo
elemento na lista. Ela é utilizada para aceder a um campo de modo a ser realizada
uma comparação.
anterior
base
actual
Registo vazio
W6
D 11
C 15
endereço
endereço
endereço
NULL
Programação 2011/2012 DEEC-IST
Noções de listas e anéis duplamente ligados
4
Lista simples com registo separado para a base
Procurar:
A comparação determina o fim da procura.
while ((actual != NULL) && (novo->campo > actual->campo)) {
anterior = actual;
actual = actual->prox;
}
novo
Z7
endereço
anterior
base
Registo vazio ...
endereço
Programação 2011/2012 DEEC-IST
actual
W6
D 11
C 15
endereço
endereço
NULL
Noções de listas e anéis duplamente ligados
5
Lista simples com registo separado para a base
Inserir:
A inserção deve ser realizada entre os registos que são apontados pelas
variáveis anterior e actual. A variável anterior é que permite que
se realize a ligação (lógica entre os elementos) com inserção ordenada.
Note-se que a variável actual pode assumir o valor de NULL, quando chega
ao fim da lista.
A inserção é realizada através das acções: novo->prox = actual;
anterior->prox = novo;
novo
Z7
endereço
anterior
base
Registo vazio ...
endereço
Programação 2011/2012 DEEC-IST
actual
W6
D 11
C 15
endereço
endereço
NULL
Noções de listas e anéis duplamente ligados
6
Lista dupla. ligada com reg. sep. para a base
Motivação
Uma lista duplamente ligada é constituida por elementos cuja estrutura de
suporte tem duas variáveis apontadoras que são utilizadas para efectuar
as ligações lógicas entre elementos adjacentes da lista, como se
apresenta na figura seguinte.
Vantagem na utilização de uma lista duplamente ligada:
Permite simplificar o código de inserção e a eliminação de elementos numa lista.
Desvantagem:
base
Uma lista duplamente ligada necessita mais memória do que uma lista simplesmente
ligada.
Registo vazio
NULL
Programação 2011/2012 DEEC-IST
End. prox
End. ant
C6
End. prox
End. ant
Noções de listas e anéis duplamente ligados
R8
End. prox
End. ant
NULL
7
Lista dupla. ligada com reg. sep. para a base
Inserção:
Dependendo do algoritmo de ordenação, a inserção de um elemento pode ser
realizada:
atrás do elemento que está a ser apontador pela variável actual.
à frente do elemento que está a ser apontador pela variável actual.
novo
B5
End. prox
End. ant
actual
base
NULL
Programação 2011/2012 DEEC-IST
Registo vazio
End. prox
End. ant
C6
End. prox
End. ant
Noções de listas e anéis duplamente ligados
R8
End. prox
End. ant
NULL
8
Lista dupla. ligada com reg. sep. para a base
Inserção atrás do elemento que está a ser apontador pela variável actual
novo->prox = actual;
novo->anterior = actual->anterior;
(actual->anterior)->prox = novo;
actual->anterior = novo;
novo
B5
End. prox
End. ant
actual
base
NULL
Programação 2011/2012 DEEC-IST
Registo vazio
End. prox
End. ant
C6
End. prox
End. ant
Noções de listas e anéis duplamente ligados
R8
End. prox
End. ant
NULL
9
Lista dupla. ligada com reg. sep. para a base
Inserção à frente do elemento que está a ser apontador pela variável actual
novo->prox = actual->prox;
novo->anterior = actual;
(actual->prox)->anterior = novo;
actual->prox = novo;
novo
B5
End. prox
End. ant
actual
base
NULL
Programação 2011/2012 DEEC-IST
Registo vazio
End. prox
End. ant
C6
End. prox
End. ant
Noções de listas e anéis duplamente ligados
R8
End. prox
End. ant
NULL
10
Lista dupla. ligada com reg. sep. para a base
Eliminação de um registo que está a ser apontador pela variável eli_actual
(eli_actual->ant)->prox = eli_actual->prox;
(eli_actual->prox)->ant = eli_actual->ant;
eli_actual
base
Registo vazio
NULL
Programação 2011/2012 DEEC-IST
End. prox
End. ant
C6
End. prox
End. ant
Noções de listas e anéis duplamente ligados
R8
End. prox
End. ant
NULL
11
Anel duplamente ligado
Numa lista (simplesmente ou ) duplamente ligada não é possível passar
do último elemento da lista para o primeiro elemento da lista utilizando a
informação que está guarda no apontador (prox) do último elemento, já
que o seu valor é NULL.
É sempre necessário verificar se se chegou ao fim da lista, através do
teste do valor de um apontador com o valor NULL.
Mas nada impede que se efectue as ligações lógicas que estão indicadas
na figura numa lista (simplesmente ou) duplamente ligada. Neste caso
passamos a ter um anel (simplesmente ou) duplamente ligado.
base
Registo vazio
End. prox
End. ant
Programação 2011/2012 DEEC-IST
C6
End. prox
End. ant
Noções de listas e anéis duplamente ligados
R8
End. prox
End. ant
12
Anel duplamente ligado
Vantagens:
Deixa de existir o perigo de sair fora da lista, já que está na forma
de anel.
Deixam de existir casos especiais para a inserção e a remoção de
registos.
O registo separado para a base pode ser utilizado como sendo uma
variável auxiliar para guardar a informação que se pretende
procurar no anel.
base
Registo vazio
End. prox
End. ant
Programação 2011/2012 DEEC-IST
C6
End. prox
End. ant
Noções de listas e anéis duplamente ligados
R8
End. prox
End. ant
13
Anel duplamente ligado
No desenvolvimento de um programa, utilização de um determinado
tipo de lista deve ser ponderando tendo por base a simplicidade do
código e a memória necessária para a implementação da lista.
NOTAS:
Modifique o programa dos acetatos da aula anterior (lista simplesmente ligada)
de modo a incluir um registo separado para a base. Isto perimite simplificar as
funções.
Posteriormente pode abordar o problema utilizando um anel,
Programação 2011/2012 DEEC-IST
Noções de listas e anéis duplamente ligados
14
Programação 2011/2012 DEEC-IST
Noções de listas e anéis duplamente ligados
15