2012-11-20 128 views
2

我遇到了顯示鏈接列表中數據的問題。我試圖在我的for循環中包含顯示循環,然後檢查指針和數據是否有問題,但我得到的結果相同。顯示鏈接列表

它顯示第一個數據,然後開始顯示亂碼。

#include <stdio.h> 
#include <conio.h> 
#include <iostream> 
#include <string> 

void main(void) { 
    clrscr(); 
    struct Student { 
     string Name; 
     double GPA; 
     Student *next; 
    }; 

    Student *head; 
    head = NULL; 

    int ch, i; 
    string name; 
    double gpa; 

    cout << "How Many Records Do You Want To Enter?"; 
    cin >> ch; 
    cout << endl; 

    for (i = 0; i < ch; i++) { 
     cout << (i + 1) << ". Name Of Student:"; 
     cin >> name; 
     cout << "GPA Of Student:"; 
     cin >> gpa; 
     cout << endl; 

     Student *newstudent; 
     Student *studentptr; 

     newstudent = new Student; 
     newstudent->Name = name; 
     newstudent->GPA = gpa; 
     newstudent->next = NULL; 

     if (!head) 
      head = newstudent; 
     else { 
      studentptr = head; 

      while (studentptr->next) { 
       studentptr = studentptr->next; 
      } 
      studentptr->next = new Student; 
     } 
    } 

    clrscr(); 
    Student *display; 
    display = head; 

    while (display) { 
     cout << "Name:" << display->Name << endl; 
     cout << "GPA:" << display->GPA << endl; 

     display = display->next; 
    } 
    getch(); 
} 

任何建議和指向正確的方向?

顯然我在跟着別人的教程,但是發生了這個錯誤。

+0

請更改'無效main'爲'INT main' –

+0

兩點意見:(1)學習來初始化聲明三分球,從而把他們的時間不定時期接近零; (c)**始終**檢查您的流操作是否成功。 – WhozCraig

回答

2

studentptr->next = new Student;應該studentptr->next = newstudent;

+0

我慢慢地來到它,但不錯的工作。 – PearsonArtPhoto

+0

現在我正式感覺像一個阻礙,嚴重優於隊友。我的頭還沒有到達正確的位置,我在這裏張貼之前認真瀏覽了一遍代碼。 –

+0

@MajorAly發生在我們所有人身上 - 有時只需要一雙新鮮的眼睛! – Rollie

2

由於問題是關於在正確的方向建議:

  1. 您需要總是的支票,你輸入了之後,你成功的嘗試讀取任何你想做的閱讀,例如,if (std::cin >> value) { ... }
  2. Do not use std::endl
  3. 您正在循環中創建多餘的Student對象。
  4. 您沒有將創建的Student對象與列表掛鉤。您可能打算在創建新對象的位置執行此操作。
+0

我實際上恢復了我的概念,所以我只是寫了一些像菜鳥這樣的代碼,而沒有真正關心當下的後果。 :) –

1

我有幾個建議,可以幫助:

struct Student { 
    string Name; 
    double GPA; 
    Student *next; 
    Student(const string& name, double GPA) : Name(name), GPA(GPA), next(NULL) {} 
    void print() { 
     cout << "Name:" << Name << endl; 
     cout << "GPA:" << GPA << endl; 
    } 
}; 

現在不是:

newstudent = new Student; 
    newstudent->Name = name; 
    newstudent->GPA = gpa; 
    newstudent->next = NULL; 

您只需編寫:

newstudent = new Student(name, gpa); 

做一個結構的列表:

struct StudentList { 
    Student* head; 
    Student* current; 

    StudentList() :head(NULL), current(NULL) {} 

    ~StudentList() {/*Delete list here*/} 

    void insert(string name, double gpa) { 
     if(!head) { 
      head = new Student(name, gpa); 
      current = head; 
     } else { 
      current->next = new Student(name, gpa); 
      current = current->next; 
     } 
    } 

    void display() { 
     Student *display = head; 
     while (display) { 
      display->print(); 
      display = display->next; 
     } 
    } 
}; 

有了這些你的主,現在應該是:

int main(void) { 
    clrscr(); 

    StudentList list; 

    int ch, i; 
    string name; 
    double gpa; 

    cout << "How Many Records Do You Want To Enter?"; 
    cin >> ch; 
    cout << endl; 

    for (i = 0; i < ch; i++) { 
     cout << (i + 1) << ". Name Of Student:"; 
     cin >> name; 
     cout << "GPA Of Student:"; 
     cin >> gpa; 
     cout << endl; 

     list.insert(name, gpa); 
    } 

    clrscr(); 
    list.display(); 
    getch(); 
} 
+0

有趣,顯示我已經忘記了多少。謝謝你的建議,一定會讓我更好。 –