C语言链表奇数元素删除功能异常问题求助
你好呀!看了你的代码和问题描述,发现有几个关键问题导致了一直输出“Deleted 1”的异常,咱们一步步来梳理和修正:
一、Delete_Node函数的核心问题
未初始化的
deleted_number变量
在else分支(删除非首节点)里,你没有给deleted_number赋值,但最后却用printf输出它。局部变量如果未初始化,会包含栈上的残留值,这就是为什么你一直看到输出1的原因——刚好栈里残留了第一次删除时的1的值。
修正:在else分支里也要给deleted_number赋值:deleted_number = oldNode->value;未释放删除节点的内存
在else分支里,你只是把oldNode设为NULL,但没有调用free(oldNode),这会造成内存泄漏,程序运行久了会占用越来越多的内存。
修正:把oldNode = NULL;改成free(oldNode);缺少边界检查
如果传入的position超过了链表当前的size,你的代码会访问空指针,导致程序崩溃。建议在函数开头加一个判断:if (position < 1 || position > queue->size) { printf("\nInvalid position!"); return; }
二、DeleteUneven函数的逻辑问题
你的循环逻辑太绕,用pos跟踪位置容易出错,而且删除节点后temp的处理不够简洁。其实可以换一种思路:遍历链表时,直接跟踪当前节点和前一个节点,不需要用位置来定位,这样更直观也不容易出错。
修正后的DeleteUneven函数可以写成这样:
void DeleteUneven(Queue *queue) { Node *current = queue->head; Node *prev = NULL; while (current != NULL) { if (current->value % 2 == 1) { // 需要删除当前节点 if (prev == NULL) { // 删除首节点 queue->head = current->next; printf("\nDeleted: %d", current->value); free(current); current = queue->head; } else { // 删除中间节点 prev->next = current->next; printf("\nDeleted: %d", current->value); free(current); current = prev->next; } queue->size--; } else { // 不需要删除,移动指针 prev = current; current = current->next; } } }
这样修改后,不需要维护pos变量,直接通过指针跟踪节点,删除逻辑更清晰,也避免了位置计算错误。
三、修正后的完整Delete_Node函数
为了让Delete_Node更健壮,修正后的代码如下:
void Delete_Node(Queue *queue, int position) { Node *oldNode; Node *prev; int deleted_number; // 边界检查 if (position < 1 || position > queue->size) { printf("\nInvalid position!"); return; } if (position == 1) { oldNode = queue->head; deleted_number = queue->head->value; queue->head = queue->head->next; free(oldNode); queue->size--; } else { prev = queue->head; for (int i = 1; i < position - 1; i++) { prev = prev->next; } oldNode = prev->next; deleted_number = oldNode->value; // 新增赋值 prev->next = oldNode->next; free(oldNode); // 新增释放内存 queue->size--; } printf("\nDeleted: %d", deleted_number); }
为什么原来的代码会一直输出1?
因为在删除非首节点时,deleted_number没有被赋值,而局部变量的初始值是栈上的残留数据。第一次删除首节点时,deleted_number被设为1,之后每次调用Delete_Node删除其他节点时,deleted_number刚好拿到了栈里残留的1,所以就一直输出1了。
备注:内容来源于stack exchange,提问作者muniek7

