c - 不了解列表如何在 C 中的递归函数中工作
问题描述
当我使用函数在其中插入一些值时,我无法理解列表会发生什么。练习是复制列表的所有偶数元素。如您所见,我写了一些注释(在函数中)以更好地理解我的代码的问题。该函数无需返回即可工作,我不明白为什么。为了使它工作,我必须在第二次调用时像使用 void 函数一样使用它。完整代码可在 https://replit.com/@Vash221/evenDub?v=1找到
在这里你只能看到主要功能。
/*
Complete the listDupEven function which, given a list, duplicates all even numbers;
The function must use recursion
*/
#include <stdio.h>
#include "TList.h"
//RECURSIVE FUNCTION
TList listDupEven(TList list)
{
if(list==NULL)
return list;
if(list->info%2==0)
{
list=listInsert(list, list->info);
list=list->link;
}
//If I delete the return and use the function like a void it works:
//listDupEven(list->link);
return listDupEven(list->link);
//If I put a return it doesn't work
}
int main(void) {
TList list=listCreate();
list=listInsert(list, 1);
listInsert(list, 2);
listInsert(list, 3);
listInsert(list, 4);
listInsert(list, 5);
listInsert(list, 6);
list=listDupEven(list);
printf("The new list is:\n");
listPrint(list);
return 0;
}
解决方案
这里的罪魁祸首是:
if(list==NULL)
return list;
您正在返回一个 NULL 指针。您可以通过多种方式解决此问题,例如,您可以这样做:
TList listDupEven(TList list , TList orig)
{
if(list==NULL)
return orig;
if(list->info%2==0)
{
list=listInsert(list, list->info);
list=list->link;
}
return listDupEven(list->link , orig);
}
orig
只是您传递给函数的原始指针:
list = listDupEven(list , list) ;
删除 return 语句时它确实起作用的原因(因此,我想您是在谈论 void 函数,而不是没有 return 语句的函数,顺便说一句,这是未定义的行为),是因为您没有覆盖您的list
NULL 指针。
编辑:这也可以工作:
TList listDupEven(TList list)
{
if(list==NULL)
return NULL;
if(list->info%2==0)
{
list=listInsert(list, list->info);
list=list->link;
}
listDupEven(list->link);
return list;
}
推荐阅读
- pandas - UnicodeDecodeError:使用 .csvreader 读取 csv 文件时
- puppet - 木偶图书馆员无法解决依赖关系
- javascript - Javascript:如何检查数组项是否大于另一个数组中项的两倍
- python - 列表中所有唯一的列表组合
- python - 如何修复函数以使生成的数据框只有子集列?
- javascript - 点击函数内的提交函数
- elasticsearch - Elastic.elasticsearch 角色和 Ansible Tower 动态清单
- php - jodit Yii2 在上传时更改文件名
- php - Guzzle 不支持带有自定义端口的端点吗?
- python - 如何从 .txt 列表中获取数字并将结果保存在另一个 .txt 中?