C语言实现链表filter_even筛选偶数输出随机数问题求助
问题现象
实现C语言链表筛选偶数节点功能时,打印筛选出的偶数链表末尾出现无意义随机数,运行输出如下:
原链表打印:
1 2 3 4
偶数链表打印:4 2 6422356 1528349827
错误位置说明
代码存在5类直接导致运行异常的问题:
- 局部指针未初始化:
main函数中的链表头l1、filter_even函数中的新链表头l_even都是栈上局部变量,声明后未初始化为NULL,会携带栈空间的随机垃圾值。insert函数执行时会把新节点的next指针直接指向这个垃圾地址,导致链表末尾指向非法内存,遍历到该位置时就会读取到随机值。 - 链表遍历逻辑错误:
print_list、position_of、filter_even三个函数中的遍历循环都使用l->next != NULL作为终止条件,既会漏掉链表最后一个合法节点的处理,也无法在链表尾正常终止,会顺着非法指针继续访问内存,输出随机数据。 - 无效语法残留:代码中多处出现无意义的
zv;语句,属于无效语法,会直接导致编译失败,需要全部删除。 - 函数返回值错误:
filter_even声明返回list类型,末尾却return 0;,逻辑上应该返回生成的偶数链表头指针。 - 缺失必要头文件:代码使用了
malloc、free、printf等标准库函数,却没有引入<stdio.h>和<stdlib.h>头文件,会触发隐式声明警告,运行时可能出现异常。
修正后的完整可运行代码
#include <stdio.h> #include <stdlib.h> struct le{ int value; struct le *next; }; typedef struct le listenelement; typedef listenelement *list; void insert(int v, list * l){ listenelement *new = malloc(sizeof(listenelement)); if (new == NULL) { perror("memory allocate failed"); exit(EXIT_FAILURE); } new->value = v; new->next = *l; *l = new; } void print_list(list l){ if (l == NULL) { printf("Die Liste ist leer\n"); return; } while (l != NULL){ printf("%d\t", l->value); l = l->next; } printf("\n"); } void delete_all(list * l){ list next; while (*l != NULL){ next = (*l)->next; free(*l); *l = next; } } int position_of(int v, list l){ int i = 0; while (l != NULL){ if (v == l->value){ printf("Der Wert %d erscheint in der Liste an der %d. Stelle (Index i = %d).\n", v, i + 1, i); return i; } i++; l = l->next; } printf("Der Wert %d erscheint nicht in der Liste.\n", v); return -1; } list filter_even(list l){ list l_even = NULL; int e; while (l != NULL){ if (l->value % 2 == 0){ e = l->value; insert(e, &l_even); } l = l->next; } print_list(l_even); return l_even; } int main(){ list l1 = NULL; list even_list; int a = 4; insert(a, &l1); int b = 3; insert(b, &l1); insert(2, &l1); insert(1, &l1); print_list(l1); even_list = filter_even(l1); // 释放内存避免泄漏 delete_all(&l1); delete_all(&even_list); return 0; }
修正后运行结果
1 2 3 4
4 2
输出符合预期,无随机值,偶数链表仅包含原链表中的所有偶数值。
内容的提问来源于stack exchange,提问作者Krocki
相关产品推荐
相关产品推荐

