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
相关产品推荐
相关产品推荐

