Escrever a função int uniao(int *A, int n, int *B, int m, int *C), que recebe como parâmetros os vetores A (de tamanho n) e B (de tamanho m) e constrói o vetor C, que deve conter todos os elementos de A e B, sem repetição. Os vetores devem ser alocados dinamicamente. A função deve retornar o tamanho do vetor C.

Passo 1

O enunciado pede para criar uma função que receba dois vetores A (tamanho n) e B (tamanho m) e construa dinamicamente um terceiro vetor C contendo a união dos elementos de A e B, sem repetições, retornando o tamanho efetivo de C. Vamos usar alocação dinâmica (malloc/realloc) e pesquisa linear para evitar duplicados.

Passo 2

Alocamos C com capacidade máxima n+m, pois na pior das hipóteses todos os elementos de A e B são distintos.
Copiamos todos os n elementos de A para C. Mantemos um contador sizeC que indica quantos elementos efetivos já existem em C.

Passo 3

Para cada elemento b de B fazemos uma busca linear em C (índices 0…sizeC-1). Se não encontrarmos b em C, adicionamos b em C[sizeC++] e seguimos.
Depois de processar todos os elementos de B, ajustamos o tamanho de C ao número exato de elementos usando realloc.
A função retorna sizeC (número de elementos únicos em C).

Resposta

#include <stdlib.h>
#include <stdio.h>
// A assinatura abaixo usa int **C para que possamos fazer malloc dentro da função
int uniao(int *A, int n, int *B, int m, int **C) {
int capacity = n + m;
*C = (int *) malloc(capacity * sizeof(int));
if (*C == NULL) {
return -1; // falha na alocação
}
int sizeC = 0;
// 1) copia todos os elementos de A
for (int i = 0; i < n; i++) {
    (*C)[sizeC++] = A[i];
}

// 2) processa B, adicionando só os que não estão em C
for (int i = 0; i < m; i++) {
    int x = B[i];
    int found = 0;
    for (int j = 0; j < sizeC; j++) {
        if ((*C)[j] == x) {
            found = 1;
            break;
        }
    }
    if (!found) {
        (*C)[sizeC++] = x;
    }
}

// 3) reduz o vetor ao tamanho exato
*C = (int *) realloc(*C, sizeC * sizeof(int));
return sizeC;
}
// Exemplo de uso:
// int *A = …; int *B = …; int *C;
// int tamC = uniao(A, n, B, m, &C);
// // agora C[0…tamC-1] contém a união de A e B
// free©;

Exercícios relacionados