首页 > 解决方案 > 不了解列表如何在 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;
}

标签: clist

解决方案


这里的罪魁祸首是:

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 语句的函数,顺便说一句,这是未定义的行为),是因为您没有覆盖您的listNULL 指针。

编辑:这也可以工作:

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;                                                                                                                       
}

推荐阅读