C++ 为什么这个函数会导致崩溃?(多列表)

C++ 为什么这个函数会导致崩溃?(多列表),c++,linked-list,crash,C++,Linked List,Crash,我正在研究我的第一个多重列表,到目前为止,它只不过是一场噩梦。现在,我允许用户自己放置x、y点(班级编号、学生编号)。我的节点如下所示: typedef struct node { int student_number; int class_number; struct node* classpointer; struct node* studentpointer; }* nodePtr; 初始化为 List::L

我正在研究我的第一个多重列表,到目前为止,它只不过是一场噩梦。现在,我允许用户自己放置x、y点(班级编号、学生编号)。我的节点如下所示:

    typedef struct node {
        int student_number;
        int class_number;
        struct node* classpointer;
        struct node* studentpointer;
    }* nodePtr;
初始化为

List::List() {
    head = nullptr;
    currClass = nullptr;
    currStudent = nullptr;
}
要添加数据值和设置指针,我有两个函数

void List::addNodeToClass() {
    nodePtr n = new node;
    n->classpointer = NULL;

    cout << "What class number would you like to add?" << endl;
        int x;
    cin >> x;
    n->class_number = x;

    if(head != NULL) {
        currClass = head;
        while (currClass->classpointer != NULL) {
            currClass = currClass->classpointer;
        }
        currClass->classpointer = n;
    }
    else {
        head = n;
    }
}
void List::addNodeToClass(){
nodePtr n=新节点;
n->classpointer=NULL;
cout x;
n->class_编号=x;
if(head!=NULL){
类别=人头;
while(currClass->classpointer!=NULL){
currClass=currClass->classpointer;
}
currClass->classpointer=n;
}
否则{
水头=n;
}
}

void List::addNodeToStudent(){
nodePtr n=新节点;
n->studentpointer=NULL;
cout x;
n->学生人数=x;
if(head!=NULL){
学生=头;
while(currStudent->studentpointer!=NULL){
currStudent=currStudent->studentpointer;
}
currStudent->studentpointer=n;
}
否则{
水头=n;
}
}
我在menu()函数中对这两个函数进行函数调用,在main()中只调用menu()

int菜单(){
int输入;
名单;
while(输入!=3){

由于
addNodeToClass
函数从不设置
node->studentpointer
。因此,当您在
addNodeToStudent
中跟随该指针时,您正在取消对垃圾的引用。

使用默认的
节点
构造函数,您的代码会更安全:

typedef struct node {
    node()
    {
        student_number = 0;
        class_number = 0;
        classpointer = nullptr;
        studentpointer = nullptr;
    }
    int student_number;
    int class_number;
    struct node* classpointer;
    struct node* studentpointer;
}* nodePtr;

这将解决您的问题,因为这些属性并不总是在代码中初始化(
新节点
不会初始化
节点
属性,如果没有这样的构造函数).

您对两个列表使用相同的
head
变量,应该是这样吗?如果我正确思考逻辑,一个多列表应该像一个x,y平面,头部基本上是“0,0”,一个指针应该构建类列表(x),一个指针构建学生列表(y)顺便问一下,你必须自己列清单吗?为什么不简单地用两个,每个“清单”一个?我把列表放在引号内,因为你可能不必使用列表,向量也可以。你甚至不需要两个容器,一个就足够了。所以我需要以某种方式组合这两个函数吗?很难说,因为不清楚你的代码试图做什么。为什么节点中有两个指针这个列表应该是什么?应该是两个列表,一个是学生,一个是班级?还是应该是(学生,班级)的列表pairs?目前两者都不是。我相信这已经解决了它…让我不时重做我的打印功能,如果它工作正常,那么我爱你,我会将你的答案标记为正确。实际上,你所需要做的就是
新建节点()
(注意括号)而不是调用
新节点;
并初始化每个成员。parens值初始化成员。
int menu() {
    int input;
    List List;
    while (input != 3) {
        cout << " " << endl;
        cout << "Press '1' to input a node" << endl;
        cout << "Press '2' to view the list of nodes" << endl;
        cout << "Press '3' to exit" << endl;
        cout << " " << endl;
        cin >> input;
        if (input == 1) {
        List.addNodeToClass();
        List.addNodeToStudent();
        }
        else if (input == 2) {
        List.PrintList();
        }
        else if (input == 3) {
            return 0;
        }
        else {
        cout <<"That is an invalid key" << endl;
        }
    }
}
typedef struct node {
    node()
    {
        student_number = 0;
        class_number = 0;
        classpointer = nullptr;
        studentpointer = nullptr;
    }
    int student_number;
    int class_number;
    struct node* classpointer;
    struct node* studentpointer;
}* nodePtr;