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

时间:2015-10-01 10:17:02

标签: c++ linked-list

我正在编写一个程序,该程序应该允许用户将课程输入到链接列表(addCourse)并返回链接列表中放置的所有数据(displayAll)。我正在尝试将所有新课程数据放在链表前面,这意味着每次添加新课程时都会推送旧数据。

我是C ++的新手(来自Java)所以,如果这一切看起来都是基本的,我会道歉。

我要做的是:

  • 在主(完成)中创建新节点。
  • 现在列出名单(完成)
  • 创建新节点(完成)
  • 创建名为 temp 的指针,并将该点指向新节点(完成)
  • temp 指向列表的头部(完成)
  • 用户输入的任何数据都会被放入节点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。

如果这对你们来说这看起来很简单,我再次道歉。我对此很新。这是我整周聚集的程序的一部分(因为你可能已经从启动函数中注意到了)。非常感谢你。

1 个答案:

答案 0 :(得分:0)

main函数启动时,变量head的值为 indeterminate ,在没有初始化的情况下以任何方式使用它会导致未定义的行为。据我所见,你永远不会初始化它。您应该初始化为空指针,例如nullptr0

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