1

我有一类事件。现在我所要做的就是创建事件并将它们存储在一个链表中。但我不知道如何固定头部位置。我的意思是,如果我在构造函数中将 head 定义为 NULL,那么对于每个新事件,它将重新定义为 NULL。因此,我的链接列表中只有一个事件。我的代码是这样的:

// event.h
class event{
    private:
        Event *head;
        Event *nxt;
        int date;
        string name;

    public:
        event();
        event(int d, string n);
        Add_item();
}

//event.cpp
event::event(){}
event::event(int date, string name): date(date), name(name){
head=NULL;

// 现在每次调用构造函数时,head 都会被重新定义为 NULL。我该怎么办???

4

3 回答 3

2

首先,代码显示它class Event是独立的。也就是说,head并且nxt是对象本身的一部分。如果您希望使用相互链接但不维护head外部的对象的链接列表,那么我将执行以下操作...

// event.cpp
event::event() {
    head = NULL;
}

event::event(int date, string name): date(date), name(name) {
    head = NULL;
}

event::event(event *prev, int date, string name): date(date), name(name) {
    if (prev->head != NULL) {
        this->head = prev->head;
    } else {
        prev->head = this->head = prev;
    }
    prev->nxt = this;
    this->nxt = NULL;
}

使用它的一个例子如下:

event *tailEvent = new event(1, 'first');
event *nextEvent = new event(tailEvent, 2, 'second');
event *thirdEvent = new event(nextEvent, 3, 'third');
...
tailEvent = lastEvent;

等等等等。因此,tailEvent->head将始终指向第一个创建的事件,并且tailEvent->nxt将在列表中跟随。

但是...这很容易出错,所以我建议将列表本身保留在外面,如果可能的话使用 STL。有关示例,请参阅学习 C++:示例链接列表

编辑:

更好的方法: -

class Event {
    private:
        Event *next;
        int date;
        string name;

    public:
        Event() {};
        Event(int date, string name) : date(date), name(name) {};
        setNext(Event *next) { this->next = next; };
        int date() { return date; };
        string name() { return name; };
        Event *next() { return next; };
};

class EventList {
    private:
        Event *head;

    public:
        EventList() { head = NULL };
        void add(int date, string name);
        Event *head() { return head; }
}

void EventList::add(int date, string name) {
    Event *newEvent = new Event(date, name);
    newEvent->setNext(NULL);
    Event *tmp = head;
    if (tmp != NULL) {
        while (tmp->next() != NULL) tmp = tmp->next();
        tmp->setNext(newEvent);
    } else {
        head = newEvent;
    }
}
于 2012-12-09T19:33:35.447 回答
1

更好的方法是在这里设置两个类:一个用于存储每个事件,另一个用于管理和存储有关列表的信息。

您的列表中将有许多事件类。只有一个列表类。

现在,您的事件类实际上需要一些辅助方法,例如 next 和 previous 指针。您可以直接实现它们或创建第三个类,该类继承自或包含事件类。

但无论哪种方式,管理列表的类都应该只需要一个实例。在这种情况下,head 可以初始化为 null,并将根据需要进行更新。

于 2012-12-09T19:27:50.217 回答
1

您的列表需要一些控制代码。列表项无法控制自己。

我建议您使用实现所有列表操作的容器 std::list 。

如果你想实现你的列表,你应该创建控制类,例如 EventContainer 并实现插入/删除和搜索操作。

于 2012-12-09T19:29:45.207 回答