2012-05-26 2 views
0

Итак, я пытаюсь реализовать простой связанный список в C++, но у меня проблема с методом push моего класса. В принципе, когда я добавляю первый узел в список, все идет хорошо; но, когда я добавляю второй узел, он заканчивается тем, что указывает на себя (то есть, второйNode.next == & secondNode).Вставка в цикле создания связанного списка

class linkedList 
{ 
    public: 
    node head; 
    linkedList() 
    { 
     head.next = NULL; 
    } 
    void push(node new) 
    { 
     if(head.next == NULL) 
     { 
      head.next = &new; 
      new.next = NULL; 
     } 
     else 
     { 
      new.next = head.next; 
      head.next = &new; 
     } 
    } 
}; 

Я не мог понять, что не так ... Любая помощь будет принята с благодарностью.

+0

Это не может быть C++, это должно быть C, так как 'new' является зарезервированным ключевым словом. –

+0

@ K-ballo: Но если это 'c',' class linkedList' не будет разрешен - если у вас не было что-то вроде '#define class struct', оно даже не было бы скомпилировано. –

+1

Во всяком случае не используйте слово 'new' как имя переменной в C++. – Ashe

ответ

2
void push(node new) 

вы должны не сделать копию объекта, например, так:

void push(node& new) 

иначе вы принимаете на адрес объекта, который удаляется в конце функции

0

По крайней мере, на мой взгляд, у вас есть несколько вещей, которые в той или иной степени ошибочны.

Во-первых, head не должно быть node - это должно быть node *. По крайней мере, из-за внешнего вида вещей все, что вы когда-либо использовали, это его указатель next, поэтому вы можете просто сделать его указателем и сделать с ним.

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

В-третьи, хотя @ lezebulon-й предложение использовать ссылку на узел буду работы, я не думаю, что это на самом деле лучший путь в этом случае. Вместо того, чтобы пользователь передавал указатель или ссылку на узел , они должны действительно просто передать элемент данных, и ваш класс связанного списка должен выделить узел для хранения этого элемента в списке.

template <class T> 
class linked_list { 

    class node { 
     T item; 
     node *next; 
    public: 
     node(T const &data, node *next_node) : item(data), next(next_node) {} 
    }; 

    node *head; 
public: 

    linked_list() : head(NULL) {} 

    void push(T const &data) { 
     head = new node(data, head); 
    } 
}; 
Смежные вопросы