ccmny

Generic array shuffle

Sep 8th, 2011
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.88 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #define Printd(A) printf(#A" = %d\n", A)
  6. #define Swap(A, B) swap(&A, &B, sizeof(A))
  7. #define Shuffle(A, B, C) shuffle(A, B, 0, C, sizeof(*A))
  8. #define Unshuffle(A, B, C) unshuffle(A, B, 0, C, sizeof(*A))
  9.  
  10. typedef struct
  11. {
  12.     int x;
  13.     int y;
  14. } Point;
  15.  
  16. void * shuffle(void * array, int seed, int index, int len, size_t size);
  17. void * unshuffle(void * array, int seed, int index, int len, size_t size);
  18. void swap(void * num1, void * num2, size_t size);
  19. void printArray(void * array, int len, size_t size, void(*print)(void * item));
  20. void printPoint(void * item);  
  21.  
  22. int main()
  23. {
  24.     Point parray[4] = {{0, 1}, {2, 3}, {4, 5}, {6, 7}};
  25.     Shuffle(parray, 1, 4);
  26.     printArray(parray, 4, sizeof(Point), printPoint);
  27.     puts("\n");
  28.     Unshuffle(parray, 1, 4);
  29.     printArray(parray, 4, sizeof(Point), printPoint);
  30.     return 0;
  31. }
  32.  
  33. void * shuffle(void * array, int seed, int index, int len, size_t size)
  34. {
  35.     int result;
  36.     if(index == len)
  37.         return array;
  38.     srand(seed);
  39.     result = rand();
  40.     swap((array + index * size), (array + result%len * size), size);
  41.     return shuffle(array, result, index + 1, len, size);
  42. }
  43.  
  44. void * unshuffle(void * array, int seed, int index, int len, size_t size)
  45. {
  46.     int result;
  47.     if(index == len)
  48.         return array;
  49.     srand(seed);
  50.     result = rand();
  51.     array = unshuffle(array, result, index + 1, len, size);
  52.     swap((array + index * size), (array + result%len * size), size);
  53.     return array;
  54. }
  55.  
  56. void swap(void * a, void * b, size_t size)
  57. {
  58.     void * temp = malloc(size);
  59.     memcpy(temp, a, size);
  60.     memcpy(a, b, size);
  61.     memcpy(b, temp, size);
  62.     free(temp);
  63. }
  64.  
  65. void printArray(void * array, int len, size_t size, void(*print)(void * item))
  66. {
  67.     int i;
  68.     for(i = 0; i < len; i++)
  69.         print((array + i * size));
  70. }
  71.  
  72. void printPoint(void * item)
  73. {
  74.     Point * pitem = (Point*)item;
  75.     printf("x = %d, y = %d\n", pitem->x, pitem->y);
  76. }
Advertisement
Add Comment
Please, Sign In to add comment