C语言 有关删除链表中节点的问题



在调用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 );

相关内容

  • 没有找到相关文章

最新更新