Cómo eliminar un elemento de un array dinámico - CONSULTA

Iniciado por Cero++, 11 Diciembre 2018, 21:26 PM

0 Miembros y 1 Visitante están viendo este tema.

Cero++

Buenas a todos, quería saber cómo podría eliminar un dato repetido en un arreglo dinámico, lo primero que hice fue ordenarlo de menor a mayor, para que los valores repetidos quedaran juntos, el tema es, cómo debería utilizar un nuevo puntero para que éste sólo copie los valores no repetidos.
Ya le busqué la vuelta,pero siempre me muestra los mismos valores, no quita los repetidos, tampoco se reduce mi nuevo vector.

Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

K-YreX

Si tienes el vector ordenado es más fácil. Piensa que al estar ordenado sólo tienes que comprobar que el nuevo valor que vas a meter no es igual al último elemento del array final.
Si no estuviese ordenado tendrías que revisar todo el array final para ver que el valor que vas a introducir no está ya en el array.
Si el array es dinámico tendrás que hacer algún cálculo para saber el nuevo tamaño.

Entonces recorres el array que tienes con los valores repetidos y para cada elemento, si el array final está vacío o este elemento es distinto al último que has introducido en el array final, entonces lo introduces, sino, pasas al siguiente elemento. Suerte :-X

Ver el código que tienes puede ayudar...
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

CalgaryCorpus

Si quieres resolver el no tener duplicados sin programarlo explícitamente, crea un set. Los sets solo almacenan valores únicos.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Cero++

#3
Cita de: YreX-DwX en 11 Diciembre 2018, 21:32 PM
Ver el código que tienes puede ayudar...

Aquí te dejo mi código, en éste tenía que crear un struc con dos punteros que apuntaran a cualquier par repetido y si no había, retornaba los dos punteros del struc con el valor nulo, sino, retornaba los valores. PD: Tenía que hacerlo dentro de una función.
Ahora bien, el siguiente ejercicio, me pedía que a esos valores repetidos lo elimine, teniendo así, un nuevo arreglo sin los datos repetidos. El tema es que no sé el cómo hacer eso, los ordené, pero hasta ahí llego  :-( No entiendo muy bien lo del array final y eso, me puedes dar un ejemplo simple?

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;
struct Apuntadores{
int *a1=nullptr,*a2=nullptr;
};
void Acomodar_arreglo(int *a, int size);
Apuntadores Buscar_repetidos(int *a, int size);
int main(int argc, char *argv[]) {
srand(time(0));
int *p=nullptr, n;
cout<<"Ingrese el tamanio del vector: "; cin>>n;
p=new int [n];
for(int i=0;i<n;i++) {
p[i]=1+rand()%10;
}
for(int i=0;i<n;i++) {
cout<<p[i]<<setw(2)<<" ";
} cout<<endl;
Acomodar_arreglo(p,n);
for(int i=0;i<n;i++) {
cout<<p[i]<<setw(2)<<" ";
}
cout<<endl;
Apuntadores A=Buscar_repetidos(p,n);
if(A.a1==nullptr && A.a2==nullptr){
cout<<"No hay valores repetidos";
}else{
cout<<"Los valores repetidos son: "<<*(A.a1)<<" y "<<*(A.a2)<<endl;

delete [] p;
return 0;
}


void Acomodar_arreglo(int *a, int size){
int guardar;
for(int i=0;i<size;i++) {
for(int j=0;j<size;j++) {
if(a[j]>=a[j+1]){
guardar=a[j];
a[j]=a[j+1];
a[j+1]=guardar;
}
}
}

}
Apuntadores Buscar_repetidos(int *a, int size){
Apuntadores A;
for(int i=0;i<size;i++) {
if(a[i]==a[i+1]){
A.a1=a+i;
A.a2=a+i+1;
}
}
return A;
}
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

Cero++

Cita de: CalgaryCorpus en 11 Diciembre 2018, 21:36 PM
Si quieres resolver el no tener duplicados sin programarlo explícitamente, crea un set. Los sets solo almacenan valores únicos.


No sé qué es un set  :-(
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]


Cero++

Cita de: CalgaryCorpus en 11 Diciembre 2018, 22:58 PM
http://www.cplusplus.com/reference/set/set/
Gracias, pero quiero aprender a hacerlo yo mismo antes de usar funciones pre-hechas.
Hice este código, no funciona para eliminar, pero que tan errado estoy? Sigo sin entender.

Código (cpp) [Seleccionar]
int *Eliminar_repetidos(int *a, int size){
int *aux2=nullptr;
int contador=0;
for(int i=0;i<size;i++) {
if(a[i]==a[i+1]){
contador++;
}
}
for(int i=0;i<size-contador;i++) {
aux2[i]=0;
}
aux2=new int [size-contador];
int i=0;
while(a[i]!=a[i+1] || i<size-contador){
aux2[i]=a[i];
i++;
}
delete [] a;
return aux2;
}
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

K-YreX

Bueno, algunos de tus errores:
- En las líneas 9-10 accedes al array nuevo pero no reservas memoria en él hasta la línea 12.
- Al terminar no sabes cual es el tamaño del nuevo array para poder recorrerlo.

Recomendaciones:
- Pasa el puntero por referencia, cuando tienes el nuevo terminado se lo asignas al original (no sin antes haber liberado la memoria del primero).
- En el <for> de las líneas 4-8 en vez de contar los que son iguales, cuenta los que son distintos (cambiando el "==" por "!=" en el <if>).
- Haz que la función devuelva el nuevo tamaño del array porque sino no puedes recorrerlo (tambien puedes pasar el segundo parámetro por referencia para modifcarlo, pero tendrás que hacerlo al final de la función).

Suerte :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;