0

2个问题:

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

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

    在里面main(),我这样称呼它:

    addList( &head, &node_3);
    

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

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

    ?

    这是一个类问题,我不明白如何使用上述函数原型进行前置,因为调用函数只会传入地址的值,调用者将无法看到对头部所做的任何更改,也节点。

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

    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;
    }
    

这是正确的方法吗?

4

3 回答 3

0

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

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

while ( temp != NULL )

并让其他一切保持不变。

哦,关于你的第一个问题的另一个说明。当你这样说时你错了:

调用函数只会传入地址的值,调用者将无法看到对 head和 node所做的任何更改。

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

于 2012-11-25T21:17:50.940 回答
0

您可以通过直接分配给 *head 来避免额外的“next_free”变量:

void deleteList( NODE_TYPE **head )
{
    NODE_TYPE *temp;

    while ( (temp = *head) )
    {
        *head = temp->next;
        free( temp );
    }

}
于 2012-11-25T21:42:33.360 回答
0

“我的问题是,是否有另一种方法可以使用函数原型来做到这一点,例如:void addList(NODE *head, NODE *node)”

好吧,你是对的。如果您只是“按值传递”,您反映的更改将不适用于原始子例程。你可以做的是:

Node_type * addList(Node_type *head, Node_type *d_name)
{
d_name->next=head;
return d_name;
}

在调用者函数中以这种格式调用

 head = addList( head, node_3);

这将反映您希望看到的变化

第二季度

只要把条件

而(临时!= NULL)

这将处理存在空列表具有单个节点的列表的情况

于 2012-11-26T08:02:50.947 回答