Мы создаем 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
Я нашел одну проблему (но это еще не все ...): Попробуйте 'return runner;' вместо 'return tmp-> m_next;'. Почему ваше возвращение не так? Например, рассмотрим пустой список: вы получаете доступ к 'tmp-> m_next', но' tmp' не инициализируется в этом случае! – leemes
Основная проблема заключается в том, как вы представляете пустой список. Подумайте о различии пустого списка и списка с одним элементом в вашей реализации. Сколько объектов 'LinkedList' существуют в каждом случае? Или по-разному сформулировано: в чем смысл связанного списка с нулевым следующим указателем? Имеет ли он элемент? ;) Вам нужно что-то изменить об этом ... –
leemes
@leemes Да, я просто заметил, что он неправильно обрабатывал пустые списки, поэтому я собираюсь посмотреть, как я вставляю и что еще более важно, как он обрабатывает пустой список. EDIT: также использовать обратный бегун; выдает ERROR для недействительного преобразования. – SecretShop