无法分配给链表中的对象

时间:2017-04-12 01:20:10

标签: c++ c++11

正在填充头部和尾部,并打印出值,但nodePtr由于某种原因保持为空。当我在VS2015中进行调试时,头部和尾部编号会被填充,而字段则保持空白

这是Linked_List

#ifndef _LINKED_LIST_
#define _LINKED_LIST_

#include <iostream>

class LinkedList
{
public:

    struct Node
    {
        int number;
        Node * next;
        Node() : number(NULL), next(NULL) {};
        Node(int number_, Node * next_ = NULL)
        {
            number = number_;
            next = next_;
        }
    }*head, *tail, *nodePtr;


LinkedList();
~LinkedList();

void add(int num);

friend std::ostream& operator<<(std::ostream& out, LinkedList& list);

private:
    int size;
};

#endif // _LINKED_LIST_

实施档案

include "linkedlist.h"
#include <iostream>
using namespace std;

LinkedList::LinkedList() : head(NULL), tail(NULL), nodePtr(NULL) 
{
    nodePtr = new Node();
}

LinkedList::~LinkedList()
{
    Node * curr, *temp;
    curr = head;
    temp = head;

    while (curr != NULL)
    {
        curr = curr->next;
        delete temp;
        temp = curr;
    }
}


void LinkedList::add(int num)
{
    Node * newNode = new Node();
    newNode->number = num;
    cout << newNode->number;
    if (head == NULL)
    {
        head = newNode;
        tail = newNode;
        size++;
    }
    else
    {
        tail->next = newNode;
        newNode->next = NULL;
        tail = newNode;
        size++;
    }
    //cout << nodePtr->number; //empty, or some random
    //just some tests
    cout << head->number;
    if (head->next != NULL)
    {
        cout << head->next->number;
    }
    cout << tail->number;
    cout << endl;
}

std::ostream & operator<<(std::ostream & out, LinkedList & list)
{
    out << list.nodePtr->number << endl;
    return out;
}

Main.cpp的

#include <iostream>
#include "linkedlist.h"

using namespace std;

int main()
{
    int num;
    LinkedList list;

    list.add(1);
    list.add(2);
    list.add(3);
    cout << list;


    cout << "Press 1: ";
    cin >> num;
    return 0;
}

2 个答案:

答案 0 :(得分:2)

你在这里错过了一个基本概念。 nodePtr不是一个知道所有其他节点的神奇节点,或者知道链接列表,或者可以用来打印所有数字。

执行此操作时:

out << list.nodePtr->number << endl;

您所做的只是输出您在分配新Node时初始化的值并将指针存储在nodePtr中:

nodePtr = new Node();

调用Node的默认构造函数,将nodePtr->number设置为零。 (注意,您将其初始化为NULL,而不是0 - 您不应该将整数类型与指针类型混合,因此更改它以将值初始化为0)。

它的值保持为0,因为你永远不会修改它。并且nodePtr始终指向该单个节点,因为您从未修改过nodePtr

您真正想要做的就是打印出您的清单。让我建议通常的方法,从head开始并遵循节点链接:

std::ostream & operator<<(std::ostream & out, const LinkedList & list)
{
    for( Node *node = list.head; node != nullptr; node = node->next )
    {
        out << node->number << std::endl;
    }
    return out;
}

最后,我建议您完全从班级中删除nodePtr

答案 1 :(得分:0)

你只在构造函数中使用nodePtr,你永远不会改变它的值。