0

こんにちは、私は学生の記録 (名前 ID gpa addr) を保持するための最初のリンクされたリストに取り組んでいますが、エラーが発生しています。エラーを見つけられるかどうか疑問に思っていましたか?

#include <iostream>
#include <string>

using namespace std;

int main()
{


struct Student
{
    string name;
    string address;
    double id;
    double gpa;
    Student *next;

};

Student *head;
head = NULL;

string Student_name;
double Student_id;
double Student_gpa;
string Student_address;


for (int i = 0; i<20; i++)
{
    cout << "What is the student's name?";
    getline (cin, Student_name);
    cout << "What is " << Student_name << "'s ID Number?";
    cin >> Student_id;
    cout << "What is " << Student_name << "'s GPA?";
    cin >> Student_gpa;
    cout << "What is " << Student_name << "'s address?";
    getline (cin, Student_address);
}
    Student *newStudent;
    Student *Student_ptr;
    newStudent = new Student;
    newStudent->name = Student_name;
    newStudent->id = Student_id;
    newStudent->gpa = Student_gpa;
    newStudent->address = Student_address;
    newStudent->next = NULL;

    if (!head)
        head = newStudent;
    else
    {
        Student_ptr = head;

        while (Student_ptr -> next)
            Student_ptr = Student_ptr->next;
            Student_ptr->next = newStudent;
    }

    cout << endl;


Student *Display_ptr;
Display_ptr = head;
while (Display_ptr)
{
    cout << Display_ptr-> name << endl;
    cout << Display_ptr-> id << endl;
    cout << Display_ptr-> gpa << endl;
    cout << Display_ptr-> address << endl;

    Display_ptr = Display_ptr->next;
    cout << endl;

}

return 0;

}

4

3 に答える 3

2

実際のリンクされたリストを独自のクラスにするのが最善であり、構造体を独自のクラスにすることもできるので、将来クラスを再利用できます。Node はテンプレート クラスである可能性がありますが、実際のリンク リスト クラスは同じままである可​​能性があります。必要なデータに応じて変化するタイプ「LinkedListNode」のデータメンバーを持つだけです。

現在の設定方法では、このようなもののほとんどを書き直す必要があります。小さな変更を加えて 2 番目のリンク リストを実装するだけです。リンクされたリストをクラスにすることは、実際の挿入/削除/検索などを記述できることも意味します。メインでそのようなことをする代わりに、関数。

于 2012-09-06T15:55:30.123 に答える
2

テンプレートの使用についてはわかりませんが、独自のリストを作成するのではなく std リストを使用する場合を除きます。メイン関数の本体内にstruct Studentを持つことは、私にとっては素晴らしいことではありません。これは、コードの書き直しの一部です。そして次のようなものを作る

using namespace std;
namespace MyDataStructs{

class MyLinkedListNode
{
public:
  MyLinkedListNode():
    name("Empty"),
    address("Empty"),
    studentID(0.0),
    gpa(0.0),
    next(NULL)
  {
  }
  ~MyLinkedListNode();

  void setName(const string& a_name){name = a_name;}
  void setAddress(const string& a_address){address = a_address;}
  void setID(const int& a_Id){studentID = a_Id;}
  void setGPA(const double& a_GPA){gpa = a_GPA;}
  void setNextNode(MyLinkedListNode* a_node){next = a_node;}

  string getName(){return name;}
  string getAddress(){return address;}
  int getId(){return studentID;}
  double getGPA(){return gpa;}
  MyLinkedListNode* getNextNode(){return next;}

private:
  string name;
  string address;
  int studentID;
  double gpa;
  MyLinkedListNode *next;
};

class MyLinkedList
{
  MyLinkedList():
    m_size(0)
  {
  }
  ~MyLinkedList()
  {
    clear();
  }

  void push_back(const MyLinkedListNode& a_node)
  {
    MyLinkedListNode* newNode = new MyLinkedListNode(a_node);
    if(m_end == NULL)
    {
      m_head = newNode;
      m_end = newNode;
    }
    else
    {
      m_end->setNextNode(newNode);
      m_end = newNode;
    }
    m_size++;
  }

  bool deleteNode(const int& a_index)
  {
    if(a_index >= m_size)
      return false;
    if(m_head == NULL)
      return false;

    m_size--;
    MyLinkedListNode* currentNode;

    if(a_index == 0)
    {
      currentNode = m_head->getNextNode();
      delete m_head;
      m_head = currentNode;
      return true;
    }
    curentNode = m_head;
    MyLinkedListNode* previousNode;
    for(int i = 0; i < a_index; i++)
    {
      previousNode = currentNode;
      currentNode = currentNode->getNextNode();
    }
    if(currentNode == m_end)
    {
      m_end = previousNode;
    }
    previousNode->setNextNode(currentNode->getNextNode());
    delete currentNode;
    return true;
  }

  void clear()
  {
    MyLinkedListNode* currentNode = m_head;
    MyLinkedListNode* nextNode;
    while(currentNode != NULL)
    {
      nextNode = currentNode->getNextNode();
      delete currentNode;
      currentNode = nextNode;
    }
  }

private:
  MyLinkedListNode* m_head;
  MyLinkedListNode* m_end;
  int m_size;

};

}//MyDataStructs

わからない、飽きちゃった、どう思う?基本的なデータ構造を再検討するのは楽しいけど。

于 2012-09-06T16:42:27.623 に答える
1

構造体の定義は main() の中に入れるべきではありません。技術的には、これは C++ であるため、実際には構造体ではなくクラスを使用する必要があります。

さらに重要なことに、ループは反復ごとに新しいデータ構造を割り当てる必要があります。つまり、ユーザーが学生情報を入力するたびに、新しいリンクされたリスト要素の中に入れて、既存のリストに追加する必要があります。

于 2012-09-06T15:56:30.337 に答える