Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define Printd(A) printf(#A" = %d\n", A)
- #define Swap(A, B) swap(&A, &B, sizeof(A))
- #define Shuffle(A, B, C) shuffle(A, B, 0, C, sizeof(*A))
- #define Unshuffle(A, B, C) unshuffle(A, B, 0, C, sizeof(*A))
- typedef struct
- {
- int x;
- int y;
- } Point;
- void * shuffle(void * array, int seed, int index, int len, size_t size);
- void * unshuffle(void * array, int seed, int index, int len, size_t size);
- void swap(void * num1, void * num2, size_t size);
- void printArray(void * array, int len, size_t size, void(*print)(void * item));
- void printPoint(void * item);
- int main()
- {
- Point parray[4] = {{0, 1}, {2, 3}, {4, 5}, {6, 7}};
- Shuffle(parray, 1, 4);
- printArray(parray, 4, sizeof(Point), printPoint);
- puts("\n");
- Unshuffle(parray, 1, 4);
- printArray(parray, 4, sizeof(Point), printPoint);
- return 0;
- }
- void * shuffle(void * array, int seed, int index, int len, size_t size)
- {
- int result;
- if(index == len)
- return array;
- srand(seed);
- result = rand();
- swap((array + index * size), (array + result%len * size), size);
- return shuffle(array, result, index + 1, len, size);
- }
- void * unshuffle(void * array, int seed, int index, int len, size_t size)
- {
- int result;
- if(index == len)
- return array;
- srand(seed);
- result = rand();
- array = unshuffle(array, result, index + 1, len, size);
- swap((array + index * size), (array + result%len * size), size);
- return array;
- }
- void swap(void * a, void * b, size_t size)
- {
- void * temp = malloc(size);
- memcpy(temp, a, size);
- memcpy(a, b, size);
- memcpy(b, temp, size);
- free(temp);
- }
- void printArray(void * array, int len, size_t size, void(*print)(void * item))
- {
- int i;
- for(i = 0; i < len; i++)
- print((array + i * size));
- }
- void printPoint(void * item)
- {
- Point * pitem = (Point*)item;
- printf("x = %d, y = %d\n", pitem->x, pitem->y);
- }
Advertisement
Add Comment
Please, Sign In to add comment