Eliminar un elemento de matriz en C

Escribí el siguiente progtwig para eliminar un elemento de matriz ingresado por el usuario.

#include #include void main() { int j,i,a[100],n,key,l; clrscr(); printf("Enter the number of elements:"); scanf("%d",&n); printf("\nEnter the elements:\n"); for(i=0;i<n;i++) scanf("%d",&a[i]); printf("\nEnter the element to delete:"); scanf("%d",&key); l=n; //Length of the array for(i=0;i<l;i++) { if(a[i]==key) { for(j=i;j<l;j++) a[j]=a[j+1]; l--; //Decreasing the length of the array } } printf("\nThe new array is \n"); for(i=0;i<l;i++) printf("%d ",a[i]); getch(); } 

Funciona bien para la mayoría de las entradas, pero cuando la entrada es algo como: 1 2 2 3 5 (aquí 2 se repiten consecutivamente) y el elemento que se eliminará es 2, la salida es 1 2 3 5.

¿Cómo puedo modificar el progtwig para que se eliminen todas las instancias del elemento introducido?

Después de l– pongo i– también como se muestra abajo

 if(a[i]==key) { for(j=i;j 

Otros carteles te han dado 2 soluciones … Creo que entender por qué sucede también es bueno 🙂

Tomemos su ejemplo 1, 2, 2, 3, 5 y sigamos el código línea por línea

 i = 0; /* first time through the loop; i "points" to 1 */ if (a[i] == 2) ... /* nope; next loop */ i = 1; if (a[1] == 2) ... /* yes! let's go inside the if */ /* move all elements back ** and "decrease" array length */ /* array is now 1, 2, 3, 5 */ /* next loop */ i = 2; if (a[i] == 2) ... /* nope; OH! Wait ... ** a[1] is the new 2 and it wasn't checked */ 

Si no le importa el orden de los elementos en la matriz, puede mover el último elemento de la matriz al espacio recién formado (reduciendo astutamente la longitud de la matriz en uno). Esto puede ser mucho más eficiente que desviar los elementos: en términos informáticos, esto hace que eliminar un elemento O (1) en lugar de O (N).

 a[i] = a[--l]; 

Si su índice i está en bucle sobre la matriz, querrá volver sobre este elemento:

 a[i--] = a[--l]; 

Por ejemplo, para eliminar todos los elementos ‘3’ de una matriz de longitud ‘l’:

 for (i = 0; i < l; ++i) { if (a[i] == 3) { a[i--] = a[--l]; } } 

Si le importa el orden de los elementos en la matriz, es más eficiente usar memmove en lugar de mover elementos a mano. Está diseñado para ser utilizado donde la memoria de origen y destino se superponen.

 memmove(a + i, a + i + 1, sizeof(a[0]) * (l - i - 1)); 

Cambia “si” a “mientras”:


     para (i = 0; i 

utilizar una nueva matriz.

 int array[l]; int k=0; for(i=0;i 
 #include int main(){ int size; int array[20]; int delete_pos; int i; printf("Enter the Size of the Array :"); scanf("%d",&size); for(i=0;i<=size-1;i++){ //no of elements taken are 1 less than size of the array asked. printf("\nEnter the element[%d] :",i+1); scanf("%d",&array[i]); } printf("\nEnter the Position of the array to be deleted :"); scanf("%d",&delete_pos); for(i=delete_pos-1;i<=size;i++){ //every element of the array is replaced by array on next position. array[i]=array[i+1];} size=size-1; // Reducing the size of the array as one element is deleted. printf("Your new array is \n"); for(i=0;i<=size-1;i++){ //printing the entire new array. printf("%d ",array[i]); } printf("\n\n"); return 0; }