2012-09-28 2 views
7

이것은 초등이지만 내 인터넷 검색은이를 잘라 내지 않습니다. 배열의 값을 하나씩 이동하려면 뭔가 다른 작업을해야한다는 것을 알고 있지만, 아래의 코딩은 item [k]에 대해 items [k]와 동일한 모든 항목 [infinity]에 대해 동일한 값을 제공합니다. 내가 이해할 수없는 것은 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; 
}