Reversing an array In place

后端 未结 11 786
温柔的废话
温柔的废话 2020-12-21 04:20

Okay so I\'ve tried to print and Array and then reverse is using another array But I\'m trying to create a For Loop that will take an array and reverse all of the elements i

相关标签:
11条回答
  • 2020-12-21 05:22

    You can reverse an array in place you don't need an auxiliary array for that, Here is my C code to do that

    #include <stdio.h>
    int main(void)
     {
        int arr[5]={1,2,3,4,5};
        int size=sizeof(arr)/sizeof(int);   
        int success= reverse(arr,size);
        if(success==1)
            printf("Array reversed properly");
        else
            printf("Array reversing failed");   
    
        return 0;
    }
    
    
    int reverse(int arr[], int size)
    {
        int temp=0;
        int i=0;
        if(size==0)
            return 0;
        if(size==1)
            return 1;
    
        int size1=size-1;
        for( i=0;i<(size/2);i++)
        {
            temp=arr[i];
            arr[i]=arr[size1-i];
            arr[size1-i]=temp;
        }
    
        printf("Numbers after reversal are ");
        for(i=0;i<size;i++)
        {
            printf("%d ",arr[i]);
        }
        return 1;
    
    }
    
    0 讨论(0)
  • 2020-12-21 05:22

    If you are not interested in writing functions for any numeric type, try macros for this task. This code same working with any built-in numeric type: int, float, double.

    It has not a support for strings, since any string is ending on the character the NULL character \0. More a controlled version my similar answer is here https://stackoverflow.com/a/42063309/6003870 and contains solution for reverse a string.


    A full code

    #include <stdio.h>
    
    // print items of an array by a format
    #define PRINT_ARRAY(array, length, format) \
    { \
        putchar('['); \
        for (size_t i = 0; i < length; ++i) { \
            printf(format, array[i]); \
            if (i < length - 1) printf(", "); \
        } \
        puts("]"); \
    }
    
    
    // reverse an array in place
    #define REVERSE_ARRAY(array, length, status) \
        if (length > 0) { \
            for (int i = 0; i < length / 2; ++i) { \
                double temp; \
                temp = array[i]; \
                array[i] = array[length - i - 1]; \
                array[length - i - 1] = temp; \
            } \
            *status = 0; \
        } \
        else if (length < 0) *status = -1; \
        else *status = 1;
    
    #define SUCCESS_REVERSE_ARRAY_MSG "An array succefully reversed"
    #define FAILED_REVERSE_ARRAY_MSG "Failed reverse for an array"
    #define NO_CHANGED_REVERSE_ARRAY_MSG "An array no changed"
    
    
    /*
        Print message about status reverse an array
     */
    static void
    print_msg_reverse_array_status(const int status)
    {
        if (status == 0) printf("Status: %s\n", SUCCESS_REVERSE_ARRAY_MSG);
        else if (status == -1) printf("Status: %s\n", FAILED_REVERSE_ARRAY_MSG);
        else if (status == 1) printf("Status: %s\n", NO_CHANGED_REVERSE_ARRAY_MSG);
    }
    
    
    int
    main (const int argc, const char *argv[])
    {
        // keep value of status
        int status;
    
        puts("\tExample reverse of an integer array");
        int arr_int[5] = {1, 2, 3, 4, 5};
    
        status = 0;
        PRINT_ARRAY(arr_int, 5, "%d");
        REVERSE_ARRAY(arr_int, -1, &status);
    
        // will be an error, since a length is less 0, and the array is not changed
        print_msg_reverse_array_status(status);
        PRINT_ARRAY(arr_int, 5, "%d");
    
        status = 0;
        REVERSE_ARRAY(arr_int, 0, &status);
    
        // a length is equal to 0, so an array is not changed
        print_msg_reverse_array_status(status);
        PRINT_ARRAY(arr_int, 5, "%d");
    
        status = 0;
        REVERSE_ARRAY(arr_int, 5, &status);
        print_msg_reverse_array_status(status);
        PRINT_ARRAY(arr_int, 5, "%d");
    
        puts("\n\tExample reverse of an float array");
        float arr_float[5] = {0.78, 2.1, -3.1, 4, 5.012};
    
        status = 0;
        PRINT_ARRAY(arr_float, 5, "%5.3f");
        REVERSE_ARRAY(arr_float, 5, &status);
        print_msg_reverse_array_status(status);
        PRINT_ARRAY(arr_float, 5, "%5.3f");
    
        puts("\n\tExample reverse of an double array");
        double arr_double[5] = {0.00001, 20000.002, -3, 4, 5.29999999};
    
        status = 0;
        PRINT_ARRAY(arr_double, 5, "%8.5f");
        REVERSE_ARRAY(arr_double, 5, &status);
        print_msg_reverse_array_status(status);
        PRINT_ARRAY(arr_double, 5, "%8.5f");
        return 0;
    }
    

    I am used the GCC for compilation and your result must be as next

        Example reverse of an integer array
    [1, 2, 3, 4, 5]
    Status: Failed reverse for an array
    [1, 2, 3, 4, 5]
    Status: An array no changed
    [1, 2, 3, 4, 5]
    Status: An array succefully reversed
    [5, 4, 3, 2, 1]
    
        Example reverse of an float array
    [0.780, 2.100, -3.100, 4.000, 5.012]
    Status: An array succefully reversed
    [5.012, 4.000, -3.100, 2.100, 0.780]
    
        Example reverse of an double array
    [ 0.00001, 20000.00200, -3.00000,  4.00000,  5.30000]
    Status: An array succefully reversed
    [ 5.30000,  4.00000, -3.00000, 20000.00000,  0.00000]
    

    Testing environment

    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Debian
    Description:    Debian GNU/Linux 8.6 (jessie)
    Release:    8.6
    Codename:   jessie
    $ uname -a
    Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
    $ gcc --version
    gcc (Debian 4.9.2-10) 4.9.2
    
    0 讨论(0)
  • 2020-12-21 05:23

    Just my 2 cents...

    #include <stdlib.h>
    #include <stdio.h>
    
    int main() {
          int arry[] = {0, 1, 2, 3, 4, 5};
          int* s = arry;
          int* e = arry + (sizeof(arry) / sizeof(arry[0])) - 1;
          while (s < e) {
            *e ^= *s;
            *s ^= *e;
            *e ^= *s;
            s++;
            e--;
          }
          for (size_t i = 0; i < (sizeof(arry) / sizeof(arry[0])); i++) {
            fprintf(stderr, "%d, ", arry[i]);
          }
          fprintf(stderr, "\n");
       }
    
    0 讨论(0)
  • 2020-12-21 05:24

    Try this;

    #include <stdlib.h>
    #include <time.h>
    
    int Random(int Max) {
      return ( rand() % Max)+ 1;
    }
    
    void main() {
      const int len = 8;
      int a[len];
      int i,end;
      int j = 0;
      Randomize() ;
    
      srand(time(0));
      //Fill the Array
      for (i = 0; i < len; ++i) {
        a[i] = rand() % 100;
      }
    
      //Print the array after filled
      for (i = 0; i < len; ++i) {
        printf("%d ", a[i]);
      }
      printf("\n");
      getchar();
    
      for (i = 0; i < n/2; i++) {
          t = a[i];
          a[i]   = a[end];
          a[end] = t;
          end--;
      }
    
    }
    

    Hope this helps... :)

    Just for suggestion. Try to use meaningful variable name instead of just i,a.... That will help you while writing a bigger code. :)

    0 讨论(0)
  • 2020-12-21 05:24

    Here's an easy and clean function for flipping arrays of all sizes. Change the parameters according to your type of array:

    void flipArray(int *a, int asize){
                int b[asize];
                int *b_p = b;
    
                for(int i=0; i<asize; i++){
                        //backwardsOrientation = (arraySize-1)-increment
                        b_p[asize-1-i] = a[i];
                }
                for(int i=0; i<asize; i++){
                        a[i] = b_p[i];
                }
        }
    
    0 讨论(0)
提交回复
热议问题