2012-09-28 20 views
7

これは初心者ですが、私のグーグルはそれをカットしません。配列の値を1つずつシフトする必要があることは分かっていますが、以下のコーディングではアイテム[k]とアイテム[k]に等しいすべてのアイテム[∞]の値が同じになります。私が理解できないことは、k値をk + 1スロットにコピーしている間に元の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に配列を反復処理するために、次のようになります。あなたがそのままあなたの方法を維持したいならば、あなたはまた違った

一時変数を使用することができます

forループを初期化する前の温度を

double temp = items[i]; 

ループでは、tempを使用して、[k]値を格納するのではなく、[k + 1]値をtempに格納できます。 K + 1は、配列の最後の要素を過ぎて行くのではありませんように

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

も、あなたの境界を見なければなりません。配列が空でないことを確認するために、numItems - 1のようなものをチェックの前に使用することができます。

17

また、領域の重なりを処理するmemmoveを使用することもできます。

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

、項目[0] =値; ' –

+0

あなたは正しいです、と私はまた、問題を反映して答えを修正しました(挿入時k番目の位置)。 – Teudimundo

+0

私は、memmoveがサイクルよりも速いのだろうかと疑問に思う。 – Nick

0

あなたは、これは一例である反転法

を試すことができます。 `memmove`後、あなたは`設定する必要があります。もちろん、

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