gpt4 book ai didi

c++ - 在双向链表中使用指针交换节点

转载 作者:行者123 更新时间:2023-11-28 06:17:41 24 4
gpt4 key购买 nike

这是我的代码,它只能正确交换一次。如果我多次调用交换函数,则它不会正确交换。

CDoublyLinkedList& CDoublyLinkedList::swapNode(int index1, int index2) // the two nodes at given indices
{
if (index1 < 0) index1 = 0;
if (index1 >= count) index1 = count - 1;
if (index2 < 0) index2 = 0;
if (index2 >= count) index2 = count - 1;
if (index2 < index1)
{
int tempIndex = index1;
index1 = index2;
index2 = tempIndex;
}
if (index1 == index2)
{
return *this;
}


setPosition(index1);
Node* ptr1 = current;
setPosition(index2);
Node* ptr2 = current;
setPosition();

// The problem is in the code below this comment

Node* tempPrevNext;
Node* tempNextPrev;
Node* tempPrev;
Node* tempNext;

tempPrevNext = ptr1->prev->next;
tempNextPrev = ptr1->next->prev;
tempPrev = ptr1->prev;
tempNext = ptr1->next;

ptr1->prev->next = ptr2->prev->next;
ptr1->next->prev = ptr2->next->prev;
ptr1->prev = ptr2->prev;
ptr1->next = ptr2->next;

ptr2->prev->next = tempPrevNext;
ptr2->next->prev = tempNextPrev;
ptr2->prev = tempPrev;
ptr2->next = tempNext;

return *this;
}

最后两个节点的所有指针都应该交换,但这只能工作一次。任何帮助,将不胜感激。

提前致谢。

最佳答案

如果不看您的其余代码就很难判断,但我怀疑如果您交换列表的第一个或最后一个元素,就会出现错误。那是因为你永远不会更新你的“头”节点以指向不同的项目,所以如果你交换第一个元素,它的新位置将被视为头。

还有,你的数组是圆形的吗? ptr1->prev->next 应该为列表的第一个元素抛出空引用异常。

如果有帮助,您还可以通过删除 tempPrevNexttempNextPrev 来清理您的代码。重要的是要记住 ptr1->prev->next 应该是 ptr1 在开关之前,ptr2 在之后。

ptr1->prev->next = ptr2;
ptr1->next->prev = ptr2;
ptr2->prev->next = ptr1;
ptr2->next->prev = ptr1;

此外,您是否希望 index1 小于 index2?不应该有理由切换它们,除非你的'setposition'在你的索引有序的情况下更有效率。

关于c++ - 在双向链表中使用指针交换节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29925412/

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