交换C

时间:2017-03-25 21:03:10

标签: c nodes swap doubly-linked-list

我正在尝试交换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神奇地消失了。

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

提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

假设object1和object2不是NULL。

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

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

你需要在两个交换节点之后将对象1的下一个点指向节点,并且该节点需要指向object1(如果存在)。

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

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

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

答案 1 :(得分:0)

问题陈述没有指定指向列表的第一个节点(M4)的内容,或者是否有指向列表的最后一个节点(M1)的指针。如果列表是循环的,它不会说明,所以我认为它不是循环的。

当交换列表中的节点时,如果要交换的节点是相邻的(这是示例情况,M3和M2),则指针需要"旋转"。如果要交换的节点不相邻,则需要交换指针。通过先交换指向两个节点的内容,然后交换两个节点指针,可以对两种情况使用相同的逻辑。

使用指向节点的指针将简化逻辑。