我正在编写一个程序,该程序应该允许用户将课程输入到链表(addCourse)并返回链表(displayAll)中的所有数据。我试图将所有新课程数据放在链表前面,这意味着每次添加新课程时,旧数据将被推回。
我对c++相当陌生(来自Java),所以如果这些看起来都很初级,我很抱歉。
我要做的是:
- 在main (Done)创建一个新节点。
- 使其成为当前列表的头部(Done)。
- 创建新节点(Done)。
- 创建一个名为temp的指针,并使该指针指向新节点(Done)。
- 使temp指向列表的头(Done)。
-
用户输入的任何数据都将被放入节点temp所指向的(在本例中为头部)(Done)
-
完成后,temp应该创建并指向一个新的空节点(用于下一次用户输入内容),并将过去的head作为列表中的下一个节点。(不确定我是否在我的代码中得到了这部分)
我相信这被称为虚拟节点。
下面是目前为止的代码: 头:struct node
{
string department;
int number;
string grade;
node* next;
};
主要:
int main()
{
string department;
int number;
string grade;
node* head;
int n;
cout << "1 - Insert a Course" << endl;
cout << "2 - Remove a Course" << endl;
cout << "3 - Display Course List (All)" << endl;
cout << "4 - Display Course List (Department)" << endl;
cout << "5 - Quit this Program" << endl;
start(head, n, department, number, grade);
return 0;
}
"开始"功能:
// start of the program
void start(node* &head, int n, string department, int number, string grade)
{
cout << "Please enter a number: ";
cin >> n;
if (n == 1)
{
addCourse(department, number, grade);
}
else if (n == 2)
{
removeCourse(head, department, number);
}
else if (n == 3)
{
displayAll(head);
}
else if (n == 4)
{
displayDep(head, department);
}
else if (n == 5)
{
quitProgram();
}
else
{
cout << "Invalid input. Please try again." << endl;
cin.get();
start(head, n, department, number, grade);
}
start(head, n, department, number, grade);
}
addCourse(功能):
void addCourse(node* head, string department, int number, string grade)
{
// make temp point to the head of the list
node* temp = head;
cout << "Department: ";
cin >> department;
cout << "Number: ";
cin >> number;
cout << "Grade: ";
cin >> grade;
// put data in the head of the list
temp->department = department;
temp->number = number;
temp->grade = grade;
// create a new node for later
temp = new node;
temp->next = head;
head = temp;
}
关注函数(displayAll)
// displays all data
void displayAll(node* head)
{
// **Area of concern
node* temp = head;
temp = head->next;
// I'm trying to print data starting from the second node in the list
// since the first is technically empty. The program compiles but I
// get an error when I try to run that part of the code.
while (temp != NULL)
{
cout << "Department: " << temp->department << endl;
cout << "Number: " << temp->number << endl;
cout << "Grade: " << temp->grade << endl;
temp = temp->next;
}
}
我试图从列表中的第二个节点开始打印,因为第一个节点是空的(一个虚拟节点),但每当我尝试这样做时,程序总是失败。我写的那部分代码正确吗?稍后我将包括错误。
更新:是的。没有错误。当你试图运行displayAll时,它会在Visual Studio中崩溃。
如果这对你们来说很简单,我再次道歉。这方面我还是新手。这是我整个星期都在编写的程序的一部分(你可能已经从start函数中注意到了)。非常感谢。main
函数启动时,变量head
的值为不确定,未经初始化的任何方式使用都会导致未定义行为。据我所知,你从来没有初始化它。您应该初始化为空指针,例如nullptr
或0
。
你也有一个通过值传递参数的问题,这意味着你传递给函数的参数是复制的,并且更改副本(例如在addCourse
函数中重新分配head
)不会改变原始的。您需要通过引用传递一些变量。