La suppression d'un élément de tableau en C
J'ai écrit le programme suivant pour supprimer un élément de tableau entrées par l'utilisateur.
#include <stdio.h>
#include <conio.h>
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();
}
Il fonctionne très bien pour la plupart des entrées, mais lorsque l'entrée est quelque chose comme: 1 2 2 3 5
(ici 2
répète consécutivement) et l'élément à supprimer est 2
, la sortie est 1 2 3 5
.
Comment puis-je modifier le programme de manière à ce que toutes les instances de l'élément est supprimé?
est-ce les devoirs ou pour un codage de test?
OriginalL'auteur Green Noob | 2011-12-25
Vous devez vous connecter pour publier un commentaire.
Après l-- mettre je-trop comme indiqué ci-dessous
OriginalL'auteur Shadow
D'autres affiches ont donné 2 solutions ... je pense comprendre pourquoi il arrive, c'est bon aussi 🙂
Prenons votre exemple
1, 2, 2, 3, 5
et respecter le code ligne par ligne+1: j'étais très confus jusqu'à ce que j'ai vu votre post. Le grand thrick consiste à décrémenter le compteur de la boucle. Merci!!!!
OriginalL'auteur pmg
Si vous n'avez pas de soins sur l'ordre des éléments dans le tableau, vous pouvez déplacer le dernier élément du tableau dans le nouvellement formé écart (astucieusement la réduction de la longueur de la matrice par un). Cela peut être beaucoup plus efficace que shuntant les éléments vers le bas: en informatique durée de ce fait la suppression d'un élément de O(1) au lieu de O(N).
Si votre indice i est une boucle sur le tableau, vous aurez envie de boucle sur cet élément nouveau:
Par exemple, pour supprimer tous les éléments '3' à partir d'un tableau de longueur "l":
Si vous ne de soins sur l'ordre des éléments dans le tableau, il est plus efficace d'utiliser la fonction memmove plutôt que de déplacer les éléments en main. Il est conçu pour être utilisé lorsque la source et la destination de la mémoire se chevauchent.
OriginalL'auteur
"Si" de "tout":
J'ai peur que mon truc était buggy - la suppression du dernier élément pourrait boucle indéfiniment (selon la valeur de a[l], qui est au-delà de la matrice). Addrd i<l pour le fixer.
OriginalL'auteur ugoren
utiliser un nouveau tableau.
OriginalL'auteur T-student
Veuillez ajouter une description à votre answer.@Dhruv Aditya Mittal
D'abord il va vous demander la taille de la matrice et, plus tard, il va vous demander des éléments écrits dans le tableau.Après avoir pris les éléments qu'il vous demande alors la matrice sera supprimé à partir du tableau.Le résultat final va imprimer le reste des éléments dans le tableau, j'.e nouveau tableau. @RohitPoudel
OriginalL'auteur Dhruv Aditya Mittal
Votre méthode avec 2 imbriquée
for
boucles est trop compliqué. Vous pouvez numériser simplement le tableau avec un indice dei
et de copier tous les éléments différents dekey
avec un autre indicelen
. Le tableau résultant de la longueur est la valeur finale delen
.Ici est une version modifiée:
Notes:
Le prototype pour
main
sans arguments estint main(void)
et il est de bon style pour revenir0
pour le succès.toujours tester la valeur de retour de
scanf()
. Cela évite de nombreux bugs et un comportement indéfini pour une entrée non valide. Il permet aussi d'économiser beaucoup de temps à la recherche dans le mauvais lieux lors de l'entrée était tout simplement pas valide.éviter de nommer une variable
l
qu'il ressemble de trop près à1
dans de nombreux les polices à espacement fixe.de toujours mettre fin à la production du programme avec un saut de ligne.
OriginalL'auteur chqrlie