双链表实现c ++

时间:2014-05-06 21:25:30

标签: c++ doubly-linked-list

我正在测试我的双链表,但它没有显示任何内容。 我正在插入学生数据,然后尝试显示它。 我只是在推送功能上工作,只是按步骤显示它。 我是双重链接列表的新手。

#include <iostream>
#include <string>
#include "stdlib.h"
#include "time.h"
#include <ctime>
#include <cstdlib>
#include <time.h>
using namespace std;


 class student
{
 public:
int id;            //student ID number
string name;       //student’s name
string university; //student’ university
double GPA;         //student’ GPA
};


//student list is a doubly linked list of students.
class studentList
{
private:
    class node
{
public:
    student data;
    node * next;
    node * prev;
};

node * head;

public:
studentList()
{

    head = NULL;

}

//be sure to free all dynamically allocated memory!
~studentList()
{
    delete head;
}

//return true if the list is empty, false if not
bool empty()
{
    if ( head == NULL)
    {
        return true;
    }
    else
        return false;

}

//insert student s into the front of the linked list
void push(student s)
{
    node *tmp;
    tmp = new node;

    tmp->data = s;
    tmp->next = head;
    head = tmp;
}

//remove and return the student at the front of the list
student pop();

//locate and remove the student with given ID number
void removeStudent(int id);

//locate and return a copy of the student with given ID number
student getStudent(int id);

//locate the student with given ID number in list and set their GPA to gpa
void updateGPA(int id, double gpa);

//arrange students into increasing order based on either ID, name, or GPA.  If
//variable 'field' has value "id", sort into increasing order by id.
//If 'field' has value "name", sort into alphabetical order by name.
//If 'field' has value "GPA", sort into order by GPA.
void sort(string field);

//a test function to simply display the list of students to the screen
//in the order they appear in the list.
void display()
{
    node *current = head;

    while (current!=NULL)
    {
        cout << &current->data << endl;
        current = current->next;
    }
}

};

int main()
{
studentList *my;
student *edwin;
edwin->name = "edwin";
edwin->university = "lsu";
edwin->GPA = 4.0;
edwin->id = 33;
my->push(*edwin);
my->display();









return 0;
}

2 个答案:

答案 0 :(得分:2)

你的问题在这里,cout&lt;&lt; &amp; current-&gt; data&lt;&lt; ENDL;

究竟什么是数据?它是一些封装结构吗?我假设它是整个学生结构。如果是这种情况,那么你需要得到该结构,然后cout它的各种成员。 即 cout&lt;&lt; &amp; current-&gt; data-&gt; name&lt;&lt; ENDL;

即如果数据类型为student *,如果不是,那么您需要取消引用指向学生结构的指针然后cout它的成员。

此处您所拥有的不是双向链表,而是一个单一的链表。双向链接列表具有指向列表中下一个和上一个节点的next和prev指针。

答案 1 :(得分:2)

您没有正确初始化edwin。这条线

student *edwin;

只是声明一个指向student结构的指针。它不为它分配内存。在此之后立即使用edwin->name是不正确的。

只需使用struct而不是指向它的指针student edwin; edwin.name="...";。 您的push无论如何都要复制结构。

正如40two所注意到的,你也没有初始化my。我建议您尝试找到自己初始化它的正确方法。

另一个可能错误的地方:

cout << &current->data << endl;

你能解释一下这行吗?为什么不做cout << current->data.name

另请注意,您从未在prev中设置node指针(尽管您有此字段)。所以它不是一个正确的双链表(它本质上是单链接的。)