Общий алгоритм такой: берем последовательно каждый элемент из первого и проверяем, содержится ли он во втором. Если содержится, то игнорируем его и идем дальше, если нет, то во вспомогательный массив очередным элементом копируем его. Искать можно, конечно, и перебором, но лучше двоичным поиском, благо функция сортировки у вас уже есть. Выглядеть это будет примерно так:
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| bool IsMember(int elem, const int* arr, int sz);
void In1stNotIn2nd(const int* arr1, int sz1, const int* arr2, int sz2, int* arr, int& sz)
{
sz = 0;
int* temp = new int[sz1];
for (int i = 0; i < sz1; ++i)
if (! IsMember(arr1[i], arr2, sz2)) //если используем двоичный поиск, то arr2 должен быть уже отсортирован где-то снаружи
temp[sz++] = arr1[i];
delete[] arr;
arr = new int[sz];
for (int i = 0; i < sz; ++i)
arr[i] = temp[i];
delete[] temp;
} |
|
Реализация пунктов 2 и 3 - это вызов этой функции с аргументами A и B (2) и наоборот (3). Потом можно создать массив размера, равного сумме размеров этих результирующих и скопировать туда их элементы. Пункт 1 - почти то же, что вышеприведенная функция, только в if-е нужно убрать отрицание.