1

私はイベントのクラスを持っています。あとは、イベントを作成してリンク リストに保存するだけです。しかし、頭の位置を修正する方法がわかりません。つまり、コンストラクターで head を NULL に定義すると、新しいイベントごとに NULL に再定義されます。したがって、リンクされたリストには 1 つのイベントしかありません。私のコードは次のようなものです:

// 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は自己完結型であることを示しています。つまり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;
    }
}
于 2012-12-09T19:33:35.447 に答える
1

より良い方法は、ここに 2 つのクラスを用意することです。1 つは各イベントを格納し、もう 1 つはリストに関する情報を管理および格納します。

リストには多くのイベント クラスがあります。リスト クラスは 1 つだけです。

ここで、イベント クラスには、実際には、次へのポインターや前のポインターなどのいくつかのヘルパー メソッドが必要になります。それらを直接実装するか、イベント クラスから継承されるか、イベント クラスを含む 3 番目のクラスを作成することができます。

いずれにせよ、リストを管理するクラスに必要なインスタンスは 1 つだけです。その場合、ヘッドは null に初期化でき、必要に応じて更新されます。

于 2012-12-09T19:27:50.217 に答える
1

リストを制御するコードが必要です。リスト項目はそれ自体を制御できません。

すべてのリスト操作を実装するコンテナ std::list を使用することをお勧めします。

リストを実装したい場合は、EventContainer などの制御クラスを作成し、挿入/削除および検索操作を実装する必要があります。

于 2012-12-09T19:29:45.207 に答える