Пример решения задачи базового уровня. Задача: Пользователь вводит в программу через консоль последовательность целых чисел произвольной длины
Задача: Пользователь вводит в программу через консоль последовательность целых чисел произвольной длины, заканчивая ввод нажатием комбинации клавиш Ctrl+Z. По окончании ввода вывести введенную последовательность, предварительно удалив все повторяющиеся значения. Порядок выводимых чисел должен соответствовать изначальному порядку ввода.
Решение на основе векторов:
#include "integer_vector.hpp"
// Функция, удаляющая из вектора повторяющиеся значения
voidIntegerVectorPurge ( IntegerVector & _v )
{
// Выбираем очередное число из последовательности
intp = 0;
while( p < _v.m_nUsed )
{
// Сравниваем его с каждым последующим числом и удаляем повторы
intq = p + 1;
while( q < _v.m_nUsed )
{
// Если числа равны между собой, удаляем второе
if( _v.m_pData[ p ] == _v.m_pData[ q ] )
IntegerVectorDeleteAt( _v, q );
Else
++q;
}
++p;
}
}
// Главная функция
intmain ()
{
// Создаем и инициализируем вектор
IntegerVector v;
IntegerVectorInit( v );
// Считываем входную последовательность в вектор до нажатия Ctrl+Z
IntegerVectorRead( v, std::cin );
// Удаляем повторяюшиеся элементы
IntegerVectorPurge( v );
// Печатаем итоговое содержимое вектора на экране
IntegerVectorPrint( v, std::cout );
std::cout << std::endl;
// Уничтожаем внутреннее содержимое вектора
IntegerVectorDestroy( v );
}
Решение на основе связных списков:
#include "integer_list.hpp"
// Функция, удаляющая из списка повторяющиеся значения
voidIntegerListPurge ( IntegerList & _l )
{
// Выбираем очередной узел из последовательности
IntegerList::Node * p = _l.m_pFirst;
while( p )
{
// Сравниваем его значение с каждым последующим узлом и удаляем повторы.
// Одновременно, поддерживаем переменную, указывающую на предыдущий элемент.
IntegerList::Node * q = p->m_pNext;
IntegerList::Node * prevQ = p;
while( q )
{
// Если числа равны между собой, удаляем узел со вторым
if( p->m_value == q->m_value )
{
IntegerListDeleteAfter( _l, prevQ );
q = prevQ->m_pNext;
}
Else
{
prevQ = q;
q = q->m_pNext;
}
}
p = p->m_pNext;
}
}
// Главная функция
intmain ()
{
// Создаем и инициализируем список
IntegerList l;
IntegerListInit( l );
// Считываем входную последовательность в список до нажатия Ctrl+Z
IntegerListRead( l, std::cin );
// Удаляем повторяюшиеся элементы
IntegerListPurge( l );
// Печатаем итоговое содержимое списка на экране
IntegerListPrint( l, std::cout );
std::cout << std::endl;
// Уничтожаем внутреннее содержимое списка
IntegerListDestroy( l );
}
Ниже приведен результат выполнения этих программ - он одинаковый при одинаковом вводе:
Дата добавления: 2016-01-29; просмотров: 727;