我班级的成员职能不能正常运作。知道为什么吗?

时间:2014-01-21 05:49:20

标签: c++

我创建了一个链表类来练习泛型编程。下面的代码编译,但我的主要测试是不打印任何东西到控制台,就像它应该。知道为什么吗?我知道Stack Overflow不喜欢“修复我的bug”帖子,但我真的很茫然。

#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;
}

2 个答案:

答案 0 :(得分:0)

看这里:

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

您忘记为lastNodePtr分配值。因此,当您尝试在第二次调用push_back时取消引用它时,您会得到未定义的行为。

答案 1 :(得分:0)

在处理push_back中初始节点创建的块中,
你不想要这一行:

firstNodePtr->next = lastNodePtr;

此外,您需要在lastNodePtr = firstNodePtr;

的末尾设置push_back