2012-09-28 27 views
7

Esto es básico, pero mi Google simplemente no lo corta. Sé que tengo que hacer algo más para cambiar los valores de una matriz uno por uno, pero la codificación a continuación me da los mismos valores para los elementos [k] a los elementos [infinito] todos los ítems equivalentes [k]. Lo que no entiendo es cómo conservar el valor k + 1 original mientras copio el valor k en la ranura k + 1.elementos de desplazamiento en el conjunto

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 
} 

¿Tiene que ser un método recursivo?

Respuesta

5

Una opción fácil sería iterar a través de la matriz a la inversa

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

Opción 2:

Si desea mantener su forma intacta, entonces también puede utilizar la variable temporal diferente

antes de inicializar bucle temporal a

double temp = items[i]; 

y luego en el ciclo puede usar la temperatura para almacenar el valor [k + 1] en la temperatura en lugar de almacenar el valor [k].

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

también debe ver sus límites de manera que k + 1 no va más allá del último elemento de la matriz. Puede usar algo como numItems - 1 con una marca de verificación antes, para asegurarse de que la matriz no esté vacía.

17

También puede usar memmove, que maneja la superposición de regiones.

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

Por supuesto, después de que el 'memmove', debe establecer' artículos [0] = valor; ' –

+0

Tiene usted razón, y también ha corregido la respuesta a reflejar la cuestión (en el inserto la posición k-ésima). – Teudimundo

+0

Me pregunto si memmove es más rápido que para el ciclo – Nick

0

Se puede tratar método de inversión

este es un ejemplo.

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