我正在实施霍夫曼的算法,为此我使用了一个双向链表。实现需要对列表进行排序,但简单地交换数据还不够 - 我需要交换整个节点。然而,事实证明这比我预期的要复杂一些。
我使用了这种选择排序的变体,但它会导致访问冲突错误。我假设它是因为我试图访问一些空指针,这两个条件应该阻止。
任何帮助或建议都将不胜感激。
void sortiraj()
{
Node *curr = top, *nxt;
for (int i = 0; i < num - 1; ++i)
{
nxt = curr->next;
for (int j = i + 1; j < num; ++j)
{
if (curr->prob > nxt->prob)
{
//swap prev
if (curr != top)
{
Node *temp_prev = curr->prev;
curr->prev = nxt->prev;
nxt->prev = temp_prev;
}
//swap next
if (nxt != last)
{
Node *temp_next = curr->next;
curr->next = nxt->next;
nxt->next = temp_next;
}
}
nxt = nxt->next;
}
curr = curr->next;
}
}
答案 0 :(得分:2)
如果当前节点是TOP节点,则仍需要交换先前的指针。这是因为你需要指出新顶部的“previous pointer”设置为NULL,而旧顶部的“previous指针”设置为新顶部。
“下一个指针”也是如此。
您不需要条件来交换上一个和下一个标志。您需要条件来指示顶部和最后一个节点已更改。
此外,在交换时,您不能只交换先前的指针。这是因为,这意味着他们中的一个将指向自己。正确的方法就是这样
nxt->prev = curr->prev;
curr->prev = nxt;
交换下一个指针时同样适用。