如何在此交换功能(单链接列表)中找到错误?

时间:2019-02-10 06:53:38

标签: c++ singly-linked-list

如果其中一个是head,则无法交换链表中的值。我在a中插入三个值(4、5、7)并删除2并交换5、4,但是当其中一个值是head时,代码不会交换,而当一个值是head时,代码不会交换并显示输出其中的一个是头,相同的代码对非头节点效果很好

struct node
{
int x;

node* next;
};

void swapper(node **headref, int a, int b)
{
    node *temp1 = *headref, *temp2 = *headref, *prev2 = NULL, *prev1 = NULL;

    while(temp1 != NULL && temp1->x != a)
    {
        prev1 = temp1;
        temp1 = temp1->next;
    }

    while(temp2 != NULL && temp2->x != b)
    {
        prev2 = temp2;
        temp2 = temp2->next;
    }

    if(temp1 == *headref)
    {
        swap(temp1->next, temp2->next);
        prev2->next = *headref;
        *headref = temp2;
    }

    if(temp2 == *headref)
    {
        swap(temp1->next, temp2->next);
        prev1->next = *headref;
        *headref = temp1;
    }

    if(temp1 != NULL && temp2 != NULL)
    {
        swap(prev1->next, prev2->next);
        swap(temp1->next, temp2->next);
    }
}
Output:

4 1 2 3
4 1 2 5 3 
4 1 2 5 3 7 
4 1 5 3 7  

应该交换5和4并显示5 1 4 3 7,但这不会发生。我无法在代码中找到错误。

1 个答案:

答案 0 :(得分:0)

问题是您没有正确考虑不同的情况。如果需要交换,则应该只进行一次交换,因此应该有一个if ... else if ... else语句来处理不同的情况。

在您的示例中,具体出问题的是temp1 == *headref然后发生了交换,但是在交换temp2 == *headref之后,因此程序尝试了第二次交换。

如果您尝试将头部与列表中未列出的东西交换,也会遇到一个错误,在这种情况下,您将有temp1 == *headreftemp2 == NULL这是一个问题。

最后一个错误是交换一个头部。这也导致崩溃,因为在这种情况下,prev2 == NULL

这是一个有效的版本。如您所见,它与您的非常相似,我只是想过通过不同的方式进行更仔细地交换。

void swapper(node **headref, int a, int b)
{
    node *temp1 = *headref, *temp2 = *headref, *prev2 = NULL, *prev1 = NULL;

    while (temp1 != NULL && temp1->x != a)
    {
        prev1 = temp1;
        temp1 = temp1->next;
    }

    while (temp2 != NULL && temp2->x != b)
    {
        prev2 = temp2;
        temp2 = temp2->next;
    }

    if (temp1 == NULL || temp2 == NULL || temp1 == temp2)
    {
        // nothing to do
    }
    else if (temp1 == *headref)
    {
        swap(temp1->next, temp2->next);
        prev2->next = *headref;
        *headref = temp2;
    }
    else if (temp2 == *headref)
    {
        swap(temp1->next, temp2->next);
        prev1->next = *headref;
        *headref = temp1;
    }
    else
    {
        swap(prev1->next, prev2->next);
        swap(temp1->next, temp2->next);
    }
}

您所说的代码质量给我留下了深刻的印象。样式不错,易于遵循,几乎是正确的,一旦发现错误便很容易修复。