交换链表中的节点?

时间:2018-05-26 11:52:23

标签: c list struct linked-list

我编写此函数是为了交换链表中的2个节点,但结果是分段错误。你能检查一下吗?谢谢。 (我为结构学生做了typedef *作为平底船)

void swap_node(punt node1, punt node2)
{

 node1->next=node2->next;
 node2->next=node1;
 node2->prev=node1->prev;
 node1->prev=node2;
 (node2->prev)->next=node2;

}

3 个答案:

答案 0 :(得分:0)

我想这就足够了,基本上与你的代码唯一不同的是最后一个语句(为简单起见,不包括空值检查):

event

答案 1 :(得分:0)

如果可能,仅通过交换内容就可以更容易地交换两个节点。结果是一样的。如果你的代码中的其他地方有一个指向你交换的节点之一的指针并且仍然期望它是同一个节点,那么这就会产生问题。

无论如何,回到你的代码。有一些事情需要改进。首先,我们需要检查node1node2是否为空,如果它们不是我们可以继续,否则退出该函数,因为我们无法交换它。交换代码的前4行是正常的,但这里有两个问题:

  • node1之前(交换之前)的节点可能为null,因此访问next指向node2的指针会导致未定义的行为,并且可能崩溃。检查它是否存在,然后执行分配。
  • 您忘记检查node2之后是否存在节点(在交换之前),如果是,请将其prev指针指向node1

答案 2 :(得分:0)

通常有助于在双向链表中可视化链接,只需将其绘制在一张纸上即可。您会注意到每个节点有4个链接:

node->next
node->next->prev
node->prev
node->prev->next

因此,要交换两个不相关的节点,您需要交换 4个链接。

以下内容不起作用:

node1->next=node2->next;

这会覆盖旧值node1-> next。您需要使用临时变量。像这样:

#define SWAP_PTR(a,b) { void* tmp = b; b = a; a = tmp; }

void swap_node(punt node1, punt node2)
{
  SWAP_PTR(node1->next, node2->next);
  SWAP_PTR(node1->next->prev, node2->next->prev);
  SWAP_PTR(node1->prev, node2->prev);
  SWAP_PTR(node1->prev->next, node2->prev->next);
}

注意 - 在线程环境中,您需要某种形式的锁定。