1

表示機能を (main.cc ファイルに) 実装しようとしています。ただし、currポインターを使用してStudentオブジェクトのデータを取得し、リストをトラバースすると、プログラムのコア ダンプが発生します。

メイン.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

学生.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::Node() {
    next = NULL; //new Nodes go to the end of the list.
}

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

1 に答える 1

1
  1. ノードコンストラクターでは、学生のデータを削除しているため、 Node::data は無効なメモリを指しているため、おそらく表示機能ではなく、ノードコンストラクターでのデータの削除です。

  2. 2.1 フォーマットを考慮してください: 「.」の間にスペースを入れないでください。2.2代わりに2.3 の
    ように C++11 構造を使用する ALL if/for/while/... を括弧で囲む 人々が追加する可能性のあるコードのメンテナンスのように期待どおりに機能しない間、ものと不思議に思います。nullptrNULL
于 2013-07-17T06:39:12.683 に答える