C ++ My First链表我做错了什么?

时间:2012-09-06 15:49:04

标签: c++ linked-list

嘿伙计们我在我的第一个链接列表上工作以保存学生记录(名称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;

}

3 个答案:

答案 0 :(得分:2)

嗯,最好将实际的链表作为自己的类,你甚至可以将结构化为自己的类,这样你就可以在将来重用这些类。 Node可以是模板类,但实际的链表类可以保持不变;它只有一个类型为“LinkedListNode”的数据成员,它会根据你需要的数据而改变。

现在它的设置方式,你必须重写大部分内容。只是为了实现第二个链接列表,只需稍作修改。使链表成为一个类也意味着你可以编写实际的insert / delete / searc / etc。函数,而不是在main中做那些东西。

答案 1 :(得分:2)

好吧,我不知道使用模板,除非你的意思是使用标准列表而不是自己创建。在主函数体内包含 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

我不知道,我觉得无聊,你们有什么想法......尽管重新审视一些基本的数据结构很有趣。

答案 2 :(得分:1)

结构定义不应该进入main()。从技术上讲,由于这是C ++,你应该使用类而不是结构。

更重要的是,您的循环需要在每次迭代时分配新的数据结构。也就是说,每次用户输入学生信息时,都应该进入新的链接列表元素,然后添加到现有列表中。