当前位置: 首页 > 知识库问答 >
问题:

返回类型为NODE*的函数与C++中的OOP结合使用

夏建木
2023-03-14

我需要编写一个程序,它接受一个线性链表的实例,并删除列表中除最后两个项目以外的所有项目。我使用类在C++中完成了这一操作,因此我将有3个文件:main.cpp、list.h和list.cpp。不能有循环:我可以使用多个函数,但遍历部分必须是递归的。

我考虑了一下,得出的结论是:我必须有一个可以从main调用的公共函数,它不接受参数,名为void lastTwo()。我将有另一个私有函数node*lastTwo(node*&current,node*&tail),它将由lastTwo()调用,它将递归遍历列表并删除它所触及的节点,直到它到达列表中倒数第二个节点,然后它将返回该节点的地址。

然后,当它返回列表中倒数第二个节点的地址时,公共函数lastTwo()将捕获该地址并将head设置为等于该地址。

我遇到的问题是,我需要在vi中这样做,并从命令行编译和运行,而且我得到了一个分段错误,尽管我绘制了一个指针图,但我的代码找不到问题。

我正在我大学的学生服务器上研究这个问题,除了这两个函数之外,所有的数据结构实现都是由我的导师编写的,所以它们都很扎实。而且,每次运行a.out文件时,他们都会编写它来生成一个新的、随机的、非空的链表,至少包含5个节点。

我认为问题与返回类型为“node*”的函数有关,因为我在visual studio中也尝试过这样做,但它不允许我使用node*类型的函数。但是,我知道当你不使用类,只是把所有的东西放在一个文件中的时候,node*类型的函数起作用。

这是我的名单。H:

#include<iostream>

struct node
{
    int data;
    node* next;
};

class list
{
public:
    // these functions were already written by the school and included in the .o file
    list();
    ~list();
    void build();
    void display();

    // my functions
    void lastTwo();

private:
    node* head;
    node* tail;
    node* lastTwo(node *& current, node *& tail);
}

和list.cpp:

void list::lastTwo(){
    node* current = head;
    node * newHead = lastTwo(current, tail);
    head = newHead;
    delete newHead;
    head->next = tail;
}

node* lastTwo(node *& current, node *& tail){
    if(current->next == tail){
        return current;
    }
    else if(current->next != tail){
        node* temp = current;
        current = current->next;
        temp->next = NULL;
        delete temp;
        lastTwo(current, tail);
    }
    return NULL;
}

任何想法可能是什么问题,什么是正确的方式这样做,将是真正的赞赏!谢谢

共有1个答案

子车雅珺
2023-03-14

当递归展开时,问题就会发生。对LastTwo的大多数调用发生在Else If中。该基本情况是返回current的if,但触发基本情况的LastTwo调用总是在Else if结束时返回Null

假设这是到达基本大小写时的堆栈:

 lastTwo // Base case, returns current, but the call below this doesn't do anything with it.
 lastTwo // returns null
 ...
 lastTwo // returns null

该空值被其他lasttwo使用,您将得到您的seg错误。

 类似资料:
  • 问题内容: 我的包中有一个结构,上面有耗时的方法,通过工厂函数进行构造也很耗时。因此,在依赖于该其他结构的包中,我希望能够在创建后使用伪造的工厂函数和伪造的结构对其进行测试。由于结构是通过工厂函数构造的,因此我想伪造工厂函数,并在测试期间将替代工厂函数传递给我的结构。 昂贵的包装的一个例子是: 我的主包装使用以下代码: 但是,此代码抱怨以下错误: 。\ main.go:6:不能在字段值中使用昂贵的

  • 我正在讨论设计我们的API(Stream vs Collection作为返回类型)的最佳方式。这篇文章中的讨论非常有价值。 @BrainGotez的答案提到了一个条件,即集合优于流。我不太明白这意味着什么,谁能帮我举个解释的例子? 当有很强的一致性要求时,您必须生成移动目标的一致快照 我的问题是,具体而言,“强一致性要求”和“移动目标的一致快照”在现实应用中意味着什么?

  • 我正在尝试创建一个通用函数,它接受一个,并返回一个对象,该对象包含公共基类型的属性以及特定类型的默认值。出于某种原因,如果没有编译器的抱怨,我无法让它工作。我不确定问题出在哪里,但是 我怀疑这可能是将类型定义为条件类型的方式。我尝试过以各种方式重新定义我的类型,但没有成功,所以我怀疑我要么错过了一些明显的东西,要么没有类型断言是不可能的。 以下是我的类型: 以下是我的通用函数: 产生以下错误: 类

  • 我得到了这个错误:这个表达式的类型是'void',所以它的值不能被使用。尝试检查是否使用了正确的API;可能会有一个函数或调用返回您意想不到的void。还要检查类型参数和变量,它们也可能是空的。 代码: null null 我不明白这是什么。我是新手。这是我的第一个应用程序。有人能帮我一下吗。

  • 我目前正在学习C#,有人告诉我,可以使用explicit关键字重载方法返回类型,但他从未解释过如何重载。我搜索了所有地方,也阅读了一些关于stackoverflow的问题和答案,但我没有发现这样的事情,而且,在大多数情况下,回答的人说不可能通过返回类型重载方法。在这一切之后,我开始认为没有这种可能性。现在有人真的知道如何通过使用explicit关键字来重载方法返回类型了吗?或者这是可能的吗?先谢谢