#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct
{
int *vec;
size_t size;
size_t count;
} vector;
// Inicializa un objeto de tipo vector
vector NewVector()
{
vector vect;
memset(&vect, 0, sizeof(vector));
return vect;
}
// Libera la memoria asociada a un vector
void FreeVector(vector * vect)
{
// Liberamos la memoria reservada
free(vect->vec);
// Reseteamos las variables de estado, para ser coherentes
memset(vect, 0, sizeof(vector));
}
// Actualiza el vector para que sea capaz de almacenar un número de elementos dado
int SetCapacity(vector* vect, size_t capacity)
{
if( capacity > vect->size )
{
int* ptr = (int*)realloc(vect->vec, vect->size + 10);
if( ptr == NULL )
{
return 0; // Error, no hay memoria suficiente
}
vect->vec = ptr;
vect->size = capacity;
}
return 1;
}
// Añade un nuevo elemento al final del vector (redimensiona el array si es necesario)
int Add(vector* vect, int value)
{
if( vect->size == vect->count )
{
// Incrementamos la capacidad en 10 (es muy costoso hacer incrementos individuales)
if( !SetCapacity(vect, vect->size + 10) )
{
return 0; // Error, no hay memoria
}
}
vect->vec[vect->count++] = value;
return 1;
}
void llenar(vector *vect)
{
for(size_t i = 0; i < vect->size; i++)
{
Add(vect, rand()%10);
}
}
void mostrar(vector const* vect)
{
for(size_t i = 0; i < vect->count; i++)
{
printf("%i ",vect->vec[i]);
}
putchar('\n');
}
void sacar_repetidos(vector const* original, vector * sin_repetidos)
{
for (size_t i = 0; i < original->count; i++)
{
int repetido = 0;
for( size_t j=0; j<sin_repetidos->count && !repetido; j++)
{
repetido = original->vec[i] == sin_repetidos->vec[j];
}
if( !repetido )
{
Add(sin_repetidos, original->vec[i]);
}
}
}
int main(void)
{
vector original = NewVector();
vector nuevo = NewVector();
SetCapacity(&original, 4);
srand(time(NULL));
llenar(&original);
printf("Vector original:");
mostrar(&original);
sacar_repetidos(&original, &nuevo);
printf("Vector sin repetidos:");
mostrar(&nuevo);
printf("Tamaño del nuevo vector: %lu\n", nuevo.count);
FreeVector(&original);
FreeVector(&nuevo);
return 0;
}