2012-06-05 2 views
0

Я пытаюсь реализовать связанный класс списка в C++, и у меня возникла проблема. У меня есть оператор + =, который добавляет новый узел.C++ не сохраняет изменения другим способом

связанный интерфейс списка классов:

template <typename Type> 

class LinkedList { 
public: 
    LinkedList<Type>* head; 
// linked list stracture 
    Type data; 
    LinkedList<Type>* next; 
// others .... 
    size_t length; 
public: 
    LinkedList(); 
    ~LinkedList(); 
    void initializeHead(LinkedList<Type>* headPtr); 
    size_t size() const; 
    LinkedList& operator+=(const Type& add); 
    void operator-=(const Type& remove); 
    LinkedList<Type>& operator[] (const size_t index) const; 
    bool operator== (const LinkedList<Type> &versus) const; 
    friend ostream& operator<< (ostream& out,LinkedList& obj); 
}; 

и здесь я есть + = перегрузка реализации:

template <typename Type> LinkedList<Type>& LinkedList<Type>::operator +=(const Type& add) { 
    // head ptr - :) 
    LinkedList<Type>* p = head->next; 
    // go to the end 
    while(p) p = p->next; 
    // now on end - create new..!!! 
    try { 
     p = new LinkedList<Type>; 
    } catch (bad_alloc& e) { 
     cout << "There\'s an allocation error...."; 
    } catch (...) { 
     cout << "An unknown error.." << endl; 
    }// fill and done 
    p->data = add; 
    p->next = NULL; 
    // increment length ......... 
    ++head->length; 
    // done ............ 
    return *p; 
} 

Кроме того, у меня есть метод "массив" перегрузки доступа:

template <typename Type> LinkedList<Type>& LinkedList<Type>::operator [](const size_t index) const { 
    if(index < 0 || index >= length) // invaild argument 
     throw exception(); 
    // continue 
    LinkedList<Type>* p = head; 
    for(size_t i = 0; i < index; ++i) p = p->next; // we are at what we want 
    return *p; 
} 

Все работает правильно - я проверил на dibugger,

проблема - + = не сохраняет новый узел в «head-> next», по какой-то причине после финиша + = метод, head-> next равно null.

Кто-нибудь знает, почему новое распределение не связано с head-> next?

Большое спасибо!

+0

Если вы попытаетесь реализовать как стек, это будет намного проще. –

+0

Связанные списки не лучше, чем векторы. Они на самом деле медленнее, и они не поддерживают произвольный доступ. По крайней мере, реализовать такой LL, который имеет постоянную вставку времени, а не O (n). –

ответ

2

после while(p) p = p->next; р NULL

и рядом вы p = new LinkedList<Type>; но не связывают р в голову.

+0

Спасибо, его лучше, он сохраняет новый узел - но похоже, что в конце списка нет NULL .. знаете ли вы, почему? – nimrod

+0

p-> data = data; p-> next = NULL; Я думаю, что последний узел списка должен указывать на этот новый узел, чтобы получить ожидаемые результаты (NULL в конце). – Rahul

0

Вместо:

// go to the end 
while(p) p = p->next; 

Понадобится:

head->next = p; 
0

Как говорят другие ответы, вы выходите за пределы списка, когда вы пытаетесь добавить. Попробуйте что-то вроде этого:

template <typename Type> LinkedList<Type>& LinkedList<Type>::operator +=(const Type& add) 
{ 
    LinkedList<Type> *last; 

    // Find the last node in the list 
    for (last = head; last != 0 && last->next != 0; last = last->next) 
    { 
    } 

    // `last` now points to the last node in the list, or is zero 
    // If zero (i.e. NULL) then list is empty 

    if (last == 0) 
    { 
     head = new LinkedList<Type>; 
     head->next = 0; 
     head->data = add; 
     head->length = 0; 
    } 
    else 
    { 
     last->next = new LinkedList<Type>; 
     last->next->next = 0; 
     last->next->data = add; 
    } 

    // We can safely use `head` as we are sure it won't be zero 
    head->length++; 

    // Return the added node 
    return (last != 0 ? *last->next : *head); 
} 
+0

Mm .. Хорошо, я пытаюсь решить проблему 'delete'. Спасибо вам большое! – nimrod

+0

@nimrod Убедитесь, что конструктор обнуляет переменную-член 'head'. Кроме того, другие переменные также, тогда вам не нужно их обнулять в функции, которую я опубликовал. –

0

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

Это пример кода. Вам необходимо позаботиться о некоторых ситуациях, таких как добавление первого узла и т. Д.

LinkedList<Type>* temp = NULL; 
while(p) 
{ 
    temp = p; 
    p = p->next; 
} 

try 
{    
    p = new LinkedList<Type>;   
    temp->next = p; 
} 
Смежные вопросы