Я делаю односвязный список и добавляю в начальный узел. Всякий раз, когда я запускаю свой тестер, он работает, но он добавляет (что я предполагаю) дополнительный узел в начале с адресом.
тестер:
#include <iostream>
#include "linkedlist.h"
using namespace std;
void test01() {
LinkedList < int > A;
cout << endl << endl;
cout << " ***************** " << endl;
cout << " * TEST SET #1 * " << endl;
cout << " ***************** " << endl;cout << "Is the list empty? " << boolalpha << A.isEmpty() <<endl;
cout << A << endl;
cout << "Size of A = " << A.size() << endl;
//TEST : Inserting 10 numbers to a
cout << endl << "TEST : Inserting 10 numbers to A" << endl;
for (int k=0; k<10; k++)
{
A.insert_front(k+1);
}
cout << A << endl;
cout << "Size of a = " << A.size() << endl;
//TEST : Clearing A
cout << endl << "TEST : Clearing A" << endl;
A.clear();
cout << A << endl;
cout << "Size of A = " << A.size() << endl << endl;cout << "Test 01 - Done!" << endl;
} // Destructor Called Here!!
int main () {
cout << "Hello World!!, This is the LinkedList LARGE Tester" << endl;
test01();cout << "LARGE Done!" << endl;
return 0;
}
LinkedList.hpp (что мне разрешено изменять)
#include "linkedlist.h"
// --------
// ---- Basic Accessor Operations ---
// --------
// Purpose: accessor function for the current # data values in the list
// Returns: current size of the list
template <class T>
int LinkedList<T>::size() const
{
}
// Purpose: puts the data x in the front of the list
// Parameters: x is data value to inserted
// Postconditions: x is the first element of the list
template <class T>
void LinkedList<T>::insert_front(const T& x)
{
if(m_next == NULL)
{
m_next = new LinkedList<T>;
m_next->m_data = x;
m_next->m_next = NULL;
}
LinkedList<T> *temp;
temp = new LinkedList<T>;
temp->m_data = x;
temp->m_next = m_next;
m_next = temp;
}
LinkedList.h (не разрешено изменять)
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
static T m_objerr;
// Purpose: Default constructor
// Postconditions: next pointer set to NULL
// -INLINE-
LinkedList() : m_next(NULL) {}
// Purpose: Auxiliaty constructor, construct from parameters
// useful when inserting elements
// Postconditions: data and next pointer set to parameters
// -INLINE-
LinkedList(const T& x, LinkedList<T>* p)
: m_data(x), m_next(p) {}
void insert_front(const T& x);
int size() const;
}
После составления списка cout
правильно, но в начале есть добавленный узел, который содержит адрес для этого узла. Я попробовал довольно много способов, но ни один из них, кажется, не удаляет этот последний узел, несмотря ни на что.
Давайте посмотрим, что произойдет, когда вы добавите самый первый узел в список:
template <class T>
void LinkedList<T>::insert_front(const T& x)
{
if(m_next == NULL) // m_next is NULL
{
// ok, let's add the first node
m_next = new LinkedList<T>;
m_next->m_data = x;
m_next->m_next = NULL; // this line isn't neccesary, the default constructor
// called in the new expression above took care of that
// you should utilize the other constructor and say
// m_next = new LinkedList<T>(x, m_next);
// ok, done, let's continue with the code below
}
// Wait a second! We already added a node, what are we doing here?
LinkedList<T> *temp;
temp = new LinkedList<T>;
temp->m_data = x;
temp->m_next = m_next;
m_next = temp;
}
Поэтому каждый раз, когда вы добавляете первый узел, вы фактически добавляете два. Остальные вставки работают нормально, так как if
условие больше не верно.
Чтобы это исправить, вы можете обернуть вторую часть кода в else
заблокировать или добавить return
заявление внутри if
блок.
Обратите внимание, что с тем, как вы в настоящее время обращаетесь с вещами, весь insert_front
метод может быть сокращен до
m_next = new LinkedList<T>(x, m_next);
Я вижу некоторые проблемы с дизайном этого, хотя. Сам класс действует как контейнер и узел одновременно. Обычно реализации связанного списка используют отдельный класс для узлов, а реальный класс контейнера просто содержит указатель на первый узел (и, возможно, члены для кэширования размера и хвоста и т. Д.). Другая проблема — конструктор по умолчанию и способ вставки первого узла. В настоящее время составленный список по умолчанию содержит неопределенный m_data
в качестве первого узла. Самая первая вставка узла, вероятно, должна просто установить m_data
желаемое значение и установить m_next
в NULL.
Других решений пока нет …