链表递归函数,用于从列表中删除奇数值。(C)

链表递归函数,用于从列表中删除奇数值。(C),c,list,recursion,linked-list,C,List,Recursion,Linked List,考虑像1->2->3->4->5这样的列表 Tlist是这样制作的: typedef struct node{ int info; struct node *link; }Tnode; typedef Tnode *Tlist; 我得到的函数listDeleteOdd是这样构建的 Tlist listDeleteOdd(Tlist list) { if (list == NULL) return NULL; if (list->

考虑像1->2->3->4->5这样的列表
Tlist是这样制作的:

typedef struct node{
    int info;
    struct node *link;
}Tnode;

typedef Tnode *Tlist;
我得到的函数listDeleteOdd是这样构建的

Tlist listDeleteOdd(Tlist list) {  

    if (list == NULL) 
        return NULL;

    if (list->info % 2 == 1) {
        Tnode *node = list->link;
        DeleteNode(list);
        return listDeleteOdd(node);
    }
    Tnode *node = listDeleteOdd(list->link);
    list->link = node;
    return list;
};
删除节点只是释放给定节点ofc的内存。 顺便说一下,我不明白第二个if之后的值Tnode*node是如何变化的。就像它应该为NULL一样,当原型“列表”到达末尾时,循环返回NULL。循环结束后,节点和“返回列表”结束时会发生什么情况它返回什么


几个月前我研究了递归,现在它太令人困惑了。有人可以向我解释整个功能是如何正常工作的,因为我有点了解它是如何工作的,但我认为有些步骤在我的脑海中并不清楚。提前为患者提供Thx

关键是定义
listDeleteOdd()
的作用。它返回一个指向节点列表的指针,该列表为空或仅包含偶数值-一个“干净列表”

在内部,它通过三种不同的操作实现这一点:

  • 输入列表为空(空);返回NULL(基本大小写)
  • 列表中的第一个节点是奇数;捕获下一个节点,删除当前节点;递归以返回从下一个节点开始的干净列表
  • 通过消去,列表中的第一个节点是偶数。捕获从下一个节点开始的偶数值列表(递归)。使当前节点的下一个指针(
    链接
    )指向清除列表,并返回当前节点作为(现在清除)列表的开始

  • 使用调试器并逐步完成它。这会告诉你发生了什么。这比解释要容易得多(也更好)。我会试试。在纸上画画,手动“执行”代码。我试过了,我不明白为什么在第一个循环之后,当我检查节点的值时,它给了我5。它是如何从1变为5的??tfSee-TL;答案通常是“否”,但函数指针可能是个例外。