2017-11-01 3 views
0

リンクリストプログラムに問題があります。プログラムは、ユーザーに異なるタイプのデータを要求します。 1つのノードだけを含むリストを表示しようとするとうまく動作します。しかし、別のノードを追加すると、直後にプログラムがクラッシュします。複数のノードを持つListを表示するとC++のリンクリストがクラッシュする

私はちょうどint値でプログラムを試しました、そして、それは完璧に動作するようです。私は5つの値が1つのノードにあるときになぜそれができなかったのか分かりません。

#include <cstdlib> 
#include <iostream> 
#include <string> 
using namespace std; 

class List 
{ 
private: 
    typedef struct node 
    { 
     int data, year; 
     char gender; 
     string name, degree; 
     node* next; 
    }*nodeptr; 

    nodeptr head; 
    nodeptr curr; 
    nodeptr temp; 

public: 
    List(); 
    void AddNode(int adddata, string addname, char addgender, string adddegree, int addyear); 
    void DeleteNode(int deldata); 
    void SearchNode(int searchdata); 
    void PrintList(); 
}; 

List::List() 
{ 
    head = NULL; 
    curr = NULL; 
    temp = NULL; 
} 

void List::AddNode(int adddata, string addname, char addgender, string adddegree, int addyear) 
{ 
    nodeptr n = new node; 
    n->next = NULL; 
    n->data = adddata; 
    n->name = addname; 
    n->gender = addgender; 
    n->degree = adddegree; 
    n->year = addyear; 

    if (head != NULL) 
    { 
     curr = head; 
     while (curr->data != NULL) 
     { 
     curr = curr->next; 
     } 
    curr->next = n; 
    cout << "Student " << n->data << " was added.\n\n"; 
    } 
    else 
    { 
     head = n; 
     cout << "Student " << n->data << " was added.\n\n"; 
    } 
} 

void List::DeleteNode(int deldata) 
{ 
    nodeptr delptr = NULL; 
    temp = head; 
    curr = head; 

    while (curr != NULL && curr->data != deldata) 
    { 
     temp = curr; 
     curr = curr->next; 
    } 

    if (curr == NULL) 
    { 
     cout << "Student " << deldata << " was not in the list\n"; 
     delete delptr; 
    } 
    else 
{ 
     delptr = curr; 
     curr = curr->next; 
     temp->next = curr; 
     if (delptr == head) 
     { 
      head = head->next; 
      temp = NULL; 
     } 
     delete delptr; 
     cout << "Student " << deldata << "was deleted.\n"; 
    } 
} 

void List::SearchNode(int searchdata) 
{ 
    nodeptr searchptr = NULL; 
    temp = head; 
    curr = head; 

    while (curr != NULL && curr->data != searchdata) 
    { 
     temp = curr; 
     curr = curr->next; 
    } 

    if (curr == NULL) 
    { 
     cout << "Student " << searchdata << " was not in the list\n"; 
     delete searchptr; 
    } 
    else 
    { 
     cout << "Student name: " << curr->name << "\nStudent Number: " << curr->data << "\nGender: " << curr->gender << "\nDegree: " << curr->degree << "\nYear of Graduation: " << curr->year << endl << endl; 
} 
} 
void List::PrintList() 
{ 
    curr = head; 
    while (curr != NULL) 
    { 
     cout << "Student name: " << curr->name << "\nStudent Number: " <<  curr->data << "\nGender: " << curr->gender << "\nDegree: " << curr->degree << "\nYear of Graduation: " << curr->year << endl << endl << endl; 
    curr = curr->next; 
    } 
} 

void main() 
{ 
    List List; 
    int c = 0, d; 
    int data, year; 
    char gender; 
    string name, degree; 

    do 
    { 
     do 
     { 
      cout << "[1] Add Student\n[2] Delete Student\n[3] Search  Student\n[4] Print Students\n[5] Exit\n"; 
      cin >> c; 
     } while (c < 1 || c > 4); 

     if (c == 1) 
     { 
      system("cls"); 
      cout << "Enter Student Number: "; 
      cin >> data; 
      cin.ignore(); 
      cout << "Enter Student's Name: "; 
      getline(cin, name); 
      cout << "Enter Student's Gender: "; 
      cin >> gender; 
      cin.ignore(); 
      cout << "Enter Student's Degree: "; 
      getline(cin, degree); 
      cout << "Enter Student's Year of Graduation: "; 
      cin >> year; 
      system("cls"); 
      List.AddNode(data, name, gender, degree, year); 
     } 
     if (c == 2) 
     { 
      system("cls"); 
      cout << "Enter entry you want to delete: "; 
      cin >> d; 
      system("cls"); 
      List.DeleteNode(d); 
     } 
     if (c == 3) 
     { 
      system("cls"); 
      cout << "Enter Student Number: "; 
      cin >> data; 
      List.SearchNode(data); 
     } 
     if (c == 4) 
     { 
      system("cls"); 
     List.PrintList(); 
     } 
     if (c == 5) 
     { 
      exit(0); 
     } 
    } while (c != 5); 
} 
+0

あなたはコードをデバッグしようとしましたか? –

+0

また、失敗したサンプル入力も提供してください –

+0

ポインタをtypedefしないでください。これはその本質を隠し、コードを読みにくくします: 'void(def d){d-> x; } '一見すると、あなたは価値によって与えられていることを期待していますが、逆参照する必要があります。または、 'operator->'のカスタムオーバーロードがありますか? – Aconcagua

答えて

0

List::AddNode()では、で最後のノードをチェックしているcurr->data != NULL代わりに【選択curr->next != NULLの最後のノードのdatanullではありません、あなたはcurrからNULLを割り当てることになると、その後にアクセスしようとしますNULL->data

if (head != NULL) 
{ 
    curr = head; 
    while (curr->data != NULL) // should be curr->next 
    { 
     curr = curr->next; 
    } 
    // ... 
} 
+0

あなたは正しいです!私の問題は解決しました、ありがとう! –

関連する問題