链表插入函数因while条件顺序问题导致程序异常退出求助
链表插入时循环条件顺序导致的问题解析
当输入的值大于链表最后一个元素时,程序会直接退出;将while循环的条件顺序反转后,程序可正常运行。
有问题的循环条件代码
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)) // 改为((temp!=NULL) &&(temp->x < new_node->x))即可正常运行 { prev = temp; temp = temp->next; } new_node->next = temp; if (prev == NULL) // 插入到链表头部以维持有序性 return new_node; prev->next = new_node; return head; } }
问题原因
C语言的逻辑与运算符&&遵循短路求值规则:只要左边条件为假,右边条件会直接跳过,不会执行。
- 错误顺序的条件中,先判断
temp->x < new_node->x,当输入值大于链表最后一个元素时,temp会遍历到链表末尾的NULL指针。此时访问temp->x属于空指针解引用,触发未定义行为,直接导致程序崩溃退出。 - 正确顺序的条件中,先判断
temp != NULL。当temp变为NULL时,左边条件为假,右边的temp->x不会被执行,避免了空指针访问,循环正常终止,后续插入逻辑可以正确处理末尾插入的情况。
解决方法
直接采用先判断指针有效性,再进行数值比较的循环条件顺序:
while((temp!=NULL) &&(temp->x < new_node->x))
这样就能彻底避免空指针解引用的问题,程序可以正确处理所有插入场景,包括插入到链表头部、中间和末尾的情况。
内容的提问来源于stack exchange,提问作者Sourav Shukla
相关产品推荐
相关产品推荐

