В исходном коде функции есть две проблемы. Первый - указатель newList
не изменяется внутри функции и всегда равен NULL.
Node<ItemType> * newList = NULL;
Этот нулевой указатель назначен элементу данных listData
listData = newList;
Вторая проблема заключается в том, что вы всегда меняете указатель newListCurr
вместо текущего значения указателя newListCurr->next
, как, например, в этом операторе if
if(curr2 == NULL) {
newListCurr = curr1;
^^^^^^^^^^^^^^^^^^^^
curr1 = curr1->next;
newListCurr = newListCurr->next;
}
В новой обновленной реализации функции вы избегаете этой ошибки, потому что теперь вы действительно изменяете элемент данных next
текущего указателя newListCurr
if(curr2 == NULL) {
newListCurr->next = curr1;
^^^^^^^^^^^^^^^^^^^^^^^^^
curr1 = curr1->next;
newListCurr = newListCurr->next;
Тем не менее, новая реализация функции слишком сложна, поскольку тот же код фактически дублируется в первом операторе if.
Функция может быть реализована проще, если использовать указатели на указатели. Я не знаю, как определяется ваш класс, поэтому я определил один мой простой класс.
Функция может вставлять дубликаты, но вы можете изменить ее таким образом, используя дополнительный оператор if, если дубликаты не были вставлены.
Вот демонстрационная программа.
#include <iostream>
template <class ItemType>
class SortedList
{
private:
struct Node
{
ItemType info;
Node *next;
} *listData = nullptr;
public:
void insert( const ItemType &info )
{
Node **tail = &listData;
while ( *tail ) tail = &( *tail )->next;
*tail = new Node { info, nullptr };
}
void merge( SortedList<ItemType> & list )
{
Node *newListData = nullptr;
Node **current = &newListData;
Node **first = &listData;
Node **second = &list.listData;
while ( *first && *second )
{
if ( ( *second )->info < ( *first )->info )
{
*current = *second;
*second = ( *second )->next;
current = &( *current )->next;
}
else
{
*current = *first;
*first = ( *first )->next;
current = &( *current )->next;
}
}
while ( *first )
{
*current = *first;
*first = ( *first )->next;
current = &( *current )->next;
}
while ( *second )
{
*current = *second;
*second = ( *second )->next;
current = &( *current )->next;
}
listData = newListData;
}
friend std::ostream & operator <<( std::ostream &os, const SortedList<ItemType> &list )
{
for ( const SortedList<ItemType>::Node *current = list.listData; current; current = current->next )
{
os << current->info << " -> ";
}
return os << "null";
}
};
int main()
{
SortedList<int> list1;
SortedList<int> list2;
const int N = 10;
for ( int i = 0; i < N; i++ )
{
if ( i % 2 == 0 ) list1.insert( i );
else list2.insert( i );
}
std::cout << list1 << '\n';
std::cout << list2 << '\n';
list1.merge( list2 );
std::cout << list1 << '\n';
std::cout << list2 << '\n';
return 0;
}
Вывод программы:
0 -> 2 -> 4 -> 6 -> 8 -> null
1 -> 3 -> 5 -> 7 -> 9 -> null
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> null
null