Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c:链表:如何编写节点交换函数?_C_Linked List - Fatal编程技术网

c:链表:如何编写节点交换函数?

c:链表:如何编写节点交换函数?,c,linked-list,C,Linked List,以下是我的功能: void switchnodes(NODE **A) { if((*A)->next) { NODE *first = pop(A); NODE *second = pop(A); push(A,first); push(A,second); } } void switchnodes(NODE **A) { if((*A)->next) { NO

以下是我的功能:

void switchnodes(NODE **A)
{
    if((*A)->next)
    {
        NODE *first = pop(A);
        NODE *second = pop(A);
        push(A,first);
        push(A,second);
    }
}
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);
    }
}
推送和弹出:

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;
}
我的困惑是:

节点:

NODE*top
my链表包含值1…10
NODE*holder
是另一个指针,分别指向链表的第5个和第4个节点

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

为什么会这样


我如何编写这个函数,这样就不必传递指针->下一步?我不能在每个实例中都这样做,比如如果它是我需要交换的顶级节点。

这就是列表的工作方式:只能通过
next
指针交换节点<代码>持有者
是列表外的指针。它可能会更新,但列表不会知道

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


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

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

void switchnodes(NODE **A)
{
    if((*A)->next)
    {
        NODE *first = pop(A);
        NODE *second = pop(A);
        push(A,first);
        push(A,second);
    }
}
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中的描述使用