c - 链接列表递归函数,从列表中删除奇数值。 (C)

标签 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->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 一样,因为当原型(prototype)“列表”到达末尾时,循环返回 NULL。循环到达末尾后,节点和“返回列表”末尾会发生什么?它返回什么?

几个月前我研究了递归,现在一切都很困惑。有人可以向我解释整个功能如何正常工作,因为我有点理解它是如何工作的,但我认为有些步骤我心里不太清楚。提前感谢患者。

最佳答案

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

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

  1. 输入列表为空(NULL);返回 NULL(基本情况)。
  2. 列表中的第一个节点是奇数;捕获下一个节点,删除当前节点;递归以返回从下一个节点开始的干净列表。
  3. 通过消除,列表中的第一个节点是偶数。捕获从下一个节点开始的偶数值列表(递归)。使当前节点的下一个指针 (link) 指向干净列表,并返回当前节点作为(现在干净的)列表的开头。

关于c - 链接列表递归函数,从列表中删除奇数值。 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59953206/

相关文章:

c# - Linq - 对列表的列表进行操作

c++ - 递归函数返回一个 nan (c++)

c - 为什么 C 中的递归函数将控制权返回给 main,而不是先前的调用?

haskell - Haskell中通用多态ADT的仿函数实例?

python - 查找列表元素的所有组合,包括重复元素

c - 带字符的链表(字符串问题

python - numpy 和 ctypes : dealing with views

c - 为什么 C 没有二进制文字?

java - 尝试从文本文件中读取

c - C 中的 pthread,不兼容的类型