C ++ Создание отсортированного списка ссылок из цикла

Я бился головой о стену около 3 часов, пытаясь придумать, как это исправить, но не могу понять. Моя тестовая программа написана как таковая …

int main()
{
SimpList<int> intList;   // (empty) list of integers

cout << "Let's build a sorted list of integers." << endl;
cout << endl << "Uninitialized List: ";
intList.print();
cout << endl << "Length: " << intList.size() << endl;

int intData[] = { 5, 3, -2, 7, 9, -8, 1, -4 };

for (int i=0; i<8; i++)
intList.insert( intData[i] );

cout << endl << "After inserting 8 integers: ";
intList.print();
cout << endl << "Length: " << intList.size() << endl;

system("PAUSE");
return 0;
}

Таким образом, список ссылок инициализируется из массива и цикла for. Мой код класса для узла и списка здесь …

    template < typename T >   // Forward declaration of the SimpList class
class SimpList;

template < typename T >
class Node                 // Node class for the SimpList class
{
private:
// Constructors
Node () { next = 0; }  // default constructor

// Complete the definition inline
Node ( const T &initItem, Node<T> *ptr ) { }

// Data members
T           item;   // Node data item
Node        *next;  // Pointer to the next node

friend class SimpList<T>;
};

template < typename T >
class SimpList
{
public:

// Constructor (add your code inline)
SimpList ()
{
head = &PHONY;
length = 0;
}// List manipulation operations
void insert ( const T &newitem );   // insert a data item
bool remove ( T &item );            // remove data item
bool find ( T &item ) const;        // find data item
void clear ();                      // empty the list

bool isEmpty () const {
if (length == 0)
return true;
else
return false;
}

// length accessor method
int size () const {
return length;
}

// print the list items
void print () const;

private: // data members
Node<T> PHONY;      // empty node that anchors the list
Node<T> *head;      // pointer to the beginning of the list
int length;         // length of list
};

И тогда функции вставки и печати следующие:

template < typename T >
void SimpList<T>::print() const
{
if (length == 0)
{
cout << "List is empty." << endl;
return;
}

Node<T> *ptr = head->next;
while (ptr != NULL)
{
cout << ptr->item << "  ";
ptr = ptr->next;
}
cout << endl;
}

template < typename T >
void SimpList<T>::insert(const T& newitem) {

Node<T> *currN = head->next;
Node<T> *prevN = 0;
Node<T> *tmp = new Node<T>();
tmp->item = newitem;

if(head->next == NULL ) {
head->next = tmp;
}
else {
prevN = head;
while(currN != NULL && currN->item < newitem) {
prevN = currN;
currN = currN->next;
}
prevN->next = tmp;
}
length++;
print();
}

Я вставил последний «print ()» в функцию вставки как способ отладки того, что происходило, и вывод довольно озадачивает, поскольку это дает мне

5
3
-2
-2 7
-2 7 9
-8
-8 1
-8 -4

Но я хочу, чтобы вывод был отсортирован от наименьшего к наибольшему (-8 -4 -2 1 3 5 7 9)

редактировать: решено … забудьте обновить tmp-> рядом с текущим. DERP.

0

Решение

Пара вещей, которые нужно исправить:

  1. PHONY->next не является нулевым, поэтому ваша инициализация не удастся:

    if(head->next==NULL) {
    head->next=tmp;
    return;
    }
    
  2. Конструктор узла должен инициализироваться рядом с 0 вместо this следовательно, вы никогда не достигнете условия NULL для конца вашего списка.

  3. при вставке в оператор else вы должны начать поиск с head-> next, в настоящее время вы начинаете поиск с currn знак равно head который PHONY что не правильно.

  4. Вам также нужно установить tmp->next соответственно, рассмотрите этот случай, когда вы вставляете в середину списка.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]