C++ 为什么这个函数会导致崩溃?(多列表)
我正在研究我的第一个多重列表,到目前为止,它只不过是一场噩梦。现在,我允许用户自己放置x、y点(班级编号、学生编号)。我的节点如下所示: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
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;