#include <stddef.h>

const void *min_element(void *ptr, size_t cnt, size_t size, int (*comp)(const void *, const void *))
{
  const void *min;
  size_t i;

  if (!cnt) return NULL;
  
  min = ptr;
  for(i = 1; i < cnt; ++i)
    if (comp(min, (const char*)ptr + size * i) > 0)
      min = (const char*)ptr + size * i;

  return min;
}

#include <stdio.h>
#include <string.h>

int compare_ints(const void* a, const void* b)  
{
  int arg1 = *(const int*)a;
  int arg2 = *(const int*)b;
  if(arg1 < arg2) return -1;
  if(arg1 > arg2) return 1;
  return 0;
}

int compare_strings(const void* a, const void* b)  
{
  return strcmp(*((char**) a), *((char**) b));
}
 
int main()
{
  int foo[] = {75, 72, 98, -84, 63};
  const char *bar[] = {"Blah", "Blupp", "Aachen", "Zeppelin", "Foobar"};

  printf("Integerminimum ist: %d\n", *(int*) min_element(foo, sizeof(foo)/sizeof(*foo), sizeof(*foo), compare_ints));
  printf("Stringminimum ist: %s\n", *(const char**) min_element(bar, sizeof(bar)/sizeof(*bar), sizeof(*bar), compare_strings));
  return 0;
}
