función que elimina un entero de un arreglo utilizando un puntero en C
Tengo una pregunta en la cual necesito escribir una función que lea un entero X y un arreglo A de tipo int (tamaño N) desde el teclado y elimine todas las ocurrencias de X en A.
Por ejemplo, la entrada es:
5
1 2 3 4 3
3
Y debería devolver:
A: 1 2 3 4 3
Nuevo A: 1 2 4
Hasta ahora, mi código es el siguiente:
#include <stdio.h>
#include<stdlib.h>
#define DIM 50
int main() {
int *A;
int N, X;
int *P1, *P2;
do{
scanf(“%d”, &N);
}while(N<0 || N>DIM);
A= (int)malloc(Nsizeof(int));
for(P1=A; P1<a+n ;=”” p1++)=”” scanf(“%d=”” “,=”” p1);=”” printf(“\n”);=”” scanf(“%d”,&x);=”” printf(“a:=”” “);=”” for(p1=”A;”></a+n><a+n ;=”” p1++)=”” printf(“%d=”” “,=”” p1);=”” printf(“\n”);=”” p2=”A;” for(p1=”A;”></a+n><a+n ;=”” p1++){=”” if(p1=”” !=”X){” p2=”P1;” p2++;=”” }=”” }=”” printf(“nuevo=”” a:=”” “);=”” for(p1=”A;”></a+n><p2 ; p1++)
printf(“%d “, *p1);
printf(“\n”);
return 0;
} ;=”” p1++)=”” printf(“%d=”” “,=”” *p1);=”” printf(“\n”);=”” return=”” 0;=””></p2 ; p1++)
printf(“%d “, *p1);
printf(“\n”);
return 0;
}></stdlib.h></stdio.h>
davy.ai
Para eliminar todas las ocurrencias de X en A, puedes utilizar el idiom “erase-remove” en C. Esto implica usar la función de la biblioteca estándar
remove()
para mover todas las ocurrencias de X al final del arreglo, y luego usar la función de la biblioteca estándarerase()
para eliminarlas. Así es cómo puedes modificar tu código para lograr esto:Explicación:
– Después de leer los valores de entrada N y A, solicitamos al usuario que ingrese el valor X.
– Imprimimos el arreglo original A.
– Aplicamos el idiom “erase-remove” de la siguiente manera:
–
remove()
toma tres argumentos: un puntero al principio del arreglo, un puntero al final del arreglo y el valor a eliminar. Devuelve un puntero al primer elemento del arreglo después de los elementos eliminados. Almacenamos este puntero en P2.– Calculamos el nuevo tamaño del arreglo N restando el puntero original A al nuevo puntero P2.
– Utilizamos
realloc()
para redimensionar el arreglo A al nuevo tamaño N.– Finalmente, imprimimos el nuevo arreglo A y liberamos la memoria asignada a este.
Nótese que
remove()
yrealloc()
son parte de la biblioteca estándar en C, por lo que no es necesario implementarlos tú mismo.</stdlib.h></stdio.h>