程序完全退出
while ((temp->x < new_node->x)&&(temp != NULL))
但当编写为
while((temp!=NULL) &&(temp->x < new_node->x))
这是我的代码。
Node *insert(Node *head)
{
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->next = NULL;
printf("\nEnter x: ");
scanf("%d", &new_node->x);
if (head == NULL)
return new_node;
else
{
Node *prev = NULL, *temp = head;
while ((temp->x < new_node->x)&&(temp != NULL)) // but, ((temp!=NULL) &&(temp->x < new_node->x)) runs
{
prev = temp;
temp = temp->next;
}
new_node->next = temp;
if (prev == NULL) // Node needs to insert at beginning to maintain the sorting of Linked List
return new_node;
prev->next = new_node;
return head;
}
}
1条答案
按热度按时间kx7yvsdv1#
循环中的条件或包含
&&
的if
语句严格从左到右求值,除非LHS求值为true,否则不会对RHS求值。您有:条件
temp->x < new_node->x
在temp != NULL
之前求值。但是,如果temp
为空,则在大多数系统上第一次比较将失败,因为通过空指针访问是未定义的行为,通常会导致分段错误。相比之下,当你写:
代码首先检查空指针,如果指针为空,则不计算RHS条件,因此避免了崩溃。
这样做的目的是在试图通过指针访问数据之前检查指针是否为空。显然,如果指针不能为空,则在使用之前不需要测试它。有时,如果指针不应该为空,则Assert指针不为空可能是有益的: