NodePointer deleteNode(NodePointer head,int number)
{
NodePointer ptrNode;
NodePointer ptrNodePrev;
int count;
if(head == NULL)
{
printf("There is no element at list");
}
if(number == 1)
{
ptrNodePrev=head;
head=head->next;
free(ptrNodePrev);
}
else{
ptrNode=head;
while(ptrNode->next != NULL && count+1 != number){
count++;
ptrNodePrev=ptrNode;
ptrNode=ptrNode->next;
}
ptrNode=ptrNode->next;
printf("Node: %d-%d-%d - %s",ptrNodePrev->next->x.year,
ptrNodePrev->next->x.month,
ptrNodePrev->next->x.day,
ptrNodePrev->next->x.event);
printf("Successfully deleted");
free(ptrNodePrev->next);
ptrNodePrev->next=ptrNode;
}
return head;
}
嗨,我一直在学习单链表,想做一个关于它的例子。基本上我要求用户输入他想要多少个节点,然后他填充它们。之后,我要求他们删除一个节点,然后他们将输入一个数字,据说该数字将删除相应的节点。如果输入的数字不是 1 也没关系,但如果是,那么我基本上会得到随机数。我不明白为什么会这样,我在这里查看了有关此主题的大部分问题,但找不到原因。有人可以解释我的错误吗?
您的代码中的问题是您在 while 循环中使用它之前没有初始化 count 变量。尝试删除第一个节点时,这可能会导致未定义的行为。
要解决此问题,您可以在 while 循环之前将计数初始化为 1,如下所示:
int count = 1;
这样,当number为1时,第一个节点将被正确删除。
此外,最好在使用变量之前始终初始化变量以避免此类问题。
实际上,当
number
等于 1
时,函数就可以正常工作了。
NodePointer deleteNode(NodePointer head,int number)
{
NodePointer ptrNode;
NodePointer ptrNodePrev;
int count;
if(head == NULL)
{
printf("There is no element at list");
}
if(number == 1)
{
ptrNodePrev=head;
head=head->next;
free(ptrNodePrev);
}
//...
return head;
}
也许在 main 中你忘了把函数的返回值赋值给指向头节点的指针 like
head = deleteNode( head, 1 );
否则该函数具有未定义的行为,因为 1) 变量
count
未初始化,并且 2) 在这个 while 循环之后您没有检查指针 ptrNode
是否等于 NULL
while(ptrNode->next != NULL && count+1 != number){
count++;
ptrNodePrev=ptrNode;
ptrNode=ptrNode->next;
}
ptrNode=ptrNode->next;
//...
注意C索引是从
0
开始的。函数的第二个参数应该是无符号整数类型,例如size_t
。否则,允许用户向函数传递一个负值。
此外,该功能不应发出任何消息。
可以通过以下方式声明和定义函数。
int deleteNode( NodePointer *head, size_t n )
{
while ( n-- && *head != NULL ) head = &( *head )->next;
int success = *head != NULL;
if ( success )
{
NodePointer current = *head;
*head = ( *head )->next;
free( current );
}
return success;
}
如果在 main 中你有一个像这样的指针声明
NodePointer head = NULL;
//...
然后调用函数就像
deleteNode( &head, n );
其中
n
是指定列表中从 0 开始的索引的某个值。也就是说,如果你想删除第一个节点,那么你应该写
deleteNode( &head, 0 );