2012-12-09 32 views
1

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

// 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; 
} 

//现在每个我调用构造函数的时候,负责人将被重新定义为NULL。 我该怎么办?

+0

创建一个列表类持有的指针头和其他可能的管理数据(如列表的大小)和实际的一个节点类事件。该列表将指向第一个节点。 –

+0

在正常链接列表中,链接的唯一元素是序列中的下一个元素。所以不清楚的是你为什么在课堂上加入变量头。你想用它做什么 – Treesrule14

回答

2

首先,代码显示class Event是自包含的。也就是说headnxt是对象本身的一部分。如果您想使用链接到对方的对象的链接列表而不是保持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。以Learning C++: A sample linked list为例。

编辑:

更好的方法: -

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; 
    } 
} 
+0

非常感谢。解释了很多.... – Terrenium

1

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

你的列表中会有很多事件类。只有一个列表类。

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

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

1

您需要一些控制代码为您的列表。列表项不能控制自己。

我建议你使用一个容器std :: list来实现所有列表操作。

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