gpt4 book ai didi

c - 从链表中添加和删除节点

转载 作者:行者123 更新时间:2023-11-30 17:56:24 28 4
gpt4 key购买 nike

2 个问题:

  1. 我正在编写一个函数来将节点添加到列表中。目前我的情况是这样的:

    void addList( NODE_TYPE** head, NODE_TYPE** d_name )
    {
    (*d_name)->next = *head;
    *head = *d_name;
    }

    main()中,我这样调用它:

    addList( &head, &node_3);

    我的问题是,是否有另一种方法可以使用函数原型(prototype)来做到这一点,例如:

    void addList( NODE *head, NODE *node);

    这是一个类问题,我不明白如何使用上面的函数原型(prototype)来完成前置,因为调用该函数只会传递地址的值,调用者将无法看到对头或节点。

  2. 我不确定我的deleteList函数是否正确。我想要它,以便温度指向头( anchor )指向的位置。然后next_free指向与head链接的第二个节点。然后我释放第一个节点。然后重复第二个、第三个等等,直到所有人都被释放。

    void deleteList( NODE_TYPE** head )
    {
    NODE_TYPE* temp = *head;
    NODE_TYPE* next_free = NULL;

    while ( temp->next != NULL )
    {
    next_free = temp->next;
    free( temp );
    temp = next_free;
    }

    *head = NULL;
    }

这是正确的方法吗?

最佳答案

要回答第一个问题,您可以使用所谓的“假头”。这是一个空节点,其 next 指针指向列表中的第一个元素。因此,您将空列表创建为单个节点,然后传递该节点,并知道其指针不会更改。如果您打算在多个位置存储指向列表头部的指针但允许列表更改,这非常有用。

对于数字 2,它几乎是正确的,但您需要确保 *head 最初不为 NULL。此外,它不会删除仅包含一个元素的列表。改为这样做:

while ( temp != NULL )

其他一切保持不变。

哦,关于你的第一个问题的另一个注释。你这样说就错了:

calling the function would only pass in the value of the address, the caller would be unable to see any changes made to the head nor the node.

节点的内容可以更改。您不需要指向它的双指针。双指针意味着指针可以改变。

关于c - 从链表中添加和删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13555558/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com