Skip to content

Instantly share code, notes, and snippets.

@kgabis
Created September 8, 2011 18:10
Show Gist options
  • Save kgabis/1204145 to your computer and use it in GitHub Desktop.
Save kgabis/1204145 to your computer and use it in GitHub Desktop.
Generic array shuffle and unshuffle
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#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 array[4] = {{0, 1}, {2, 3}, {4, 5}, {6, 7}};
Shuffle(array, 1, 4);
printArray(array, 4, sizeof(Point), printPoint);
puts("\n");
Unshuffle(array, 1, 4);
printArray(array, 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);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment