我的类的成员函数无法正常工作。知道为什么吗?

The member functions of my class aren't working properly. Any idea why?

本文关键字:工作 为什么 成员 函数 常工作 我的      更新时间:2023-10-16

我做了一个链接的列表类来练习通用编程。以下代码编译,但是我在MAIN中的测试并没有像应该的那样向控制台打印任何内容。知道为什么吗?我知道堆栈溢出不喜欢"修复我的错误"帖子,但是我真的很茫然。

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

在这里看:

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

您忘记将值分配给lastNodePtr。因此,当您尝试在第二个呼叫push_back中将其解释时,您会得到不确定的行为。

在块中处理push_back中初始节点的创建,
您不想要这条线:

firstNodePtr->next = lastNodePtr;

另外,您需要在push_back

的末尾设置lastNodePtr = firstNodePtr;