【问题标题】:c: linked list: how to write a node swapping function?c:链表:如何编写节点交换函数?
【发布时间】:2014-01-23 13:56:38
【问题描述】:

这是我的功能:

void switchnodes(NODE **A)
{
    if((*A)->next)
    {
        NODE *first = pop(A);
        NODE *second = pop(A);
        push(A,first);
        push(A,second);
    }
}

推送和弹出:

void push(NODE **top,NODE *nnew)
{
    nnew->next=*top;
    *top=nnew;
}
NODE * pop(NODE **top)
{
    NODE *remove = *top;
    *top=(*top)->next;
    remove->next=0;
    return remove;
}

我的困惑:

节点:

typedef struct node {
    int value;
    struct node *next;
} NODE;

NODE * top 我的链表持有值 1...10 NODE * holder是另一个指针,分别指向链表的第5个和第4个节点

switchnodes(&holder); holder 指向第 5 个节点。第 6 个节点丢失 switchnodes(&(holder->next));holder 指向第四个节点。第 5 和第 6 个节点交换成功。

为什么会这样?

以及如何编写这个函数,这样我就不必传递指针->next?我不能在所有情况下都这样做,比如我需要交换的顶级节点。

【问题讨论】:

  • 第一个要问的问题,你交换节点而不是它们的值吗?

标签: c linked-list


【解决方案1】:

这就是您的列表的工作方式:您只能通过next 指针交换节点; holder 是列表外的指针。它可能会更新,但列表不会知道。

holder 指向第四个节点。你交换它,它现在指向新的第 4 个节点,以前的第 5 个节点。但重要的是:列表第三个节点的next 指针仍然指向第四个节点——交换前的第四个节点。

您可以通过为每个节点添加一个 haed 和一个 tail 以及一个额外的 prev 指针来创建双向列表。然后,您可以使用该信息来更新交换节点的邻居(如果有)。

【讨论】:

    【解决方案2】:

    您必须在 switchnodes 函数中更新 first 的“next”。这是一个工作函数:

    void switchnodes(NODE **A)
    {
        if((*A)->next)
        {
            NODE *first = pop(A);
            NODE *second = pop(A);  
            push(A,first);
            first->next = second->next; //the missing line
            push(A,second);
        }
    }
    

    【讨论】:

    • 这个功能对我不起作用。我完全按照 OP 中的描述使用
    猜你喜欢
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2017-12-07
    • 2018-11-05
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多