2012-09-28 55 views
7

這是基本的,但我的谷歌搜索只是不削減它。我知道我必須做別的事情由一個數組一個值移位,但下面的編碼給我相同的值項[K]項∞,等於所有物品[K]。我不明白的是如何保留的原k + 1的值,而我k值複製到第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 
} 

它是否必須是遞歸方法?

回答

5

一個簡單的辦法是通過數組中的反向

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

選項2迭代:

如果你想保持你的方法不變,那麼你也可以使用臨時變量不同

您的循環之前初始化臨時到

double temp = items[i]; 

,然後在循環可以使用臨時存儲[K + 1]在溫度值而不是存儲[k]的值。

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

也應使K + 1是不會過去的數組中的最後一個元素看你的邊界。前1一檢查,以確保該數組不爲空 - 您可以使用類似numItems的。

17

您可以和使用的memmove,該處理的區域重疊。

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

當然,'memmove'後,你應該設置'項目[0] =值;' –

+0

你是對的,而且我也糾正了答案,以反映的問題(插入在第k個位置)。 – Teudimundo

+0

我不知道memmove是否比周期更快 – Nick

0

你可以嘗試反轉法

這是一個例子。

// 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; 
}