使用类(OOP)的C ++链接列表

时间:2017-03-05 21:08:33

标签: c++ oop data-structures linked-list

这是我在StackOverflow上的第一篇文章,因为我真的被卡住了。 我的问题是,每次运行以下代码时,在第一次调用函数InsertNode()时,返回临时节点都具有下一个节点和数据的正确值。但是,当再次调用该函数时,由于某些原因,头被重置为数据NULL,而下一个指针递归地指向同一地址。我在OOP中很难实现这一点,我已成功使用普通结构。但是对于OOP,我很困惑如何在main中声明Node * Node :: InsertNode(Node * head)方法,因为我得到一个错误,即InsertNode未声明。因此,作为一种解决方法,我将Node类外部的InsertNode声明为独立函数。我有一种感觉,这可能是导致问题的原因。我会很感激在我的代码中发生的事情或我应该改变的一些帮助。谢谢!

hashtable.cpp

benef

Hashtable.hpp

#include "Hashtable.hpp"
using namespace std; 
Node::Node(){

    data = NULL;
   Node* nextP = NULL;
};

Node::~Node(){

}

Node* InsertNode(Node* head, int data){

    Node* temp = new Node();

    if(head->nextP == NULL){

        head->data = data;
        temp->nextP = head;
        head = temp;

    } else if(head->nextP!=NULL){

        temp->nextP = head;
        temp->data = data;
        head = temp;
    }

    return head;
};

void Node::printNode(Node* head){
    Node* temp = new Node();
    temp = head;
    while(temp->nextP != NULL){
        printf("%d\n", temp->data);
        temp = temp->nextP;
    }
}

的main.cpp

#ifndef Hashtable_hpp
#define Hashtable_hpp

#include <stdio.h>

class Node
{
public:
    Node* nextP;
    Node();
    ~Node();

    void printNode(Node* head);
    int data = NULL;

    private:


};
Node* InsertNode(Node* head, int data);

#endif /* Hashtable_hpp */

1 个答案:

答案 0 :(得分:0)

所以我终于弄明白了这个问题。由于最初我直接引用了类函数InsertNode(),所以我试图避免使用未声明的标识符时我得到的错误。因此,作为一种解决方法,我将函数移到了类声明之外,这会导致更多问题,如上所述。现在我意识到当函数存在于Class中时,我通过首先取消引用(我的术语可能是错误的)使用以下函数引用它:head-&gt; InsertNode(head,data); 我最初尝试不同迭代的InsertNode(&amp; head,data)或Node * InsertNode(&amp; head,data)...等等。基本上试图通过编译器暴力破解:)。

我附上以下代码,请告诉我您对我可以改进的内容的评论。

Hashtable.cpp

#include "Hashtable.hpp"
#include <iostream>

using namespace std;

Node::Node(){

    data = NULL;
    Node* nextP = NULL;
};

Node::~Node(){

}

Node* Node::InsertNode(Node* head, int data){
    Node* temp = new Node();
    if(head->nextP == NULL){
        head->data = data;
        temp->nextP = head;

    } else if(head->nextP!=NULL){
        temp->nextP = head;
        temp->data = data;
    }

    return temp;
};


void Node::printNode(Node* head){
    Node* temp = new Node();
    temp = head;
    while(temp->nextP != NULL){
        printf("%d\n", temp->data);
        temp = temp->nextP;
    }
}

Hashtable.hpp

#ifndef Hashtable_hpp
#define Hashtable_hpp

#include <stdio.h>
#include <iostream>

using namespace std;

class Node
{
    int data = NULL;
    Node* nextP;
public:

    Node();
    ~Node();
    Node* InsertNode(Node* head, int data);
    void printNode(Node* head);
        private:
};


#endif /* Hashtable_hpp */

的main.cpp

#include <iostream>
#include "stdio.h"
#include <string>
#include "Hashtable.hpp"

using namespace std;
Node* head = new Node();

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    Node temp2;
    head =  head->InsertNode (head, 10);
    head =  head->InsertNode (head, 20);
    head =  head->InsertNode (head, 30);
    head =  head->InsertNode (head, 40);
    head =  head->InsertNode (head, 50);
    head =  head->InsertNode (head, 60);
    head =  head->InsertNode (head, 70);
     head->printNode(head);

    return 0;