从链表中添加和删除节点

时间:2012-11-25 21:14:25

标签: c

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功能是否正确。我想要它,以便临时指向head(anchor)指向的位置。然后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;
    }
    
  3. 这是正确的方法吗?

3 个答案:

答案 0 :(得分:0)

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

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

while ( temp != NULL )

并保留其他所有内容。

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

  

调用该函数只会传递地址的值,即   调用者将无法看到对头部或者头部的任何更改   节点

节点的内容可以更改。你不需要一个双指针。双指针意味着指针可以改变。

答案 1 :(得分:0)

您可以通过直接分配到* head:

来避免额外的“next_free”变量
void deleteList( NODE_TYPE **head )
{
    NODE_TYPE *temp;

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

}

答案 2 :(得分: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)

这将处理存在空列表的条件或具有单个节点的列表