Для начала обе функции push_front
и pop_front
имеют опечатки. Внутри функций вместо идентификаторов left
и right
вы должны использовать идентификаторы параметров l
и r
.
void push_front(int n, elem*&l, elem*&r)
^^^^^^^^^^^^^^^^
{
elem *p=left;
^^^^^
//...
И вам не следует определять глобальные переменные left, right, left2, и правильно2. Функции не должны зависеть от глобальных переменных.
Функция, подобная поиску, должна делать только одно: сообщать, присутствует ли элемент в списке или нет.
Таким образом, функция должна быть определяется как
bool search( const elem * &l, int x )
{
const elem *current = l;
while ( current != nullptr && current->key != x ) current = current->next;
return current != nullptr;
}
На основе возвращаемого значения функции вы можете добавить значение в список или сделать что-то еще.
Если использовать вспомогательный список (который неэффективен) поскольку вы можете просматривать список только с помощью функций pop_front
и push_front
, функция может выглядеть следующим образом:
bool search( elem * &l, elem * &r, int x )
{
elem *l2 = nullptr, *r2 = nullptr;
bool success = false;
if ( l != nullptr )
{
do
{
int key;
pop_front( key, l, r );
push_front( key, l2, r2 );
success = key == x;
} while ( !success && l != nullptr );
}
while ( l2 != nullptr )
{
pop_front( key, l2, r2 );
push_front( key, l, r );
}
return success;
}
Вот демонстрационная программа.
#include <iostream>
struct elem
{
int key;
elem *next;
};
void push_front( int n, elem * &l, elem * &r )
{
l = new elem { n, l };
if ( r == nullptr ) r = l;
}
bool pop_front( int &n, elem * &l, elem * &r )
{
bool success = l != nullptr;
if ( success )
{
n = l->key;
elem *tmp = l;
l = l->next;
if ( l == nullptr ) r = nullptr;
delete tmp;
}
return success;
}
bool search( elem * &l, elem * &r, int x )
{
elem *l2 = nullptr, *r2 = nullptr;
bool success = false;
if ( l != nullptr )
{
do
{
int key;
pop_front( key, l, r );
push_front( key, l2, r2 );
success = key == x;
} while ( !success && l != nullptr );
}
while ( l2 != nullptr )
{
pop_front( key, l2, r2 );
push_front( key, l, r );
}
return success;
}
int main()
{
elem *left = nullptr, *right = nullptr;
const int N = 10;
for ( int i = N; i != 0; --i )
{
push_front( i, left, right );
}
if ( !search( left, right, 0 ) )
{
push_front( 0, left, right );
}
while ( left != nullptr )
{
int key;
pop_front( key, left, right );
std::cout << key << ' ';
}
std::cout << '\n';
return 0;
}
Ее вывод
0 1 2 3 4 5 6 7 8 9 10
То есть, если 0 не найден в сформированном списке, он выдвигается вперед в списке. Вывод программы показывает результат.