You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:12:26