まず、コード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;
}
}