【问题标题】:Linked list recursion calling by reference in CC中通过引用调用链表递归
【发布时间】:2016-09-22 00:05:24
【问题描述】:

我正在练习使用 C 的链表。我是一名初学者程序员,两周前刚开始学习 C。

我非常了解链表的概念,我试图使用递归来反转链表。

我知道如何使用 while 循环来反转它,但是在我反转列表后如何将头指针指向最后一个数字地址而不是初始第一个数字地址。

下面是我的反向函数。头部在 main 中定义,我通过引用到我的函数中来调用它。我知道我可以通过按值调用它并只写 main() head=reverse(node* head); 来解决这个问题或者通过在动态内存中定义 head 并直接从函数中访问它。我不想那样做。我想通过 main 的引用和返回 void 的函数来调用它。

这是我的反向函数:

void reverse(struct node** head)
{   
    struct node* p=*head;


    if(p->link==NULL)
    {  *head=p;
        return;
    }

    reverse(&(p->link));
    p->link->link=p;
    p->link=NULL;


}

说清单是: 5 6 7 2 3 4 我在反向后得到的输出是: 5 我知道原因是因为头部仍然指向第一个数字地址。我无法弄清楚如何将其指向最后一个数字地址。当它破坏递归函数时,它应该在 if 语句中这样做。但它不起作用。

谢谢!

【问题讨论】:

  • 好吧,如果您以指定和反转列表的方式使用递归,则头部不应再成为头部,而链表的尾部将成为头部......那么曾经是头变成了尾巴,尾巴变成了头。为了获得新的头,您需要访问旧的尾节点
  • 是的,我知道,但是如何返回旧尾巴的地址?应该 *head=p;在 if 语句中是这样做的吗?
  • 如何返回tail的地址?好吧,如果您在最后一个节点上调用该函数,则返回该节点的地址。否则,请考虑要对递归调用返回的地址做什么。
  • 函数返回一个void,我无法通过递归调用返回地址。我的意思是如何访问原始头部的地址以便将其分配给尾部?

标签: linked-list


【解决方案1】:

新的头节点是旧的尾节点。旧尾巴仅在基本情况下才知道,这是递归的最深层,没有任何东西可以进一步递归。因此,您有两个选择:通过整个调用堆栈的引用使原始头部可用,以便基本情况可以重新分配它,或者将旧尾部返回调用堆栈,以便它可以在顶层进行重新分配。

【讨论】:

  • 我知道如何使用动态内存来解决它。但是我想通过知道如何访问原始头部的地址来更好地理解递归函数,以便将其分配给尾部。据我了解,该地址在从 main 引用调用时可​​用,然后将其分配给指针 p。每次将引用的地址更改为相邻节点时,该函数都会调用自身,直到它到达尾部(NULL)。然后它中断递归并展开递归,每次展开时地址都会反转,同时返回第一个节点。
  • 如何找回丢失的原始头部地址?
猜你喜欢
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2021-03-11
  • 2011-05-02
  • 2012-10-10
  • 2016-04-09
  • 2018-03-07
  • 2023-03-15
相关资源
最近更新 更多