指针和递归函数

来源:互联网 发布:windows pe u盘制作 编辑:程序博客网 时间:2024/05/30 04:58

C 语言:

有n个整数,使其前面各数顺序后移m个位置,最后m个数变成最前面m的数

(自己写的程序和别人写的程序的对比,只有对比才能发现一些算法的巧妙,希望和大家共同进步。)


//自己写的

#include <stdio.h>
#define N 10    //个数
#define M 3     //向后移动的次数

int main()
{
     void output(const int* a);
     void move(int* a, int num);
 
     int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

     output(a);
     move(a, M);
     output(a);

     int c;
     scanf("%d", &c);
     return 0;
}


void output(const int* a)
{
     int i = 0;
     while (i < N)
     {
          printf("%-4d", *(a+i));
          i++;
     }
     printf("\n");
}


void move(int* a, int num)
{
     int i, j, temp;
     int b[M] = {0};
     i = j = 0;

     while (i < M)
     {
          b[i] = *(a+N-M+i); //后面几位先保存
          // printf("b[%d] = %-4d", i, b[i]);
          i++;
     }


     i = 0;
     while (i < M)
     {
          j = N - M + i;
          for (j; j >= 0; j--)
          {
                *(a+j+1) = *(a+j); //从后面开始数依次后移
          }
          i++;
     }


     i = 0;
     while (i < M)
     {  
          *(a+i) = *(b+i);//M个数放入新数组   
          i++;
     }

}


//别人写的

#include <stdio.h>

//每次调用函数实际只移动一位
void move(int array[20], int n, int m)
{
      int *p, array_end;
      array_end = *(array+n-1);
      for (p = array + n - 1; p > array; p--)
      {
           *p = *(p-1);  
      }
      *array = array_end;
      m--;
     if (m > 0)
     {
          move(array, n, m);  //递归函数调用
     }
}


int main()
{
     int number[20], n, m, i;
     printf("The total numbers is: ");
     scanf("%d", &n);
     printf("back m: ");
     scanf("%d", &m);

     for (i = 0; i < n; i++)
     {
          scanf("%d", &number[i]);
     }


     move(number, n, m);
     for (i = 0; i < n - 1; i++)
     {
          printf("%d, ", number[i]);
     }
     printf("%d", number[n-1]);


     int c;
     scanf("%d", &c);
     return 0;
}