web-dev-qa-db-fra.com

éléments de décalage dans un tableau

C'est élémentaire, mais ma recherche sur Google ne suffit pas. Je sais que je dois faire autre chose pour déplacer les valeurs d'un tableau une par une, mais le codage ci-dessous me donne les mêmes valeurs pour les éléments [k] à éléments [infini] tous éléments égaux [k]. Ce que je ne comprends pas, c'est comment conserver la valeur k + 1 d'origine pendant que je copie la valeur k dans la fente k + 1.

if ( i < numItems) //if i is inside the used boundaries of the array
{
    for (int k = i; k < numItems; k++) //shift the array values from point i
    {
                double temp = 0.0;
        temp = items[k];
        items[k+1] = temp;
    }

    items[i] = value; //and insert value into i
}

Est-ce que cela doit être une méthode récursive?

11
Sukwoo

Une option simple consisterait à parcourir le tableau en sens inverse.

for (int k = numItems; k > i; k--){        
    items[k]=items[k-1];
}

Option 2:

Si vous souhaitez conserver votre méthode, vous pouvez également utiliser la variable temp différemment.

avant que votre boucle for initialise temp à

double temp = items[i];

puis dans la boucle, vous pouvez utiliser temp pour stocker la valeur [k + 1] dans temp au lieu de stocker la valeur [k].

items [k+1] = temp;
temp = items [k+1];
items[k+1] = items[k];

vous devez également surveiller vos limites afin que k + 1 ne dépasse pas le dernier élément du tableau. Vous pouvez utiliser quelque chose comme numItems - 1 avec une vérification avant, pour vous assurer que le tableau n'est pas vide.

7
Jasmeet Oberai

Vous pouvez également utiliser memmove, qui gère le chevauchement des régions.

memmove(&items[k+1], &items[k], (numItems-k-1)*sizeof(double));
items[k] = value;
20
Teudimundo
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {

    int i,j=0,s;
    int n,k;
    int A[n];

    scanf("%d %d",&n,&k);
    if(((n>=0) && (n<=100000))&&(k>=0)){
        for(i=0;i<n;i++){
            scanf(" %d", &A[i]);
        }
        if(k>=n){
            k=k-n;
        }else{
        for(j=0;j<n;j++){
            s=j+k;
            if(s>n){
                s-=n;
                A[j]=A[s];
            }else{
            A[j]=A[s];
            }

        }
        for(i=0;i<n;i++){
            printf("%d ",A[i]);
        }
      }
    }
    return 0;
}
0
ENG Abanoub Ashraf

Pouvez-vous essayer la méthode d'inversion

ceci est un exemple.

// reverse array from start to end
void reverse(int a[], int start, int end)
{
  int i;
  int temp;
  while(start++ < end--)
  {
    temp = a[start];
    a[start] = a[end];
    a[end] = temp;
  }
}

// function that will rotate array by d elements
void rotateArray(int a[], int d, int n)
{
  reverse(a, 0, d-1);
  reverse(a, d, n-1);
  reverse(a, 0, n-1);
}
0
vsmph