es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , , , ,

Answer

  1. Avatar for 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ándar erase() para eliminarlas. Así es cómo puedes modificar tu código para lograr esto:

    #include <stdio.h>
    #include <stdlib.h>
    #define DIM 50
    
    int main() {
        int *A, N, X;
        int *P1, *P2;
    
        do {
            scanf("%d", &N);
        } while (N < 0 || N > DIM);
    
        A = (int*)malloc(N * sizeof(int));
    
        for (P1 = A; P1 < A + N; P1++)
            scanf("%d", P1);
    
        printf("Ingresa X: ");
        scanf("%d", &X);
    
        printf("A: ");
        for (P1 = A; P1 < A + N; P1++)
            printf("%d ", *P1);
        printf("\n");
    
        // Aplicar el idiom "erase-remove"
        P2 = remove(A, A + N, X);
        N = P2 - A;
        A = realloc(A, N * sizeof(int));
    
        printf("Nuevo A: ");
        for (P1 = A; P1 < A + N; P1++)
            printf("%d ", *P1);
        printf("\n");
    
        free(A);
        return 0;
    }
    

    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() y realloc() son parte de la biblioteca estándar en C, por lo que no es necesario implementarlos tú mismo.</stdlib.h></stdio.h>

Comments are closed.