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

如何正确实现链表节点存储?避免生成末尾多余0节点

如何正确将值存储到链表中,避免生成多余的末尾0节点?

当前实现的store函数在存储链表时,会在末尾生成一个值为0的多余节点:输入链表为2->6->0->1->3->5->4,输出变为2->6->0->1->3->5->4->0。以下是问题分析和修改方案:

原问题代码

store函数代码

void store(Stack *a, t_important *data)
{
    int i;
    Stack *tmp;

    tmp = a;
    i = 0;
    while(i < data->length)
    {
        tmp->n = data->collection_of_ints[i];
        tmp->next = malloc(sizeof(Stack));
        tmp = tmp->next;
        i++;
    }
}

主函数调用代码

int main(int ac, char **av)
{
    Actions action;
    Stack *a;
    Stack *b;
    t_important *data;
    
    if(ac < 2)
        return (-1);
    data = malloc(sizeof(*data));
    stack_nums_counter(av, data);
    collect(av, data);
    __check__collection(data);
    __collecting_ints(data);
    action = init();
    a = NULL;
    b = NULL;
    store(&a, data);
    __sort_a__(&a, &b, data, action);
    return (0);
}

问题根源

  1. 参数类型不匹配:主函数中a初始为NULL,调用store(&a, data)传递的是Stack**类型,但store函数参数定义为Stack*,导致无法正确初始化链表头节点。
  2. 循环逻辑错误:每次循环都强制给tmp->next分配内存,即使处理到最后一个元素,循环结束后会生成一个未赋值的空节点,其n值因malloc未初始化默认是0。

修改方案

调整循环逻辑,仅在需要时分配下一个节点,并修正参数类型以正确初始化链表:

修正后的store函数

void store(Stack **a, t_important *data)
{
    int i;
    Stack *tmp;

    if (data->length == 0)
        return;
    // 创建第一个节点
    *a = malloc(sizeof(Stack));
    if (!*a)
        return; // 可根据需求添加错误处理
    tmp = *a;
    i = 0;
    while (i < data->length)
    {
        tmp->n = data->collection_of_ints[i];
        // 仅当不是最后一个元素时,才分配下一个节点
        if (i != data->length - 1)
        {
            tmp->next = malloc(sizeof(Stack));
            if (!tmp->next)
                return; // 可根据需求添加错误处理
            tmp = tmp->next;
        }
        else
        {
            tmp->next = NULL; // 最后一个节点的next置空,终止链表
        }
        i++;
    }
}

修改说明

  • 把函数参数改为Stack **a,确保能修改主函数中链表头指针a的指向,正确初始化链表。
  • 循环内判断当前元素是否为最后一个,仅非末尾元素时才分配下一个节点,避免生成多余节点。
  • 最后一个节点的next设为NULL,保证链表结构正确。

内容的提问来源于stack exchange,提问作者Davit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:45:38