2012-09-28 11 views
7

Questo è elementare, ma il mio googling non lo taglia. So che devo fare qualcos'altro per spostare i valori di un array uno per uno, ma la codifica qui sotto mi dà gli stessi valori per gli elementi [k] agli elementi [infinito] tutti gli elementi uguali [k]. Quello che non capisco è come conservare il valore originale di k + 1 mentre copio il valore k nello slot k + 1.elementi di spostamento nell'array

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 
} 

Dev'essere un metodo ricorsivo?

risposta

5

una scelta facile sarebbe quella di scorrere la matrice in senso inverso

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

Opzione 2:

Se si desidera mantenere intatto il vostro metodo di allora si può anche utilizzare la variabile temporanea in modo diverso

prima del tuo ciclo for inizializzare temp

double temp = items[i]; 

e quindi nel ciclo è possibile utilizzare temp per memorizzare il valore [k + 1] in temp anziché memorizzare il valore [k].

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

anche si dovrebbe guardare i vostri confini in modo che k + 1 non è andare oltre l'ultimo elemento della matrice. Potresti usare qualcosa come numItems - 1 con un controllo prima, per assicurarti che l'array non sia vuoto.

17

È inoltre possibile utilizzare memmove, che gestisce la sovrapposizione delle regioni.

memmove(&items[k+1], &items[k], (numItems-k-1)*sizeof(double)); 
items[k] = value; 
+0

Naturalmente, dopo il 'memmove', è necessario impostare' elementi [0] = valore; ' –

+0

Hai ragione, e ho corretto anche la risposta per riflettere la domanda (inserto a la posizione k-esima). – Teudimundo

+0

Mi chiedo se memmove è più veloce del ciclo – Nick

0

Puoi provare il metodo di inversione

questo è un esempio.

// 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
#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; 
} 
Problemi correlati