How to merge two arrays in one array without duplicate (repetition) numbers in C

4 Answers

0 votes
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
 
#define LEN 10
#define LEN1 5
#define LEN2 9
 
void print_array(int arr[]);
bool number_exist(int arr[], int n);
void merge_without_duplicate(int num1[], int num2[], int numbers[]);

int main(void)
{
    int numbers[LEN1 + LEN2] = { 0 };
    int num1[LEN1] = { 1, 2, 3, 3, 4 }; //  sorted array
    int num2[LEN2] = { 5, 6, 7, 7, 7, 8, 9, 9, 10 }; // sorted array
    
    merge_without_duplicate(num1, num2, numbers);
    
    print_array(numbers); // sorted array, no duplicates
 
    return 0;
}

void merge_without_duplicate(int num1[], int num2[], int numbers[]) {
   int i = 0, j = 0, k = 0;;
      
    while (i < LEN1 && j < LEN2) {
        if (num1[i] <= num2[j]) {
            if (number_exist(numbers, num1[i]))
                i++;
            else {
                numbers[k] = num1[i];
                i++;
                k++;
            }
        } 
        else {
            if (number_exist(numbers, num2[j]))
                j++;
            else {
                numbers[k] = num2[j];
                k++;
                j++;
            }
        }
    }
     
    while (i < LEN1) {
        if (number_exist(numbers, num1[i]))
            i++;
        else {
            numbers[k] = num1[i];
            i++;
            k++;
        }
    }
     
    while (j < LEN2) {
        if (number_exist(numbers, num2[j]))
            j++;
        else {
            numbers[k] = num2[j];
            k++;
            j++;
        }
    } 
}

bool number_exist(int arr[], int n) {
    for (int i = 0; i < LEN1 + LEN2; i++)
        if (arr[i] == n)
            return true;
             
    return false;
}

void print_array(int arr[]) {
    for (int i = 0; i < LEN1 + LEN2; i++)
        printf("%3d ", arr[i]);
}

    
     
/*
       
run:
 
  1   2   3   4   5   6   7   8   9  10   0   0   0   0 
 
*/

 



answered Jan 30, 2016 by avibootz
edited Oct 10, 2024 by avibootz
0 votes
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define LEN 10
#define LEN1 5
#define LEN2 8

void print_array(int arr[]);
void set_num1(int numbers[], int num1[], int *i, int *k);
void set_num2(int numbers[], int num2[], int *j, int *k);
bool number_exist(int arr[], int n);

int main(void)
{
    int numbers[LEN1+LEN2] = { 0 };
	int num1[LEN1] = { 1, 2, 3, 3, 4 }; //  sorted array
	int num2[LEN2] = { 5, 6, 7, 7, 7, 8, 9, 10 }; // sorted array
	int i = 0, j = 0, k = 0;;
     
	while (i < LEN1 && j < LEN2) 
	{
		if (num1[i] <= num2[j]) 
			set_num1(numbers, num1, &i, &k);
		else 
			set_num2(numbers, num2, &j, &k);
	}
	
	while (i < LEN1) 
		set_num1(numbers, num1, &i, &k);
	
	while (j < LEN2) 
		set_num2(numbers, num2, &j, &k);
	
	print_array(numbers); // sorted array, no duplicates

    return 0;
}
void print_array(int arr[])
{
	for (int i = 0; i < LEN1 + LEN2; i++)
		printf("%3d ", arr[i]);
}
void set_num1(int numbers[], int num1[], int *i, int *k)
{
	if (number_exist(numbers, num1[*i]))
		(*i)++;
	else
	{
		numbers[*k] = num1[*i];
		(*i)++;
		(*k)++;
	}
}
void set_num2(int numbers[], int num2[], int *j, int *k)
{
	if (number_exist(numbers, num2[*j]))
		(*j)++;
	else
	{
		numbers[*k] = num2[*j];
		(*k)++;
		(*j)++;
	}
}
bool number_exist(int arr[], int n)
{
	for (int i = 0; i < LEN1 + LEN2; i++)
		if (arr[i] == n)
			return true;
			
	return false;
}
   
    
/*
      
run:

  1   2   3   4   5   6   7   8   9  10   0   0   0

*/

 



answered Jan 30, 2016 by avibootz
0 votes
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define LEN 10
#define LEN1 5
#define LEN2 8

void print_array(int arr[]);
void set_num(int numbers[], int num[], int *x, int *y);
bool number_exist(int arr[], int n);

int main(void)
{
    int numbers[LEN1+LEN2] = { 0 };
	int num1[LEN1] = { 1, 2, 3, 3, 4 }; //  sorted array
	int num2[LEN2] = { 5, 6, 7, 7, 7, 8, 9, 10 }; // sorted array
	int i = 0, j = 0, k = 0;;
     
	while (i < LEN1 && j < LEN2) 
	{
		if (num1[i] <= num2[j]) 
			set_num(numbers, num1, &i, &k);
		else 
			set_num(numbers, num2, &j, &k);
	}
	
	while (i < LEN1) 
		set_num(numbers, num1, &i, &k);
	
	while (j < LEN2) 
		set_num(numbers, num2, &j, &k);
	
	print_array(numbers); // sorted array, no duplicates

    return 0;
}
void print_array(int arr[])
{
	for (int i = 0; i < LEN1 + LEN2; i++)
		printf("%3d ", arr[i]);
}
void set_num(int numbers[], int num[], int *x, int *y)
{
	if (number_exist(numbers, num[*x]))
		(*x)++;
	else
	{
		numbers[*y] = num[*x];
		(*x)++;
		(*y)++;
	}
}
bool number_exist(int arr[], int n)
{
	for (int i = 0; i < LEN1 + LEN2; i++)
		if (arr[i] == n)
			return true;
			
	return false;
}
   
    
/*
      
run:

  1   2   3   4   5   6   7   8   9  10   0   0   0

*/

 



answered Jan 30, 2016 by avibootz
0 votes
#include <stdio.h>
#include <stdlib.h>
#include <time.h>  
 
int compare(const void* a, const void* b) {
    return (*(int*)a - *(int*)b);
}
 
int* merge(int arr1[], int arr1_size, int arr2[], int arr2_size, int* mergedArray_size) {
    int* mergedSet = calloc(0, sizeof(int));
 
    for (int i = 0; i < arr1_size; i++) {
        int num = arr1[i];
        int found = 0;
        for (int j = 0; j < *mergedArray_size; j++) {
            if (mergedSet[j] == num) {
                found = 1;
                break;
            }
        }
        if (!found) {
            mergedSet = realloc(mergedSet, (*mergedArray_size + 1) * sizeof(int));
            mergedSet[(*mergedArray_size)++] = num;
        }
    }
 
    for (int i = 0; i < arr2_size; i++) {
        int num = arr2[i];
        int found = 0;
        for (int j = 0; j < *mergedArray_size; j++) {
            if (mergedSet[j] == num) {
                found = 1;
                break;
            }
        }
        if (!found) {
            mergedSet = realloc(mergedSet, (*mergedArray_size + 1) * sizeof(int));
            mergedSet[(*mergedArray_size)++] = num;
        }
    }
 
    return mergedSet;
}
 
int main() {
    int arr1[] = { 1, 2, 2, 3, 7, 7, 7, 8, 9 };
    int arr1_size = sizeof(arr1) / sizeof(arr1[0]);
    int arr2[] = { 0, 0, 4, 4, 4, 5, 6, 7, 7, 8 };
    int arr2_size = sizeof(arr2) / sizeof(arr2[0]);
    int mergedArray_size = 0;
 
    int* mergedArray = merge(arr1, arr1_size, arr2, arr2_size, &mergedArray_size);
 
    qsort(mergedArray, mergedArray_size, sizeof(int), compare);
 
    for (int i = 0; i < mergedArray_size; i++) {
        printf("%d, ", mergedArray[i]);
    }
 
    free(mergedArray);
 
    return 0;
}
 
 
 
 
/*
run:
 
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
 
*/

 



answered Feb 5, 2025 by avibootz

Related questions

1 answer 123 views
1 answer 118 views
1 answer 179 views
2 answers 299 views
2 answers 281 views
2 answers 207 views
...