繁体   English   中英

访问类LinkedList节点中的struct成员

[英]Accessing a member of struct in class, LinkedList Node

所以我只是开始学习C ++的LinkedLists。 我知道C +为他们提供了一个库,但我试图将重点放在LinkedLists上。 我看到的一个练习要求您设计一个具有2个成员函数和一个默认构造函数的链接列表类:add,isMember和LinkedList()构造函数。 添加功能将新节点添加到列表的最前面。 isMember测试以查看列表中是否包含带有要添加的值的节点。

我的问题是,我在结构中创建ListNode * head,然后尝试在LinkedList构造函数中访问它以将其设置为null,这使我抛出“未声明标识符”错误。 即使我在结构中将其设置为NULL,它也会给我同样的错误。 如果我在构造函数中编写“ ListNode * head = NULL”,该错误就会消失,但是我的add方法仍然对使用“未声明的标识符” head感到疯狂。 这是到目前为止我得到的:

LinkedList.h:

class LinkedList
{
protected:
    struct ListNode
    {
        double value;
        ListNode *next;
        ListNode(double value1, ListNode *next1 = NULL)
        {
            value = value1;
            next = next1;
        }
        ListNode *head;
    };
    // Public Interface
public:
    // Class Constructor(s)
    LinkedList();

    // Methods
    void add(double x);
    bool isMember(double x);

    // Private Class Members
private:
};

LinkedList.cpp:

#include "stdafx.h"
#include "LinkedList.h"  // Class Definition file

// Class Default Constructor
LinkedList::LinkedList()
{
    head = NULL;
}

// Class Destructor
LinkedList::~LinkedList(void)
{
    ListNode *nodePtr;
    while (nodePtr != NULL)
    {
        ListNode *garbage = nodePtr;
        nodePtr = nodePtr->next;
        delete garbage;
    }
}

void LinkedList::add(double x)
{
    ListNode *nodePtr, *prevNodePtr;
    if (head == NULL || head->value >= x)
    {
        head = new ListNode(x, head);
    }
    else
    {
        nodePtr = head->next;

        while (nodePtr != NULL && nodePtr->value < x)
        {
            prevNodePtr = nodePtr;
            nodePtr = nodePtr->next;
        }

        prevNodePtr->next = new ListNode(x, nodePtr);
    }
}
bool LinkedList::isMember(double x)
{
        //tbd
}

关于为什么这样做的任何线索都会有很大的帮助。 谢谢!

您声明了ListNode结构,但从未在任何地方声明任何具有ListNode类型的对象。 因此,当您尝试从LinkedList方法中访问head元素时,它实际上是未声明的标识符,因为LinkedList类没有任何名为head元素。

如果您要像这样更改LinkedList声明:

class LinkedList
{
protected:
    struct ListNode
    {
        double value;
        ListNode *next;
        ListNode(double value1, ListNode *next1 = NULL)
        {
            value = value1;
            next = next1;
        }
        ListNode *head = NULL;
    } node; // actually instantiating ListNode element as part of LinkedList class
    // Public Interface
public:
    // Class Constructor(s)
    LinkedList();

    // Methods
    void add(double x);
    bool isMember(double x);

    // Private Class Members
private:
};

那么您本可以以这种方式调用head元素:

LinkedList::LinkedList()
{
    node.head = NULL;
}

您可能希望head成为LinkedList的成员,而不是ListNode的成员。

class LinkedList {
    class ListNode {
        double value;
        ListNode *next;
    };
    ListNode *head;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM