2个问题:
我正在编写一个函数来将节点添加到列表中。目前我喜欢这样:
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);
这是一个类问题,我不明白如何使用上面的函数原型进行前置,因为调用函数只传递地址的值,调用者将无法看到对头部和节点。
我不确定我的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;
}
这是正确的方法吗?
答案 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)强>
这将处理存在空列表的条件或具有单个节点的列表