我创建了一个链表类来练习泛型编程。下面的代码编译,但我的主要测试是不打印任何东西到控制台,就像它应该。知道为什么吗?我知道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;
}
答案 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