单链表的显示功能中的段故障

时间:2013-07-17 04:24:07

标签: c++ nodes singly-linked-list

我正在尝试实现我的显示功能(在我的main.cc文件中)。但是,当我使用 curr 指针获取 Student 对象上的数据然后遍历列表时,程序核心转储。

MAIN.CC

#include "Node.h"
#include "Student.h"

using namespace std;

void append (Node **, Node *); //append Node to end of list.
void display(Node *); //print linked list.
void input(Student *); //enter new Student object.
void deleteNode(Node **, string); //delete specific Node.

string first;
string mid;
string last;
string ssn;
string age;

int main() {

    string flag; //flag checks for delimiter.
    string name;
    string stuDelete; //name to be deleted.

    Student * stuPtr = NULL;
    Node * head = NULL;
    Node * newPtr = NULL;

    do {
        stuPtr = new Student;
        input(stuPtr);
        flag = stuPtr ->getFirst(); //flag = first name

        if(stuPtr -> getFirst() == "-") { //"-" is delimiter
            cout << "in if statement\n";
            delete stuPtr; //no new Student, no more need for
                           //temporary Student pointer.
            stuPtr = NULL;
            cout << "checkpoint1" << endl;
        }
        else {
            newPtr = new Node(stuPtr);
            append(& head, newPtr);
            cout << "checkpoint 2" << endl;
        }
    } while (first != "-"); //will prompt for more entries unless
                           //delimiter is detected.

    cout << "checkpoint 3" << endl;
    display(head); // MY DISPLAY FUNCTION SUCKS

    if(head)
        cout << "Enter a Student to be deleted" << endl;
    while(head) {
        cout << "Last name: ";
        cin >> stuDelete;
        deleteNode(& head, stuDelete);

        string reqDelete; // asks if you want to keep deleting.
        cout << "Student has been deleted. Delete another? (Y/N)" << endl;
        cin >> reqDelete;

        if(head != NULL && reqDelete == "Y") {
            display(head); //iterates thru linked list
            cout << "\nEnter another name to be deleted: \n" << endl;
        }
        else if(reqDelete != "Y")
            cout << "Deletion complete.\n" << endl;
    }

    if(head)
        display(head);
    else
    cout << "The list is now empty.\n"
         << "=============================" << endl;

         return 0;

}

    void display (Node * newPtr) {

    Node * curr = newPtr; 

    while(curr != NULL) {
    // getData is used to point to the stud info in a node
    cout << "{" 
         << curr->getData()->getFirst() << ", "
         << curr->getData()->getMiddle() << ", "
         << curr->getData()->getLast()<< ", "
         << curr->getData()->getSocial()<< ", "
         << curr->getData()->getAge()
         << "}" << endl;    
    curr = curr->getNext(); // move to the next obj, traverse stud data
    }
    cout << "-----------------------------------------" << endl;
}

我将列出我的Node和Student课程的标题。如果这还不够,请告诉我。

NODE.H

class Node {

public:
    Node(); //Default constructor.
    Node(Student *); //New constructor.

    Student * getData(); //get data on Student object.
    void setData(Student *); //set data for Student object.

    Node * getNext();   //get the next Node in the linked list.
    void setNext(Node * );  //set the next Node in the list.

private:
    Student * data; //pointer to current Student data.
    Node * next; //pointer within Node to the next Node.

};

#endif

STUDENT.H

class Student {

public:
    Student(); //Default constructor;
    Student(const string &, const string &, const string &, 
        const string &, const string &); //New constructor.

    //setters
    void setName(const string &, const string &, const string &);
    void setSocial(const string &);
    void setAge(const string &);

    //getters
    string getFirst();
    string getMiddle();
    string getLast();
    string getSocial();
    string getAge();

private:
    string stuData[5]; //array of fields for Student data.
};

终端输出

faruki@ubuntu:~/DataStructures/Lab4$ ./a.out

Enter Student information (Enter '-' to exit)
First Name: jesus
Middle Name: h
Last Name: christ
Social: 222222222
Age: 222
==============================
checkpoint 2

Enter Student information (Enter '-' to exit)
First Name: -
Student entry finished.

==============================
in if statement
checkpoint1
checkpoint 3
Segmentation fault (core dumped)

学生班级的建构者

Student::Student() {
    stuData[0] = "Firstname";
    stuData[1] = "Middlename";
    stuData[2] = "Lastname";
    stuData[3] = "SSN";
    stuData[4] = "##";
}

Student::Student(const string & first, const string & mid, 
    const string & last, const string & ssn, const string & age) {

    setName(first, mid, last);
    setSocial(ssn);
    setAge(age);
}

NODE CLASS的结构

Node::Node() {
    next = NULL; //new Nodes go to the end of the list.
}

Node::Node(Student * tempData) {
    data = tempData;
    delete tempData;
    next = NULL;
}

1 个答案:

答案 0 :(得分:1)

  1. 在节点构造函数中,您正在删除Student的数据,因此您的Node :: data指向无效内存,因此很可能不是显示函数很糟糕,而是删除节点构造函数中的数据。
  2. 请考虑
    2.1格式:'。'之间没有空格。或' - &gt;' (取消引用运算符)因为这使得代码很难阅读 2.2使用C ++ 11结构,如nullptr而不是NULL
    2.3在所有if / / / while / ...周围放置括号,因为在维护代码时,人们可能会添加内容而不知道它是否按预期工作。