CPallini
Настоящий (по крайней мере, я надеюсь) C
реализация
Обратите внимание, что это точная обязанность вызывающего абонента освободить память.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
int * uni(int set1[], size_t size1, int set2[], size_t size2, size_t * psizer);
int main()
{
int set1[] = {3, 5, 6,-1, 42, 28};
int set2[] = {100, 5, -23, 42,18};
size_t size1 = sizeof(set1) /sizeof(set1[0]);
size_t size2 = sizeof(set2) /sizeof(set2[0]);
int * set3;
size_t size3;
set3 = uni(set1, size1, set2, size2, &size3);
if ( set3 )
{
for (size_t i = 0; i<size3; ++i)
printf("%d ", set3[i]);
printf("\n");
free(set3);
}
return 0;
}
int * uni(int set1[], size_t size1, int set2[], size_t size2, size_t * psizer)
{
assert( set1 && set2 && psizer);
int * setr = (int * ) malloc( (size1+size2) * sizeof(setr[0]));
if ( ! setr ) return NULL;
memcpy( setr, set1, size1 * sizeof(set1[0]));
*psizer = size1;
for (size_t i = 0; i<size2; ++i)
{
size_t j;
for (j=0; j<size1; ++j)
{
if (set2[i] == set1[j])
break;
}
if ( j == size1 )
{
setr[(*psizer)++] = set2[i];
}
}
setr = realloc( setr, *psizer*sizeof(setr[0]));
return setr;
}
C++
с другой стороны, с мощью своей стандартной библиотеки позволяет вам совершенно другой подход
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> set1{3, 5, 6,-1, 42, 28};
set<int> set2{100, 5, -23, 42,18};
set<int> setr{set1};
setr.insert( set2.begin(), set2.end() );
for (auto x : setr)
cout << x << " ";
cout << endl;
}