2013-04-30 5 views
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]| 

Может кто-нибудь пожалуйста, помогите мне?

EDIT:
Я обновил строку ошибки.

+0

Что вы пытаетесь сделать в List :: next? Вы пытаетесь продвинуть n узлов? – zdan

+0

Моя вина. Я обновил эту функцию, но все равно получаю сообщение об ошибке. – user1170330

ответ

2

Я думаю, что вы имеете в виду, чтобы делать это возвращение узла следующий:

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

Вы могли бы использовать указатель арифметики, если это был массив, где размер каждого объекта был постоянным, но связанные списки не могут использовать арифметику указателя. Если у вас есть итератор, вы можете использовать оператор «++», чтобы получить следующий объект, но с этим просто придерживайтесь возвращения следующего поля узла.

Я предполагаю, что это также будет работать, потому что, хотя следующий объявлен как закрытый, вы сделали список другом.

+0

Спасибо человеку! Он работает сейчас! Остальное выглядит нормально? – user1170330

+1

Выглядит хорошо! – tbondwilkinson

+0

Знаете ли вы, как вставить новое значение между другими значениями? Что-то вроде 'insert (Node * n, int i);'. Новое значение должно быть до 'n'. – user1170330

0

Вы думаете, что последовательные узлы находятся в последовательных блоках памяти, а это не так. Связанные списки имеют узлы в случайных местах в памяти, поэтому «следующий» указывает на узел NEXT. Вы не можете увеличить или добавить, как вы пытаетесь (ну вы можете, но семантически было бы неправильно.)

+0

Не могли бы вы рассказать мне, как улучшить его? – user1170330

+0

Вам нужно будет перебирать все узлы в цикле for, пока не дойдете до требуемого узла – ithenoob

Смежные вопросы