我有一类事件。 现在我所要做的就是创建事件并将它们存储在链表中。但我不知道如何固定头部位置。我的意思是,如果我在构造函数中将 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。 我该怎么办???
最佳答案
首先,代码显示 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 将列表本身放在外面。参见 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;
}
}
关于c++ - OOP,使用类的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13790832/