2013-07-17 2 views
1

Я пытаюсь реализовать свою функцию отображения (в моем файле main.cc). Однако, когда я использую свой curr, указатель получает данные на моем объекте Student, а затем пересекает список, сбрасывает ядро ​​программы.Ошибка Seg в функции отображения для отдельного списка

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; 
} 

Я перечислю мои заголовки для моего узла и класса 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. 
}; 

терминальный выход

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

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

Пожалуйста, создайте конструктор для узла. Может быть, случай, когда вы не инициализировали Next to null; – madnut

+0

В то время как (сначала! = "-"); Я считаю, что сначала не инициализируется. – PunDefeated

+0

@madnut Добавлены конструкторы для обоих классов. –

ответ

1
  1. В конструкторе узла удаляемого данные для студента, так ваш узел :: данные указывают на недействительные памяти, так что, скорее всего, не функция отображения, которая засасывает , но удаление данных в конструкторе узла.
  2. Учитывайте
    2.1 Форматирование: между '.' Нет пробела. или '->' (операторы разыменования), потому что это делает код очень трудным для чтения.
    2.2 Использование конструкций C++ 11, таких как nullptr, вместо NULL
    2.3 разместить скобки вокруг ALL, если/для/while/... как в обслуживании кода люди могут добавлять вещи и удивляться, пока они не работают должным образом.
+0

Удаление строк «delete tempData» от обоих конструкторов исправило ошибку seg. Большое спасибо! –

+0

Я сделаю исправления для форматирования. Не знаете, как правильно использовать nullptr. Я посмотрю на это. –

+0

'nullptr' будет доступен только вам, если вы можете использовать компилятор C++ 11. Это ключевое слово, введенное с новым стандартом. – ogni42

 Смежные вопросы

  • Нет связанных вопросов^_^