为什么 Main 的头部没有得到节点?

why the head at main doest get the node?

提问人:Netanel Zohar 提问时间:3/25/2022 最后编辑:Vlad from MoscowNetanel Zohar 更新时间:3/25/2022 访问量:41

问:

我试图将节点插入链接列表,但从 Poiter 到 Poiter 的值没有传递 我写了一张纸条*****问题在哪里出现

void insertTolist(list* head, list* node)
{
    list* current = head;
    list* currentPlusOne = head->next;
    while (current->next != NULL)
    {
        if (current->data<node->data && currentPlusOne->data>node->data)
        {
            current->next = node;
            node->next = currentPlusOne;
            break;
        }
        if (current->data<node->data && currentPlusOne->next == NULL)
        {
            current->next = node;
            node->next = (list*)calloc(1, sizeof(list));
            break;
        }
        if (current->data > node->data && currentPlusOne->data >node->data)// b c 
        {
            node->next =current;
            head = node;// ***the head doesnt chanching at the main***
            break;
        }
        current = current->next;
        currentPlusOne = currentPlusOne->next;
    }
    //printlist(head);
}
C 指针 struct pass-by-reference singly-linked-list

评论

0赞 William Pursell 3/25/2022
如果您要询问函数中发生了什么,那么包含它会很有帮助!但很明显,问题只是你正在修改局部变量。如果要修改调用方中的变量,则调用方应传递地址。例如,在 main 中,您将拥有并且该函数将采用mainlist *head; ... insertToList(&head)list **
0赞 Netanel Zohar 3/25/2022
谢谢!你解决了.

答:

1赞 Vlad from Moscow 3/25/2022 #1

声明如下的函数

void insertTolist(list* head, list* node)

处理指向用作参数的头节点的指针值的副本。更改此语句中的副本

head = node;

不反映在原始指针的值上。

此外,如果传递的指针是空指针,则该函数可以调用未定义的行为,至少由于此声明

list* currentPlusOne = head->next;

还有这句话

node->next = (list*)calloc(1, sizeof(list));

没有意义。

您需要通过指向函数的指针将指向头节点的指针通过引用传递给函数,或者从函数返回指向头节点的指针(可能已修改)并将其值分配给原始指针。

如果使用第一种方法,那么该函数看起来就足够简单了。

void insertTolist( list **head, list *node )
{
    while ( *head != NULL && !( node->data < ( *head )->data ) )
    {
        head = &( *head )->next;
    }

    node->next = *head;
    *head = node;
}

如果在调用方中,指针被声明为head

list *head = NULL;

然后该函数被调用为

insertTolist( &head, node );

其中 node 是指向列表中插入节点的指针。