c ++中类和对象的新手

问题描述 投票:-1回答:3

我是C ++中的类和对象的新手。我无法理解为什么没有创建链表。它只是提示第一个值然后崩溃。我无法弄清问题在哪里,已经浪费了太多时间。最后决定得到一些帮助。感谢您的时间。

 #include <iostream>
 using namespace std;

 class Node{
 private:
     int data;
     Node* next;
     Node* previous;

 public:

     Node(int value){
        data = value;
        next = NULL;
        previous = NULL;
     }

     void setValue(int value)
     {
        data = value;
     }

     int getValue()
     {
         return data;
     }

     Node* getNext()
     {
         return next;
     }

     void setNext(Node* address)
     {
         next = address;
     }

     Node* getPrevious(){
        return previous;
     }

     void setPrevious(Node* address){
        previous = address;
     }

 };


class LinkedList{
private:
    Node* head;
    Node* tail;

public:

    LinkedList(){
        Node* head = NULL;
        Node* tail = NULL;
    }



    void createLinklist(){

        int n;
        cout << "Enter the number of nodes = ";
        cin >> n;



        for(int i=0;i<n;i++)
        {
            int value;
            cout << "Enter the value at " << i <<"=";
            cin >> value;

            Node* node = new Node(value);

            if(head == NULL)
            {
                head = node;
                tail = node;
            }
            else{
                insertAtEnd(node,tail);
            }

        }

    }


    void insertAtEnd(Node* newNode,Node* lastNode)
    {
        lastNode->setNext(newNode);
        newNode->setPrevious(lastNode);
        newNode->setNext(NULL);
        tail = newNode;


    }




    void display(){

    Node* start = head;

    while(start!=NULL)
    {
        cout << "Address=" << start << endl;
        cout << "value = " << start->getValue() << endl;
        cout << "Next = " <<  start->getNext() << endl;
        start = start->getNext();

    }

    }


};


 int main(){

    LinkedList newLink;
    newLink.createLinklist();
    newLink.display();

 }
c++ class object data-structures
3个回答
2
投票

Problem

LinkedList(){
    Node* head = NULL;
    Node* tail = NULL;
}

Node* head = NULL;告诉编译器创建一个名为head的新自动变量,它是指向Node的指针并将此新变量设置为NULL。这个新的head shadows LinkedList::head,替换为其余的构造函数。结果是head一个只存在于构造函数体内的变量,得到了针对LinkedList::head的初始化(赋值)。

这意味着当你到达

if(head == NULL)

createLinklistLinkedList::head可能不是NULL而是指向野生蓝色的那边,所以程序执行

insertAtEnd(node,tail);

LinkedList::tail遭遇与LinkedList::head相同的命运,可能指向你无法安全写的地方。该程序可能在此时崩溃,但它可能会覆盖其他重要的东西并导致程序稍后崩溃,隐藏错误的真实位置。

Solution

LinkedList(){
    head = NULL;
    tail = NULL;
}

指定NULL toheadandtail`。更惯用的方法是使用Member Initializer List

LinkedList(): head(NULL), tail(NULL)
{
    // does nothing.
}

Sidenote

出现警告级别的好编译器会警告你

Node* head = NULL;

没有做任何有用的事情。永远不要忽略编译器警告。编译器警告意味着虽然您的程序在语法上可能正确,但它可能不会执行您希望它执行的操作。警告是您抵御逻辑错误的第一道防线。始终尝试理解并解决编译器告诉您的内容。它可以节省您以后的调试时间。


1
投票

问题是你的构造函数:

class LinkedList{
private:
    Node* head;
    Node* tail;

public:

    LinkedList(){
        Node* head = NULL;
        Node* tail = NULL;
    }

在构造函数中,您将两个LOCAL变量声明为NULL而不是类。这意味着类别指向任何地方,但很可能不是NULL。

建议:学习C ++ 11或更高版本。

  • 使用类成员初始化。
  • 使用nullptr而不是NULL
  • 避免使用new和delete。在处理指针时学习默认使用std :: unique_ptr,虽然我理解你想要学习如何处理指针的用例而且std :: unique_ptrs实际上不是链接列表节点的可行解决方案。没有唯一的指向..所以忘记这个用例的建议,但仍然当你想要新的东西,总是问,我不应该使用std :: unique_ptr而不是?

基本上C ++ 11允许你这样做:

class LinkedList{
private:
    Node* head = nullptr;
    Node* tail = nullptr;

并且在您的情况下您不需要构造函数,尽管添加以下是一个好习惯:

LinkedList() = default;

如果你想使用默认的。


0
投票

将您的代码更改为

    LinkedList(){
         head = NULL;
         tail = NULL;
    }

因为你已经定义了headtail

© www.soinside.com 2019 - 2024. All rights reserved.