2015-03-11 1 views
0

Je suis supposé obtenir la sortie 8, 6. Mais je reçois 8,9 quand ce code est exécuté. Pourquoi suis-je en train de sortir le 8,6 et comment puis-je corriger le code pour que la sortie devienne 8,9?Déplacement du tableau pour remplacer l'élément supprimé

int inputarray[]={9,8,9,9,9,9,6}; 
int length = 7; 
int value = 9; 

void arrayShift(int arr[], int length, int value) 
{ 
    for(int i = 0; i<length; i++) 
    { 
     if(arr[i] == value) 
      { 
       for (int k = i; k<length ; k++) 
        { 
         arr[k] = arr[k+1]; 
        } 
     arr[length-1] = 0; 

      }  
    } 
} 
+1

@nem Hummm, c'est C. C'est Java. Ton commentaire est inutile. Même s'il s'agissait de C, ce n'est toujours pas ce que veut le PO. –

+1

Attendez, vous attendez 8,6 ou 8,9? Vous le demandez dans les deux sens – Tim

+0

Utilisez une liste chaînée, ce qui est la manière logique de faire ce que vous essayez de faire. – anishsane

Répondre

4

Lorsque matrice de décalage, vous pouvez remplacer premier élément (contenant nombre égal à value) avec la même valeur d'un autre élément. Dans ce cas, vous devez redémarrer l'itération sur cet élément nouveau, .: par exemple

void arrayShift(int arr[], int length, int value) 
{ 
    for(int i = 0; i<length; i++) 
    { 
     if(arr[i] == value) 
     { 
      for (int k = i; k<length-1 ; k++) 
      { 
       arr[k] = arr[k+1]; 
      } 

      arr[length-1] = 0; 
      i--; // <-- this 
     } 
    } 
} 
+0

Cette réponse a l'air correcte. De plus, je recommande de décrémenter 'longueur', car les éléments du tableau sont réduits et les zéros à la fin ne sont que du remplissage. – anishsane

+0

J'ai de la difficulté à appeler la fonction, elle continue à me donner l'adresse d'un élément dans l'arr. Je mets cout << arr; après la boucle initiale pour la fonction vide. Où vais-je mal? – Andrew

+0

@Andrew Je suis incapable de vous comprendre. Qui donne l'adresse? Quelle adresse? Quel élément? J'ai ajouté * une * ligne, le reste est à vous - savez-vous ce qu'il fait? – keltar

1

Votre algorithme de déplacement est erroné: vous ne parvenez pas à régler i lors du retrait. En outre, il est plutôt inefficace: vous pouvez le faire dans une seule boucle avec deux index - r pour la lecture et w pour l'écriture. Lorsque vous voyez la valeur que vous souhaitez conserver, ajustez l'index de lecture et d'écriture. Sinon, incrémentez uniquement l'index de lecture. Une fois que l'index de lecture atteint le décompte, l'index d'écriture indique le nombre d'éléments qui vous restent. Vous devez le renvoyer à l'appelant d'une façon ou d'une autre, sinon il ne saurait pas où les données réelles se terminent. Vous pouvez renvoyer la nouvelle longueur en tant que valeur de retour de votre fonction ou prendre length comme pointeur et l'ajuster en place.

int arrayShift(int arr[], int length, int value) { 
    int r = 0, w = 0; 
    for (; r != length ; r++) { 
     if (arr[r] != value) { 
      arr[w++] = arr[r]; 
     } 
    } 
    return w; 
} 

Voici comment vous l'appelez:

int inputarray[]={9,8,9,9,9,9,6}; 
int length = 7; 
int value = 9; 
int newLen = arrayShift(inputarray, length, value); 
for (int i = 0 ; i != newLen ; i++) { 
    printf("%d ", inputarray[i]); 
} 
printf("\n"); 

Demo.