在调用free((函数之前,如果我不将NULL 值分配给我要删除的节点的链接部分,会有什么问题?我查看了一些删除其他网站节点的代码,但我发现没有为链接部分分配 NULL 值。他们只是称 free((;功能。请回复以消除我的困惑。谢谢。
struct node
{
int data;
struct node * next;
}
struct node * head = NULL; //This is the head node.
/* Here some other functions to create the list */
/* And head node is not going to be NULL here, after creating the list */
void deleteFirstNode()
{
struct node * temp = head;
head = temp->next;
temp->next = NULL; //my question is in this line, is this line necessary?
free(temp);
}
不,行
temp->next = NULL;
不是必需的。temp
指向的节点中的任何数据都将在调用free
后立即变为无效,因此在节点内紧接其无效之前更改它们中的任何值将不起作用。
由于这些语句,当为空列表调用时,此函数可以调用未定义的行为
struct node * temp = head;
head = temp->next;
因为在这种情况下head
等于NULL
.
该函数释放类型为struct node
的对象占用的内存。因此,更改已删除的对象是没有意义的。此声明
temp->next = NULL; //my question is in this line, is this line necessary?
是多余的。
和删除要写入的节点之前一样
temp->data = INT_MAX;
这不会影响列表。
该函数可能看起来像
void deleteFirstNode()
{
if ( head != NULL )
{
struct node *temp = head;
head = head->next;
free( temp );
}
}
定义依赖于全局变量的函数也是一个坏主意。在这种情况下,您将无法在程序中创建多个列表。最好通过引用将指向头节点的指针传递给函数 deleteFirstNode。
在这种情况下,函数可能看起来像
void deleteFirstNode( struct node **head )
{
if ( head != NULL )
{
struct node *temp = *head;
*head = ( *head )->next;
free( temp );
}
}
并且该函数可以像
deleteFirstNode( &head );