Eliminer un entier doublons [C]

Fermé
Etudiant - 22 nov. 2008 à 03:10
 loupius - 22 nov. 2008 à 04:50
Bonjour,
Je veux programmer une petite fonction qui elimine tous les entiers qui double dans un tableau d'entier
voilà ce que j'ai essayer de faire mais sa marche pas !
int eliminedoublant(int tab[],int n)
{
    int i,j;
     for(i=0;i<n;i++)
     {
                     for(j=i+1;j<n;j++)
                     {if(tab[i]==tab[j])
                     
                     tab[i]=0;   }
                     if(tab[i]==0)
                     for(i=0;i<n;i++)
                     {
                     tab[i]=tab[i+1];
}                     }}
A voir également:

1 réponse

Le code indiqué plante car il y a 2 boucles qui font appel à la même variable i; donc la 2ème modifie la 1ère!
On pourrait alors changer le nom de la 2ème variable ou faire une déclaration de type: for (int i=...)
D'autre part le code est un peu lourd, dans le sens où l'on remplit des zéros en place de doublons (ce qui au passage interdit d'avoir des zéros dans le tableau) et que plus tard on va retester pour détecter les zéros puis éventuellement modifier. On peut donc raisonnablement envisager une solution qui n'effectue qu'une seule recopie; il suffit de faire directement un double balayage:
int i, j, taille;

if (n == 0)
return (0); // Elimination de ce cas bien ennuyeux
// A priori le tableau fera au moins un élément puisque le 1er élément ne peut être doublon à lui tout seul
for (taille=i=1; i<n; i++) // i va balayer sur tout le tableau sauf le 1er élément qui reste à sa place
{
for (j=0; j<taille; j++) // j va balayer les éléments déjà remplis pour comparaison avec un élément pointé par i
if (tab[j] == tab[i])
break; // Il s'agit d'un doublon
if (j == taille) // Vrai s'il ne s'agit pas d'un doublon
tab[taille++] = tab[i];
}
return (taille); // Taille utile du tableau, il faut bien en informer l'appelant
1