2012-09-28 26 views
7

To jest elementarne, ale moje googlowanie po prostu go nie obcina. Wiem, że muszę zrobić coś innego, aby przesunąć wartości tablicy jeden po drugim, ale poniższe kodowanie daje mi takie same wartości dla przedmiotów [k] do pozycji [nieskończoność] wszystkich elementów równania [k]. Nie rozumiem, w jaki sposób zachować oryginalną wartość k + 1, podczas gdy ja kopiuję wartość k do szczeliny k + 1.przesunięcie elementów w tablicy

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 
} 

Czy musi to być metoda rekurencyjna?

Odpowiedz

5

Prostym rozwiązaniem byłoby iterację tablicy w odwrotnej

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

Opcja 2:

Jeżeli chcesz zachować swój sposób nienaruszony następnie można również użyć zmiennej temp inaczej

przed uruchomieniem pętli for do

double temp = items[i]; 

, a następnie w pętli można użyć temp do przechowywania wartości [k + 1] w temp, a nie do przechowywania wartości [k].

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

też należy obserwować swoje granice, tak aby k + 1 nie będzie ostatnim elementem tablicy. Możesz użyć czegoś takiego jak numItems - 1 z wcześniejszym sprawdzeniem, aby upewnić się, że tablica nie jest pusta.

17

Można również użyć memmove, który obsługuje nakładanie się regionów.

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

Oczywiście, po 'memmove' należy ustawić' pozycji [0] = wartość; ' –

+0

Masz rację, a ja również poprawione odpowiedź odzwierciedlać pytanie (wkładka w pozycja k-ta). – Teudimundo

+0

Zastanawiam się, czy pamięć jest szybsza niż w przypadku cyklu – Nick

0

można spróbować metody odwracania

jest to przykład.

// 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; 
} 
Powiązane problemy