gpt4 book ai didi

c - C中双链表交换节点

转载 作者:行者123 更新时间:2023-11-30 14:59:04 26 4
gpt4 key购买 nike

我正在尝试在 C 中交换双链表中的节点。

我的列表如下:M4,M3,M2,M1。我有一个计算列表维度的函数,它正确地将其读取为 4。

当我尝试将 M3 与 M2 交换时,一切都崩溃了。(希望遍历后得到:M4,M2,M3,M1。)

我在 main 中使用以下行:(prim 是第一个节点,M4)

swap_nodes1(prim->pNext, prim->pNext->pNext);

下面的代码作为我的交换函数。 (注意:我仍然需要涵盖将头部与另一个节点交换或将尾部与另一个节点交换时的情况,但我想首先交换一些随机的中间位置节点。)

void swap_nodes1(pNODE object1, pNODE object2)
{
pNODE temp1,temp2;
temp1->pPrec=object1->pPrec;
temp1->pNext=object1->pNext;

object1->pPrec=object2->pPrec;
object1->pNext=object2->pNext;
object2->pPrec=temp1->pPrec;
object2->pNext=temp1->pNext;

free(temp1);
}

当我第二次遍历列表时,我得到:M4,M3,M1。而且列表的暗淡现在是 3 而不是 4,M2 神奇地消失了。

任何人都可以向我解释为什么我会得到这个以及我做错了什么吗?

提前谢谢您。

最佳答案

如果你把它画在纸上并以这种方式进行研究,这会容易得多。

假设object1和object2不为NULL。

您需要考虑要交换的两个节点之前和之后的节点。两个交换节点之前的节点现在需要指向 object2 而不是 object1(假设该节点存在)。并且您需要使 object2 的前置现在指向两个交换节点之前的节点。

if ( object1->pPrec != NULL )
object1->pPrec->pNext = object2;
object2->pPrec = object1->pPrec;

并且您需要使 object1 的 next 指向两个交换节点之后的节点,并且该节点需要指向 object1(如果存在)。

object1->pNext = object2->pNext;
if ( object2->pNext != NULL )
object2->pNext->pPrec = object1;

然后object1需要指向object2,object2需要向前指向object1。

object1->pPrec = object2;
object2->pNext = object1;

关于c - C中双链表交换节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43021922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com