【发布时间】:2015-12-11 06:15:28
【问题描述】:
我正在尝试交换双向链表中的两个节点。下面是具有交换功能的程序部分。
int swap (int x, int y)
{
struct node *temp = NULL ;
struct node *ptr1, *ptr2;
temp = (struct node *)malloc(sizeof(struct node));
if (head == NULL )
{
printf("Null Nodes");
}
else
{
ptr1 = ptr2 = head;
int count = 1;
while (count != x)
{
ptr1 = ptr1->next;
count++;
}
int count2 = 1;
while (count2 != y)
{
ptr2 = ptr2->next;
count2++;
}
ptr1->next->prev = ptr2;
ptr1->prev->next = ptr2;
ptr2->next->prev = ptr1;
ptr2->prev->next = ptr1;
temp->prev = ptr1->prev;
ptr1->prev = ptr2->prev;
ptr2->prev = temp->prev;
temp->next = ptr1->next;
ptr1->next = ptr2->next;
ptr2->next = temp->next;
}
return 0;
}
当我运行这个程序时,如果是第一个和第二个节点,它会崩溃。而在任何其他节点的情况下,它会提供无限循环输出。 (例如:- 2->4 2->4 2->4....等等)`。
我知道还有一些关于节点交换的问题,但我没有找到与我的问题类似的问题。请帮帮我..!!
提前致谢。
【问题讨论】:
-
至于错误,请考虑您从未更新
head指针的事实。这应该是寻找漏诊病例的良好开端。 -
考虑用你的函数成功地交换位置 1 和 3(如果它工作的话)。
(head) -> (2) -> (3)->(3) -> (2) -> (head)ptr和head可能指向同一个内存位置,但它们不是同一个变量。 -
此外,交换代码不需要分配内存(您不会在代码中释放内存)。交换节点仅意味着您重新排列现有指针。您可能需要临时存储指针,但不需要临时存储节点。
-
@Sujit 哇,你有没有看过接受的答案?
-
@Sujit 我认为您最终会得到一个节点,其中
next指针指向同一个节点,例如ptr2->next = ptr2。当您到达这样一个节点时,输出函数将在该节点上永远循环。
标签: c swap doubly-linked-list