【问题标题】:shift elements in array移位数组中的元素
【发布时间】:2012-09-19 22:15:07
【问题描述】:

这是基本的,但我的谷歌搜索并没有削减它。我知道我必须做一些其他事情来一个一个地移动数组的值,但是下面的代码给了我相同的 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
}

必须是递归方法吗?

【问题讨论】:

    标签: c arrays recursion copy


    【解决方案1】:

    您也可以使用处理区域重叠的 memmove。

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

    【讨论】:

    • 当然,memmove后面应该设置items[0] = value;
    • 你是对的,我也更正了答案以反映问题(插入第 k 个位置)。
    • 你可以在这里找到关于这个问题的精彩讨论:stackoverflow.com/questions/7776085/…
    【解决方案2】:

    一个简单的选择是反向遍历数组

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

    选项 2:

    如果你想保持你的方法不变,那么你也可以不同地使用 temp 变量

    在你的 for 循环初始化 temp 之前

    double temp = items[i];
    

    然后在循环中,您可以使用 temp 将 [k+1] 值存储在 temp 中,而不是存储 [k] 值。

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

    你也应该注意你的边界,这样 k+1 就不会超过数组中的最后一个元素。您可以使用 numItems - 1 之类的东西进行检查,以确保数组不为空。

    【讨论】:

      【解决方案3】:

      你能不能试试反转方法

      这是一个例子。

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

      【讨论】:

        【解决方案4】:
        #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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-04
          • 2014-07-31
          • 1970-01-01
          • 2012-05-07
          • 1970-01-01
          • 2016-12-26
          • 1970-01-01
          • 2016-11-07
          相关资源
          最近更新 更多