•
Operações getnode( ) e freenode( )
•
Implementação ligada de filas
•
Idealmente
, não existe limitação para o número de nós
disponíveis para uma lista (
memória infinita
)
– Para atribuir endereço a um novo nó, empregar a função getnode
– Não havendo limitação de espaço, não há necessidade de destruir um nó após seu uso. A função freenode perde sua necessidade
•
Em uma
implementação prática
, existe a
limitação de
armazenamento
imposta pela memória física do computador
– A operação freenode libera o nó de seu contexto atual para a
reutilização em outro contexto
•
Pode‐se alocar na memória um número máximo de nós
– Essa lista de nós vazios é chamada de lista livre
– getnode remove o primeiro nó da lista da lista livre e o torna disponível para uso no programa principal
•
Se a lista livre
vazia
– Todos os nós estão atualmente alocados
– Impossibilidade de chamar getnode( ) Estouro – Situação análoga a uma pilha ultrapassando o limite do vetor • Deseja‐se inserir mais um dado, mas não há espaço na memória
Operações getnode
e freenode
Lista livre avail Contexto atualgetnode( )
info next•
Operação
getnode()
(conceito)
•
Operação
freenode()
(conceito)
Operações getnode
e freenode
// Operação getnode
p = getnode(); // Obtém um nó da lista livre
// Implementação da função
if (avail == null) { // Testa estouro da lista livre
printf(“Estouro”); exit(1);
}
p = avail; // Define “p” para 1º nó de “avail”
avail = next(avail); // Retira 1º nó da lista livre
// Operação freenode
next(p) = avail; // Campo next de “p” recebe “avail”
•
Filas
– rear Ponteiro para o final da fila (entrada de dados) • Endereço do final: q.rear
– front Ponteiro para o início da fila (saída de dados) • Endereço do início: q.front
•
Implementação de fila em
lista ligada
– Requer o emprego de dois ponteiros•
Operação
insert(q, x)
1) Obter um nó vazio e definir o conteúdo de uma variável p com o endereço desse nó
• Assim, p será o ponteiro para o nó recém‐alocado
3) Definir next do nó recém‐alocado
• Deseja‐se inserir o dado x no final da fila (rear) • Logo, não há nó seguinte
•
Operação
insert(q,x)
(conceito)Implementação ligada de filas
// Operação insert(q,x)
p = getnode(); // Obtém um nó “p” da lista livre
info(p) = x; // Grava dado no campo info de “p”
next(p) = null; // Define “p” como o último nó
if (q.rear == null) // Fila circular (testa o final
q.front = p; // atual) e redefine o endereço do
else // atual último elemento da fila,
next(q.rear) = p; // que passará a ser o penúltimo
•
Operação
remove(q)
(conceito)Implementação ligada de filas
// Operação remove(q)
if (empty(q)) { // Verifica se a pilha está vazia
printf(“Underflow na fila”); exit(1);
}
p = q.front; // Obtém endereço da início da fila
x = info(p); // Obtém dado do início da fila
q.front = next(p); // Redefine o início da fila
if (q.front == null) // Teste de fila vazia
q.rear = null; // Define final=início (fila vazia)
freenode(p); // Libera nó “p” para a lista vazia
•
Observações
– Desvantagens
• O nó de uma lista ocupa mais espaço de armazenamento do que um elemento correspondente de um vetor
• Cada inclusão/eliminação de um elemento de uma pilha ou fila
requer a eliminação/inclusão de um nó na lista livre