【问题标题】:C++ Creating a linked list using recursive functionC ++使用递归函数创建链表
【发布时间】:2015-07-01 07:51:37
【问题描述】:

您好,我是学习 C++ 的初学者 我正在尝试使用递归函数创建一个链表 我虽然得到了或多或少的指针、链表、数据结构等,但我被困了 2 天。

这是我的完整代码。

我基本上想要做的就像我说的只使用递归函数创建一个链表。 问题是我的指针变量'head'总是指向NULL,我不知道为什么,我想我误解了很多东西,但我根本不知道是什么......而且我尝试更多我得到困惑。

这一定是个新手问题,但如果有人能帮助我,我真的很感激。

#include <iostream>

using namespace std;

struct linkedlist
{
    int value;
    linkedlist *next;
};

void insertNode(linkedlist* temp)
{
    if (temp->next != NULL)
    {
        insertNode(temp->next);
    }
    else
    {
        temp->next = new linkedlist;
        temp->next->value = 0;
        temp->next->next = NULL;
    }

}


linkedlist *addNode(linkedlist *temp)
{ 
    if (temp == NULL)
    {
        linkedlist *newelement = new linkedlist;
        newelement->value = 0;
        newelement->next = NULL;
        temp = newelement;

        return newelement;
    }
    else
    {
        insertNode(temp);
    }
}

void displaylist(linkedlist *temp)
{
    while (temp != NULL)
    {
        cout << temp->value << endl;
        temp = temp->next;
    }
}

int main()
{
    linkedlist *head = NULL;

    linkedlist *element1 = addNode(head);
    linkedlist *element2 = addNode(head);
    linkedlist *element3 = addNode(head);
    linkedlist *element4 = addNode(head);
    linkedlist *element5 = addNode(head);

    cin.ignore();
    cin.get();
}

【问题讨论】:

  • 你得到什么错误?
  • 请记住,递归会对您的列表造成严格的大小限制。如果列表中有太多元素,您将收到 StackOverflowException。考虑避免递归。

标签: c++ recursion linked-list


【解决方案1】:

您正在尝试修改您传递给addNode 的指针,但该指针是按值传递的,因此您不会在调用站点看到修改。

要解决这个问题,请通过引用获取指针:

linkedlist *addNode(linkedlist*& temp)

【讨论】:

  • 这正是我所缺少的,我实际上在任何地方都找不到......我现在是超级初学者,但我希望有一天我可以像你一样编程!
  • 对我帮助很大,非常感谢。我最终会通过引用对这个指针提出疑问。它完美地解决了我的问题,我发现如果我在其他函数上再次使用这个“头”变量来打印我的列表,它工作正常。我的问题是,这个变量怎么可能指向列表的起始元素,因为我没有看到任何代码使它指向它......瞧,另一个非常新手的问题
  • (我想输入以腾出空间,它刚刚输入了我的评论)我的意思是这很酷,一切正常,但我想知道它是如何指向起始元素的。
  • 毕竟我被困在这一章里至少三天了,其实你不知道你帮了我多少!谢谢^^!
  • 它指向列表的开头,因为第一次调用addNode 将一个节点分配到head,然后后续调用将节点附加到该节点的末尾。
【解决方案2】:

您的代码没有多大意义。例如函数addNode 应该有一个参数,用于添加到列表中的值。也不需要有两个函数addNodeinsertNode,因为它们的作用相同(至少在你的函数实现中)。如果你想拥有一些功能insertNode,那么它应该有不同的语义。

这是一个演示程序,展示了如何编写函数addNode。您可以将其用作程序的模板。在这个演示程序中,函数displayList 也是递归的。当然,您还需要编写删除所有节点的函数。它也可以是递归的。

#include <iostream>

struct linkedlist
{
    int value;
    linkedlist *next;
};

linkedlist * addNode( linkedlist *head, int value )
{
    return head == nullptr 
           ? ( new linkedlist { value, nullptr } )
           : ( head->next = addNode( head->next, value ), head );
}

void displayList( linkedlist *head )
{
    if ( head == nullptr )
    {
        std::cout << std::endl;
    }
    else
    {
        std::cout << head->value << ' ';
        displayList( head->next );
    }
}

int main()
{
    linkedlist *head = nullptr;

    for ( int x : { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } ) head = addNode( head, x );
    displayList( head );
}

程序输出是

0 1 2 3 4 5 6 7 8 9

【讨论】:

  • 非常感谢您的回复!我根据您的建议更改了我的一些代码,实际上是的,我不需要 2 个函数用于“addNode”。
  • 但是我还没有了解您编写的一些代码,例如 nullptr 以及它下面的代码,例如 '?'和 ':' 但我真的很感谢你的建议。我希望我能再次得到你的帮助^^
  • @Hwabum Kim 你可以用 nullptr 代替 NULL。至于? and : 那么就是所谓的条件运算符。相当于下面的语句 if ( head == NULL ) { return new linkedlist { value, NULL }; } else { head->next = addNode(head->next, value);返回头; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2010-11-21
  • 2017-07-08
  • 2021-03-07
  • 2021-04-18
相关资源
最近更新 更多