#include <stdio.h>
typedef struct Array {
    int* data;
    int length;
    int capacity;
} Array;
void print_array(Array arr, const char* msg) {
    printf(msg);
    for (int i = 0; i < arr.length; i++) {
        printf("%d ", arr.data[i]);
    }
    printf("\n");
}
int random(int min, int max) {
    return rand() % max + min;
}
void swap(int* left, int* right) {
    int tmp = *left;
    *left = *right;
    *right = tmp;
}
Array mk_random_array() {
    Array result;
    result.capacity = random(1, 5);
    result.length = result.capacity;
    result.data = (int*)malloc(sizeof(int) * result.capacity);
    for (int i = 0; i < result.capacity; i++) {
        result.data[i] = random(0, 9);
    }
    return result;
}
Array array_concat(Array left, Array right) {
    Array result;
    result.capacity = left.length + right.length;
    result.length = result.capacity;
    result.data = (int*)malloc(sizeof(int) * result.capacity);
    memcpy(result.data, left.data, sizeof(int) * left.length);
    memcpy(result.data + left.length, right.data, sizeof(int) * right.length);
    return result;
}
void array_sort(Array arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        for (int j = 0; j < arr.length - i - 1; j++) {
            if (arr.data[j] > arr.data[j + 1]) {
                swap(&arr.data[j], &arr.data[j + 1]);
            }
        }
    }
}
Array array_distinct(Array arr) {
    for (int j = 0; j < arr.length - 1;) {
        if (arr.data[j] == arr.data[j+1]) {
            for(int i = j+1; i < arr.length; ++i) {
                arr.data[i-1] = arr.data[i];
            }
            arr.length--;
        }
        else ++j;
    }
    return arr;
}
int main() {
    srand(time(NULL));
    Array a = mk_random_array();
    print_array(a, "Первый массив:\t");
    Array b = mk_random_array();
    print_array(b, "Второй массив:\t");
    Array c = array_concat(a, b);
    print_array(c, "Результат объединения:\t");
    array_sort(c);
    print_array(c, "После сортировки:\t");
    c = array_distinct(c);
    print_array(c, "Убраны дубликаты:\t");
    free(a.data);
    free(b.data);
    free(c.data);
    return 0;
}