2014-10-14 3 views
1

Мы создаем LinkedLists в нашем классе структур данных. Ниже приведена декларация для класса.Как найти конец связанного списка

template <class T> 
class LinkedList 
{ 
public: 
    T m_data;     // Data to be stored 
    LinkedList<T>* m_next;  // Pointer to the next element in the list 

    // ... 
}; 

Учитель рассказал нам, какие функции выполнять. Я в настоящее время пытается осуществить это:

// Purpose: accessor function for last element node 
// Returns: pointer to the last element's node in the list; 
//  returns NULL if list is empty 
LinkedList<T>* getLastPtr(); 

Я не уверен, что код, который вы должны видеть, так вот уменьшенная версия моего кода, который демонстрирует проблему:

template <class T> 
class LinkedList 
{ 
public: 
    T m_data; 
    LinkedList<T>* m_next; 

    LinkedList() : m_next(NULL) {} 

    void insert_front(const T& x); 
    LinkedList<T>* getLastPtr(); 
} 

// INSERT FRONT 
template<typename T> 
void LinkedList<T>::insert_front(const T& x){ 
    LinkedList<T> *tmp; 
    tmp = new LinkedList<T>; 
    tmp->m_data = m_data; 
    tmp->m_next = m_next; 

    this->m_next = tmp; 
    this->m_data = x; 
} 

// GET LAST POINTER 
template<typename T> 
LinkedList<T>* LinkedList<T>::getLastPtr(){ 
    const LinkedList<T>* runner; 
    const LinkedList<T>* tmp; //one behind runner 
    runner = this; 
    while (runner->m_next != NULL){ 
     tmp = runner; 
     runner = runner->m_next; 
     cout<<"tmp: "<<tmp->m_data<<endl; //FIX DIS 
     cout<<"runner: "<<runner->m_data<<endl; //FIX DIS 
    } 
    return tmp->m_next; 
} 

Мы также дали тестер, но для упрощения я буду размещать только в разделе меня возникли проблемы с:

LinkedList<int> A; 

//TEST : Inserting 13 numbers to a 
cout << endl << "TEST : Inserting 13 numbers into A" << endl; 
for (int k=0; k<13; k++){ 
    A.insert_front(k*2); 
} 

// TEST : Acessing last element 
cout << endl << "TEST : Acessing last element" << endl; 
LinkedList<int>* p = A.getLastPtr(); 
cout << "Last = " << p->m_data << endl; 

Моя проблема заключается в том, что, когда я использую функцию getLastPtr() возвращает кучу случайных п umbers. Я не знаю, что я делаю неправильно, так как моя функция getAtPtr() работает правильно, и я использую почти идентичный код.

Я думаю, что это как-то связано с указанием на неправильную вещь ИЛИ мой последний элемент не указывает на NULL (что должно быть для проверки).

Здесь вы можете увидеть демонстрацию проблемы: http://ideone.com/mDXKsV

+0

Я нашел одну проблему (но это еще не все ...): Попробуйте 'return runner;' вместо 'return tmp-> m_next;'. Почему ваше возвращение не так? Например, рассмотрим пустой список: вы получаете доступ к 'tmp-> m_next', но' tmp' не инициализируется в этом случае! – leemes

+0

Основная проблема заключается в том, как вы представляете пустой список. Подумайте о различии пустого списка и списка с одним элементом в вашей реализации. Сколько объектов 'LinkedList ' существуют в каждом случае? Или по-разному сформулировано: в чем смысл связанного списка с нулевым следующим указателем? Имеет ли он элемент? ;) Вам нужно что-то изменить об этом ... – leemes

+1

@leemes Да, я просто заметил, что он неправильно обрабатывал пустые списки, поэтому я собираюсь посмотреть, как я вставляю и что еще более важно, как он обрабатывает пустой список. EDIT: также использовать обратный бегун; выдает ERROR для недействительного преобразования. – SecretShop

ответ

0

в getLastPtr() я собирался последний элемент в списке, который указал на NULL. Я изначально собирал данные с точки THAT, и поэтому это была тарабарщина. Я узнал, что мне нужно было захватить элемент за Null, поэтому я сделал последователя для бегуна, но я также очистил кучу моего кода, особенно для insert_first.