链表递归函数,用于从列表中删除奇数值。(C)
考虑像1->2->3->4->5这样的列表链表递归函数,用于从列表中删除奇数值。(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->
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()
的作用。它返回一个指向节点列表的指针,该列表为空或仅包含偶数值-一个“干净列表”
在内部,它通过三种不同的操作实现这一点:
链接
)指向清除列表,并返回当前节点作为(现在清除)列表的开始使用调试器并逐步完成它。这会告诉你发生了什么。这比解释要容易得多(也更好)。我会试试。在纸上画画,手动“执行”代码。我试过了,我不明白为什么在第一个循环之后,当我检查节点的值时,它给了我5。它是如何从1变为5的??tfSee-TL;答案通常是“否”,但函数指针可能是个例外。