我正在编写一个程序,该程序应该允许用户将课程输入到链接列表(addCourse)并返回链接列表中放置的所有数据(displayAll)。我正在尝试将所有新课程数据放在链表前面,这意味着每次添加新课程时都会推送旧数据。
我是C ++的新手(来自Java)所以,如果这一切看起来都是基本的,我会道歉。
我要做的是:
用户输入的任何数据都会被放入节点temp指向(在这种情况下,头部)(完成)
完成后,temp应该创建并指向一个新的空节点(下次用户输入一些东西)并使之成为列表中下一个节点的头部。 (不确定我的代码是否正确使用此部分) 。
我相信这被称为虚拟节点。
到目前为止,这是我的代码:
标题
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中崩溃。我之前使用的是XCode。
如果这对你们来说这看起来很简单,我再次道歉。我对此很新。这是我整周聚集的程序的一部分(因为你可能已经从启动函数中注意到了)。非常感谢你。
答案 0 :(得分:0)
当main
函数启动时,变量head
的值为 indeterminate ,在没有初始化的情况下以任何方式使用它会导致未定义的行为。据我所见,你永远不会初始化它。您应该初始化为空指针,例如nullptr
或0
。
你也在按值传递参数时遇到问题,这意味着传递给函数的参数是复制,并且正在改变副本(例如,在head
函数中重新分配addCourse
)不会更改原始文件。您需要通过引用传递一些变量。