我是编程新手。我只想知道为什么这行不通。 我对指针的理解尚不清楚,尤其是在跨函数使用指针时。
void append(struct Node** head_ref, float new_data)
{
struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
struct Node *last = *head_ref; /* used in step 5*/
new_node->data = new_data;
new_node->next = NULL;
while (last != NULL)
last = last->next;
last = new_node;
return;
}
void append(struct Node** head_ref, float new_data)
{
while (last->next != NULL)
last = last->next;
last->next = new_node;
return;
}
在第一个函数中,不包含新数据,我仅获得原始链接列表。
但是第二个功能可以正常工作。在链表的开头插入新节点时,双指针如何工作? (我已经看到有关此问题的答案,但我仍然感到困惑)
答案 0 :(得分:3)
在第一个示例中,将指针last
移动到指向NULL
的位置。然后,将指针设置为new_node
。但是,此时,last
与您的链接列表没有真正的关联。它只是一些内存的指针。在第二个示例(正确的示例)中,您进行迭代直到到达链表的末尾,该节点的next
是NULL
。然后,将next
设置为new_node
。现在,列表中有了新的尾巴,即new_node
。
答案 1 :(得分:0)
更改局部变量last
不会更改上一个(最后一个)节点的数据成员next
的值。
更清楚地说,我们假设列表为空。然后,您必须更改此双指针head_ref
引用的指针。
您声明了一个新指针
struct Node *last = *head_ref;
循环
while (last != NULL)
last = last->next;
被跳过,因为现在已经倒数等于NULL死于前一个声明中的初始化。然后您更改了此局部变量last
last = new_node;
由于head_ref
和last
占用不同的内存范围,因此*head_ref
所指向的指针的原始值未更改。您更改了last
占用的内存,但未更改head_ref
占用的内存。
还应检查是否已成功分配内存。
该函数的外观如下
int append( struct Node **head_ref, float new_data )
{
struct Node *new_node = malloc( sizeof( struct Node ) );
int success = new_node != NULL;
if ( success )
{
new_node->data = new_data;
new_node->next = NULL;
while ( *head_ref != NULL ) head_ref = &( *head_ref )->next;
*head_ref = new_node;
}
return success;
}
至于这个循环(我想你只是想展示循环而不是整个功能)
while (last->next != NULL)
last = last->next;
last->next = new_node;
然后您要更改上一个(最后一个)节点的数据成员next
。
尽管如果初始head_ref
等于NULL
,则此循环将不起作用。