2014-06-19 80 views
0

所以我剛開始學習C++的LinkedLists。我知道C +有一個庫,但我試圖專注於LinkedLists。我看到的一個練習要求您設計一個帶有2個成員函數和默認構造函數的鏈接列表類:add,isMember和LinkedList()構造函數。添加功能將新節點添加到列表的前面。 isMember測試以查看列表是否包含傳入的要添加的值的節點。我的問題是,我在結構中創建ListNode *頭,然後我嘗試在LinkedList構造函數中訪問它以將其設置爲null,它向我拋出「未聲明的標識符」的錯誤。即使我在結構中將它設置爲NULL,它也會給我提供相同的錯誤。如果我在構造函數中編寫「ListNode * head = NULL」,錯誤就會消失,但是隨着使用「未聲明的標識符」頭部,我的add方法仍然瘋狂。 這是我走到這一步:在類中訪問struct成員,LinkedList節點

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 
} 

任何線索,爲什麼這是將是一個巨大的幫助。謝謝!

+2

'head'是'ListNode'成員,而不是'LinkedList'。 'ListNode'有一個'head'真的沒有意義。 – ghostofstandardspast

回答

1

您聲明瞭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; 
} 
0

你可能想頭成爲其成員LinkedList,而不是ListNode。

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