2014-01-21 45 views
0

我做了一個鏈表類來練習泛型編程。下面的代碼編譯,但我在主要的測試不打印任何東西到控制檯,就像它應該。任何想法爲什麼?我知道堆棧溢出不喜歡「修復我的錯誤」的帖子,但我真的在這裏虧本。我班的成員功能無法正常工作。任何想法爲什麼?

#include <iostream> 

template <class T> class List { 

public: 
    List(); 
    ~List(); 
    int getSize(); 
    void push_back(T); 
    bool contains(T); 

private: 
    struct node { 
     T val; 
     node* next; 
    }; 
    int size; 
    node* firstNodePtr; 
    node* lastNodePtr; 

}; 

template <class T> List<T>::List() { 
    size = 0; 
    firstNodePtr = NULL; 
    lastNodePtr = NULL; 
} 

template <class T> List<T>::~List() { 
    node* curNodePtr = firstNodePtr; 
    node* nextNodePtr; 
    while (curNodePtr) { 
     nextNodePtr = curNodePtr->next; 
     delete curNodePtr; 
     curNodePtr = nextNodePtr; 
    } 
} 

template <class T> int List<T>::getSize() { 
    return size; 
} 

template <class T> void List<T>::push_back(T newElement) { 
    if (size == 0) { 
     firstNodePtr = new node; 
     firstNodePtr->next = lastNodePtr; 
     firstNodePtr->val = newElement; 
     ++size; 
    } else { 
     node* newNode = new node; 
     lastNodePtr->next = newNode; 
     newNode->val = newElement; 
     newNode->next = NULL; 
     ++size; 
    } 

} 

template <class T> bool List<T>::contains(T thisElement) { 
    node* curNodePtr = firstNodePtr; 
    while (curNodePtr) { 
     if (curNodePtr->val == thisElement) 
      return true; 
     curNodePtr = curNodePtr->next; 
    } 
    return true;  
} 

int main (int argc, char* const argv[]) { 

    List<int> myList; 
    myList.push_back(5); 
    myList.push_back(18); 
    std::cout << myList.getSize() << std::endl; 
    std::cout << myList.contains(18); 

    return 0; 
} 
+0

當端設置lastNodePtr = firstNodePtr;你說它不打印任何東西,甚至不打印換行符? – IllusiveBrian

+0

你的調試器有什麼具體問題? –

+0

test.exe中的0x00B244E2未處理的異常:0xC0000005:訪問衝突寫入位置0x00000004。 是你從編譯得到的。 – Emz

回答

0

看吧:

if (size == 0){ 
    firstNodePtr = new node; 
    firstNodePtr->next = lastNodePtr; 
    firstNodePtr->val = newElement; 
    ++size; 
} 

你忘了一個值賦給lastNodePtr。因此,當您嘗試在第二次調用push_back時將其解除引用時,您會收到未定義的行爲。

0

在塊處理中push_back初始節點的創建,
你不想要這條線:

firstNodePtr->next = lastNodePtr; 

另外,你需要在push_back

相關問題