You need to enable JavaScript to run this app. C语言递归实现字符串转字符链表,运行无输出求错误排查
优惠活动
大模型
产品
解决方案
定价
更多

C语言递归实现字符串转字符链表,运行无输出求错误排查

递归构建字符串链表问题排查方案

现有代码核心错误

  • 递归终止条件逻辑完全错误:没有判断输入字符串是否走到末尾(*scl == '\0'),反而判断了未初始化的局部指针ris是否为空,属于未定义行为,同时终止条件中对空指针ris的info字段赋值会直接触发段错误。
  • 链表构建逻辑错误:当前节点分配后next指针错误指向自身,且没有将当前节点和递归生成的后续链表关联,直接返回递归调用结果,会导致所有已分配节点内存泄漏,最终返回值为NULL。
  • 测试代码函数名不匹配:打印函数定义为printList,主函数中错误调用了不存在的sclstrings_print,会导致编译失败。
  • 局部变量重复定义:else代码块中重复定义了同名变量ris,虽然语法合法但进一步打乱了逻辑。

修正后的功能代码

TipoSCL sclstrings_create (const char *scl)
{
    // 递归终止条件:字符串走到末尾
    if (*scl == '\0') {
        return NULL;
    }
    // 分配当前节点内存
    TipoSCL ris = (TipoNodoSCL*) malloc (sizeof(TipoNodoSCL));
    ris->info = scl[0];
    // 递归构建后续链表,绑定到当前节点的next指针
    ris->next = sclstrings_create(scl + 1);
    return ris;
}

修正后的测试代码

// 提前声明打印函数,函数名保持一致
void printList(TipoSCL l);

int main(int argc, char const *argv[])
{
   TipoSCL scl;
   char *str = "Hello World";
   scl = sclstrings_create(str);
   // 调用正确的打印函数名
   printList(scl);
   // 补充:用完释放链表内存,避免内存泄漏
   TipoSCL tmp;
   while(scl != NULL) {
       tmp = scl;
       scl = scl->next;
       free(tmp);
   }
   return 0;
}

void printList(TipoSCL l)
{
   TipoSCL aux = l;
   int pos = 0;
   while (aux != NULL)
   {
       printf("pos: %d, info: %c\n", pos, aux->info);
       aux = aux->next;
       pos++;
   }
}

内容的提问来源于stack exchange,提问作者Angelo pio Pompeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 14:33:01