c++:尝试从链表中的第二个节点(虚拟节点)开始打印时出错



我正在编写一个程序,该程序应该允许用户将课程输入到链表(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的值为不确定,未经初始化的任何方式使用都会导致未定义行为。据我所知,你从来没有初始化它。您应该初始化为空指针,例如nullptr0

有一个通过值传递参数的问题,这意味着你传递给函数的参数是复制的,并且更改副本(例如在addCourse函数中重新分配head)不会改变原始的。您需要通过引用传递一些变量

相关内容

  • 没有找到相关文章

最新更新