0

削除してください。

リンクリストを実装したい。残念ながら、正しい軌道に乗っているかどうかはわかりません。

#include <iostream>
using namespace std;

class Node {
    friend class List;
public:
    int value;
private:
    Node *next;
};

class List {
public:
    List ();
    ~List ();
    Node * first() const;
    Node * next(const Node * n) const;
    void append (int i);

    Node* head;
};

List::List() {
    Node* head = new Node();
}

List::~List() {
    while(head != NULL) {
        Node * n = head->next;
        delete head;
        head = n;
    }
}

Node * List::first() const {
    return head; // this could also be wrong
}

Node * List::next(const Node * n) const {
    return n + 1; // ERROR
}

void List::append(int i) {
    Node * n = new Node;
    n->value = i;
    n->next = head;
    head = n;
}

int main(void) {
    List list;
    list.append(10);

    return 0;
}

要素を返そうとすると、次のnext()エラーが発生します。

In member function ‘Node* List::next(const Node*) const’:|
error: invalid conversion from ‘const Node*’ to ‘Node*’ [-fpermissive]|

誰か助けてくれませんか?

編集:
エラー行を更新しました。

4

2 に答える 2

2

あなたがやっていることは、ノードの次を返すことだと思います:

Node * List::next(const Node * n) const {
   return n->next;
}

これが各オブジェクトのサイズが一定の配列である場合はポインター演算を使用しますが、リンクされたリストではポインター演算を使用できません。イテレータがある場合、「++」演算子を使用して次のオブジェクトを取得できますが、これではノードの次のフィールドを返すことに固執します。

next は非公開として宣言されていますが、 List を友達にしたので、これもうまくいくと思います。

于 2013-04-30T01:41:21.353 に答える
0

連続したノードがメモリの連続したブロックにあると考えていますが、そうではありません。リンクされたリストには、メモリ内のランダムな場所にノードがあります。これが、「next」が NEXT ノードを指す理由です。しようとしているようにインクリメントまたは追加することはできません (できますが、意味的には正しくありません)。

于 2013-04-30T01:38:03.030 に答える