我正在尝试交换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神奇地消失了。
任何人都可以向我解释为什么我会得到这个以及我做错了什么?
提前谢谢。
答案 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),则指针需要"旋转"。如果要交换的节点不相邻,则需要交换指针。通过先交换指向两个节点的内容,然后交换两个节点指针,可以对两种情况使用相同的逻辑。
使用指向节点的指针将简化逻辑。