簡體   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