Remove element from a Vector in "C"

0

I need to fill two vectors, A and B, with 10 elements each, then make the Intersection and the Union, in the union, I have to remove the repeated elements.

At the moment, the intersection was made, within the intersection for I put in another vector (vectorR [c]) the indices of the elements that are in B and in A

In the union, I first make a for and add all elements of vector A, in the first 10 positions of another vector (vector U []);

But with a difficulty of solving the passage of the elements of vectorB to vectorU, removing the indices containing the elements repeated between vectorA and vectorB; follow the code:

#include <stdlib.h>  
#include <time.h> 


int Conjuntos()
{

int vetorA[10];
int vetorB[20];

int *vetorR;

int *vetorU;
int *vetorIn;
int *vetorDif;


int tamVetor = 0;
int tamVetorU = 0;

vetorIn = malloc(sizeof(int*)*tamVetor);

vetorDif = malloc(sizeof(int*)*tamVetor);

vetorU = malloc(sizeof(int*)*tamVetorU);


vetorR = malloc(sizeof(int*)*tamVetor);


srand(time(NULL));// inicia a funcao rand semente;

for (int i = 0; i < 10; i++)
{
    vetorA[i] =  rand() % 100;


}


for (int i = 10; i < 20; i++)
{

    vetorB[i] =  30 + ( rand() % 70 );

}
///
    printf("Elementos de A:{ ");
for (int i = 0; i < 10; i++)
{

    printf("%d, ",vetorA[i]);
}
printf("}\n");

// imprimi vetor b

    printf("Elementos de B:{ ");
for (int i = 10; i < 20; i++)
{

    printf("%d, ",vetorB[i]);
}
printf("}\n");

//verifica quais numeros sao repetidos
int c = 0;
for(int i = 0; i < 10; i++)

{
    for (int a = 10; a < 20; a++)
    {

    if (vetorA[i] == vetorB[a])
    {

    tamVetor++;

    vetorIn[c] = vetorA[i];
    vetorR[c] = a; //guarda os indices dos elementos do vetorB que tambem estao no vetorA
    c++;





vetorIn = realloc(vetorIn,sizeof(int)*tamVetor);

vetorR = realloc(vetorR
,sizeof(int)*tamVetor);

if (vetorIn==NULL)
{
printf("Memoria insuficiente.\n");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}


if (vetorR==NULL)
{
printf("Memoria insuficiente.\n");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}




    }//fecha o if



    }// fecha for de dentro
    }//fecha o for de fora

    printf(" tamanho do vetor e: %d\n", tamVetor);

    printf("Os elementos da Intersecao entre A e B sao: { ");

    for(int i = 0; i < tamVetor; i++)
    {
        printf("%d, ", vetorIn[i]);

    }

    printf("}\n");

///  adiciona os elementos de a em umiao    

for (int i= 0; i < 10; i++)
{


        tamVetorU++;


    vetorU = realloc(vetorU,sizeof(int*)*tamVetorU);



if (vetorU==NULL)
{
printf("Memoria insuficiente.\n");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}

vetorU[i] = vetorA[i];
    }


printf(" indices do vetor b q possuem numeros iguais ao vetor a\n");
for (int i = 0; i < tamVetor; i++)
{
printf("%d \n", vetorR[i]);
}




//adiciona os elementos de b a unao

/*Aqui esta o que nao consiguo resolver, neste for, adiciono os elementos do vetorB ao vetorU, porem preciso retirar os elementos repetipos, que estao no vetor[R], em alguns teste, consegui, porem na posicao do elemento repetido ficava o "0" e o ultimo elemento do vetor nao entrava no vetor[i]
*/


for(int i = 10; i < 20; i++)

{
    for(int c = 0; c < tamVetor; c++)
    {

    if (i == vetorR[c])
    {






    }
    else
   {
    tamVetorU++;


    vetorU = realloc(vetorU,sizeof(int*)*tamVetorU);



if (vetorU==NULL)
{
printf("Memoria insuficiente.\n");
exit(1); 
}





vetorU[i]= vetorB[i];


   }
    }
}










//int n = 20 - tamVetor;

printf ("Os elementos da uniao entre A e B sao: { ");
for (int i = 0; i < tamVetorU; i++)
{

printf(" %d, ", vetorU[i]);
    }



printf("}\n");


}












int main()
{

    Conjuntos();

    return 0;
}

// after the issues

   for(int i=10; i<20; i++) //Coloca -1 nos repetidos de B
   for(int c=0; c<tamVetor; c++){
   if (vetorB[i] == vetorIn[c])
   {
   vetorB[i] = -1;
   }
   }

   printf("os elementos de b agr sao: ");

   for (int i = 10; i < 20; i++)
     {
    printf("%d,",vetorB[i]);

   }

   printf("}\n");


    int k = 10;
   int tamVetorU = 20 - tamVetor;
   vetorU = realloc(vetorU,sizeof(int*)*tamVetorU);

    printf("o tamanho do vetor u e: %d\n", tamVetorU);

   for(int i=0; i<tamVetorU;i++){ //Preenche vetorU
   if (i<10){
   vetorU[i] = vetorA[i];

   }
    else
   {
  if (vetorB[k] != -1) 
  {
  vetorU[i] = vetorB[k];

}
k++;

}
 }
    
asked by anonymous 20.05.2018 / 18:03

2 answers

1

If you already know the size of the vectors, I do not see the need to implement an algorithm using dynamic allocation.

Here is a (tested) program that can solve your problem using a function specific to each operation:

#include <stdio.h>

void interseccao( int saida[], int * stam, int v1[], int v1tam, int v2[], int v2tam )
{
    int i = 0;
    int j = 0;

    *stam = 0;

    while( (i < v1tam) && (j < v2tam) )
    {
        if( v1[i] < v2[j] )
        {
            i++;
        }
        else if( v2[j] < v1[i] )
        {
            j++;
        }
        else if( v1[i] == v2[j] )
        {
            *saida++ = v2[ j++ ];
            (*stam)++;
            i++;
        }
    }
}


void uniao( int saida[], int * stam, int v1[], int v1tam, int v2[], int v2tam )
{
    int i = 0;
    int j = 0;
    int k = 0;

    *stam = v1tam + v2tam;

    for( i = 0; i < v1tam; i++ )
        saida[j++] = v1[i];

    for( i = 0; i < v2tam; i++ )
        saida[j++] = v2[i];

    for( i = 0; i < *stam; i++ )
    {
        for( j = i + 1; j < *stam; j++ )
        {
            if( saida[i] == saida[j] )
            {
                for( k = j; k < *stam; k++ )
                    saida[ k ] = saida[ k + 1 ];

                (*stam)--;
                j--;
            }
        }
    }
}


void exibir_vetor( char * desc, const int v[], int tam )
{
    int i = 0;

    printf("%s", desc );

    for( i = 0; i < tam; i++ )
        printf(" %d", v[i] );

    printf("\n");
}


int main( void )
{
    int A[ 10 ] = { 1, 2, 5, 7, 9, 10, 11, 13, 14, 19 };
    int B[ 10 ] = { 1, 3, 5, 7, 8, 10, 11, 12, 14, 16 };

    int saida[ 20 ];
    int n = 0;

    exibir_vetor( "Vetor A:", A, 10 );
    exibir_vetor( "Vetor B:", B, 10 );

    interseccao( saida, &n, A, 10, B, 10 );
    exibir_vetor( "Interseccao:", saida, n );

    uniao( saida, &n, A, 10, B, 10 );
    exibir_vetor( "Uniao:", saida, n );

    return 0;
}

Output:

Vetor A: 1 2 5 7 9 10 11 13 14 19
Vetor B: 1 3 5 7 8 10 11 12 14 16
Interseccao: 1 5 7 10 11 14
Uniao: 1 2 5 7 9 10 11 13 14 19 3 8 12 16
    
21.05.2018 / 00:06
0

I have not seen your entire code, but the simplest solution that came into my mind is:

As you already have the elements that are in both A and B, do a "sweep" (for inside another) by placing in the vectorB in place of the elements that are repeated a key value type "-1" and inside when it passes you just transfer from B to the vector U [] elements that are different from "-1" if(vetorB[i] != -1) .

int aux = 30 - tamVetor; //identifica o tamanho de vetorU
int k=0; //variavel auxiliar
vetorU = malloc(sizeof(int)*aux); //dinamicamente vetorU
for(int i=0; i<20; i++) //Coloca -1 nos repetidos de B
  for(int y=0; y<tamVetor; y++){
    if(vetorB[i] == vetorIn[y])
      vetorB[i] = -1;
  }

for(int i=0; i<aux; i++){ //Preenche vetorU
  if(i<10)
    vetorU[i] = vetorA[i];
  else{
    if(vetorB[k] != -1)
      vetorU[i] = vetorB[k];
    k++;
  }
}
#include <stdlib.h>
#include <time.h>
#include <stdio.h>


int Conjuntos()
{

  int vetorA[10];
  int vetorB[10];
  int tamVetor = 0;
  int tamVetorU = 0;
  int *vetorR;
  int *vetorU;
  int *vetorIn = malloc(sizeof(int)*tamVetor);
  int *vetorDif;
  int k = 0;
  int i;
  srand(time(NULL));// inicia a funcao rand semente;

  for (int i = 0; i < 10; i++)
      vetorA[i] =  rand() % 100;

  for (int i = 0; i < 10; i++)
      vetorB[i] =  30 + ( rand() % 70 );

  printf("Elementos de A:{ ");

  for (int i = 0; i < 10; i++)
      printf("%d, ",vetorA[i]);

  printf("}\n");

  // imprimi vetor b

  printf("Elementos de B:{ ");
  for (int i = 0; i < 10; i++)
      printf("%d, ",vetorB[i]);

  printf("}\n");

  //verifica quais numeros sao repetidos

  int j = 0;
  for(int i = 0; i < 10; i++)
      for (int j = 0; j < 10; j++)
        if (vetorA[i] == vetorB[j])
        {
          tamVetor++;
          vetorIn[k] = vetorA[i];
          vetorIn = realloc(vetorIn,sizeof(int)*tamVetor);
          k++;
        }

  printf("Os elementos da Intersecao entre A e B sao: { ");
  for(int i = 0; i < tamVetor; i++)
    printf("%d, ", vetorIn[i]);

  printf("}\n");

  int aux = 20 - tamVetor; //identifica o tamanho de vetorU
  k=0; //variavel auxiliar
  vetorU = malloc(sizeof(int)*aux); //dinamicamente vetorU
  for(i=0; i<10; i++) //Coloca -1 nos repetidos de B
    for(j=0; j<tamVetor; j++){
      if(vetorB[i] == vetorIn[j])
        vetorB[i] = -1;
    }

  for(i=0; i<aux; i++){ //Preenche vetorU
    if(i<10)
      vetorU[i] = vetorA[i];
    else{
      if(vetorB[k] != -1)
        vetorU[i] = vetorB[k];
      k++;
    }
  }

  printf ("Os elementos da uniao entre A e B sao: { ");
  for (int i = 0; i < aux; i++)
    printf("%d, ", vetorU[i]);
  printf("}\n");

}

int main()
{

    Conjuntos();

    return 0;
}

    
20.05.2018 / 18:25