【问题标题】:How to write a method definition for a recursive function?如何为递归函数编写方法定义?
【发布时间】:2014-05-21 01:51:30
【问题描述】:

我有一个作业问题是:

Destructor_Helper 是一个递归函数,用于释放单链表的每个节点。为 destructor_helper 编写方法定义。

 struct Node
 {
      string data;
      Node *next;
 }

 void List::~List()  {
     destructor_helper(head);
 }

我的回答是:

     void Destructor_Helper(Node *n) {
     cout<< n->data << endl;
     if (n->next != NULL)
          Destructor_Helper(n->next);
 } 

我的答案算错了,有人能帮我找出问题所在吗?

【问题讨论】:

  • 提示:你在哪里取消分配?
  • 它实际上并没有删除任何东西。
  • 所以通过添加“delete n;”函数正确吗?
  • 不删除就不能正确。通过添加删除,并正确地做事,它会是正确的。如何做对,这就是任务的全部内容。
  • 是的。你为什么不试试呢?拿一支铅笔,用喜欢的列表中的 3 个元素绘制一个简单的案例,解决方案将变得显而易见。

标签: c++ recursion data-structures


【解决方案1】:

你的答案被算错了,因为你没有做任何释放。

要释放链表,您可以存储下一个节点,释放当前节点,然后递归地访问下一个节点。我会这样:

void destructor_helper(Node *n) {
    if (n == NULL) return;
    Node* next = n->next;
    delete n;
    destructor_helper(next);
} 

您可以轻松发现递归的基本情况,即当前节点为NULL 时。那时我们只需要返回。然后,我们将下一个节点存储在名为next 的局部变量中,并删除当前节点。 next 局部变量可以是NULL,没关系。然后我们递归地传递next 以删除列表的其余部分。

【讨论】:

  • 将其更改为 void List::destructor_helper(Node *n) 是否重要?
  • @user3467152,一点也不。
【解决方案2】:

** 剧透 **

void Destructor_Helper(Node *n) {
    cout<< n->data << endl;
    if (n->next != NULL)
    {
        Destructor_Helper(n->next);
    }
    delete n;
}

应该做的伎俩。

【讨论】:

  • void List::Destructor_Helper(Node *n) 怎么样
  • 它工作没关系。我刚刚复制了您的方法并添加了delete n;。事实上 Destructor_Helper() 应该 是 List 的一个方法来封装它的功能。所以这对设计很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多