これは基本ですが、私のグーグルはそれをカットしません。配列の値を1つずつシフトするために何か他のことをしなければならないことは知っていますが、以下のコーディングでは、items [k]からitems [infinity]に等しい値がすべてitems [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
}
再帰的な方法である必要がありますか?
簡単なオプションは、配列を逆順に繰り返すことです
for (int k = numItems; k > i; k--){
items[k]=items[k-1];
}
オプション2:
メソッドをそのまま保持する場合は、一時変数を別の方法で使用することもできます
forループがtempを初期化する前に
double temp = items[i];
そして、ループで[k]値を保存するのではなく、tempを使用して[k + 1]値をtempに保存できます。
items [k+1] = temp;
temp = items [k+1];
items[k+1] = items[k];
また、k + 1が配列の最後の要素を超えないように境界を監視する必要があります。 numItems-1のようなものを前にチェックして使用して、配列が空でないことを確認できます。
領域のオーバーラップを処理するmemmoveも使用できます。
memmove(&items[k+1], &items[k], (numItems-k-1)*sizeof(double));
items[k] = value;
#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;
}
反転方法を試してもらえますか
これは一例です。
// 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);
}