diff --git a/20190128/aufgabe-3-20160129.c b/20190128/aufgabe-3-20160129.c
new file mode 100644
index 0000000000000000000000000000000000000000..d99132fcf7a86b293c935794295c258c25726b55
--- /dev/null
+++ b/20190128/aufgabe-3-20160129.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  char symbol;
+  int (*calculate) (int a, int b);
+}
+operation;
+
+operation *new_operation (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '?';
+  op->calculate = NULL;
+  return op;
+}
+
+[...]
+
+int main (void)
+{
+  operation *op[4];
+  op[0] = new_plus ();
+  op[1] = new_minus ();
+  op[2] = new_times ();
+  op[3] = NULL;
+  for (int i = 0; op[i]; i++)
+    printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
+  return 0;
+}
diff --git a/20190128/aufgabe-3-20170206.c b/20190128/aufgabe-3-20170206.c
new file mode 100644
index 0000000000000000000000000000000000000000..69c78edeb13d6c015a3f2a7eca66dc46ccb8edfe
--- /dev/null
+++ b/20190128/aufgabe-3-20170206.c
@@ -0,0 +1,33 @@
+#include <stdio.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+[...]
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort (strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort (numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}
diff --git a/20190128/loesung-3-20160129-1.c b/20190128/loesung-3-20160129-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6bbf02808602d8ae7d172f8e0786ecdff2c2cd92
--- /dev/null
+++ b/20190128/loesung-3-20160129-1.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  char symbol;
+  int (*calculate) (int a, int b);
+}
+operation;
+
+operation *new_operation (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '?';
+  op->calculate = NULL;
+  return op;
+}
+
+int main (void)
+{
+  operation *op[4];
+  op[0] = new_plus ();
+  op[1] = new_minus ();
+  op[2] = new_times ();
+  op[3] = NULL;
+  for (int i = 0; op[i]; i++)
+    printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
+  return 0;
+}
diff --git a/20190128/loesung-3-20160129-2.c b/20190128/loesung-3-20160129-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..67621ec9569b87ec029541eb3f32b1fb6d8d8e82
--- /dev/null
+++ b/20190128/loesung-3-20160129-2.c
@@ -0,0 +1,44 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  char symbol;
+  int (*calculate) (int a, int b);
+}
+operation;
+
+operation *new_operation (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '?';
+  op->calculate = NULL;
+  return op;
+}
+
+operation *new_plus (void)
+{
+  return NULL;
+}
+
+operation *new_minus (void)
+{
+  return NULL;
+}
+
+operation *new_times (void)
+{
+  return NULL;
+}
+
+int main (void)
+{
+  operation *op[4];
+  op[0] = new_plus ();
+  op[1] = new_minus ();
+  op[2] = new_times ();
+  op[3] = NULL;
+  for (int i = 0; op[i]; i++)
+    printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
+  return 0;
+}
diff --git a/20190128/loesung-3-20160129-3.c b/20190128/loesung-3-20160129-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..0fdb0fcf28413230215fa835f79fc19853819303
--- /dev/null
+++ b/20190128/loesung-3-20160129-3.c
@@ -0,0 +1,44 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  char symbol;
+  int (*calculate) (int a, int b);
+}
+operation;
+
+operation *new_operation (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '?';
+  op->calculate = NULL;
+  return op;
+}
+
+operation *new_plus (void)
+{
+  return new_operation ();
+}
+
+operation *new_minus (void)
+{
+  return new_operation ();
+}
+
+operation *new_times (void)
+{
+  return new_operation ();
+}
+
+int main (void)
+{
+  operation *op[4];
+  op[0] = new_plus ();
+  op[1] = new_minus ();
+  op[2] = new_times ();
+  op[3] = NULL;
+  for (int i = 0; op[i]; i++)
+    printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
+  return 0;
+}
diff --git a/20190128/loesung-3-20160129-4.c b/20190128/loesung-3-20160129-4.c
new file mode 100644
index 0000000000000000000000000000000000000000..283cb896cda4448e9aa2f1ae5accd3524020869c
--- /dev/null
+++ b/20190128/loesung-3-20160129-4.c
@@ -0,0 +1,65 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  char symbol;
+  int (*calculate) (int a, int b);
+}
+operation;
+
+operation *new_operation (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '?';
+  op->calculate = NULL;
+  return op;
+}
+
+int calculate_plus (int a, int b)
+{
+  return a + b;
+}
+
+operation *new_plus (void)
+{
+  operation *op = new_operation ();
+  op->calculate = calculate_plus;
+  return op;
+}
+
+int calculate_minus (int a, int b)
+{
+  return a - b;
+}
+
+operation *new_minus (void)
+{
+  operation *op = new_operation ();
+  op->calculate = calculate_minus;
+  return op;
+}
+
+int calculate_times (int a, int b)
+{
+  return a * b;
+}
+
+operation *new_times (void)
+{
+  operation *op = new_operation ();
+  op->calculate = calculate_times;
+  return op;
+}
+
+int main (void)
+{
+  operation *op[4];
+  op[0] = new_plus ();
+  op[1] = new_minus ();
+  op[2] = new_times ();
+  op[3] = NULL;
+  for (int i = 0; op[i]; i++)
+    printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
+  return 0;
+}
diff --git a/20190128/loesung-3-20160129-5.c b/20190128/loesung-3-20160129-5.c
new file mode 100644
index 0000000000000000000000000000000000000000..a5c91f65ee42aec78fb3577be60033631e791f4f
--- /dev/null
+++ b/20190128/loesung-3-20160129-5.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  char symbol;
+  int (*calculate) (int a, int b);
+}
+operation;
+
+operation *new_operation (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '?';
+  op->calculate = NULL;
+  return op;
+}
+
+int calculate_plus (int a, int b)
+{
+  return a + b;
+}
+
+operation *new_plus (void)
+{
+  operation *op = new_operation ();
+  op->symbol = '+';
+  op->calculate = calculate_plus;
+  return op;
+}
+
+int calculate_minus (int a, int b)
+{
+  return a - b;
+}
+
+operation *new_minus (void)
+{
+  operation *op = new_operation ();
+  op->calculate = calculate_minus;
+  op->symbol = '-';
+  return op;
+}
+
+int calculate_times (int a, int b)
+{
+  return a * b;
+}
+
+operation *new_times (void)
+{
+  operation *op = new_operation ();
+  op->calculate = calculate_times;
+  op->symbol = '*';
+  return op;
+}
+
+int main (void)
+{
+  operation *op[4];
+  op[0] = new_plus ();
+  op[1] = new_minus ();
+  op[2] = new_times ();
+  op[3] = NULL;
+  for (int i = 0; op[i]; i++)
+    printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
+  return 0;
+}
diff --git a/20190128/loesung-3-20160129-6.c b/20190128/loesung-3-20160129-6.c
new file mode 100644
index 0000000000000000000000000000000000000000..1e63e25fcb06b4bbe7ce0456f7594beef26e251d
--- /dev/null
+++ b/20190128/loesung-3-20160129-6.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  char symbol;
+  int (*calculate) (int a, int b);
+}
+operation;
+
+operation *new_operation (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '?';
+  op->calculate = NULL;
+  return op;
+}
+
+int calculate_plus (int a, int b)
+{
+  return a + b;
+}
+
+operation *new_plus (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '+';
+  op->calculate = calculate_plus;
+  return op;
+}
+
+int calculate_minus (int a, int b)
+{
+  return a - b;
+}
+
+operation *new_minus (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '-';
+  op->calculate = calculate_minus;
+  return op;
+}
+
+int calculate_times (int a, int b)
+{
+  return a * b;
+}
+
+operation *new_times (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '*';
+  op->calculate = calculate_times;
+  return op;
+}
+
+int main (void)
+{
+  operation *op[4];
+  op[0] = new_plus ();
+  op[1] = new_minus ();
+  op[2] = new_times ();
+  op[3] = NULL;
+  for (int i = 0; op[i]; i++)
+    printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
+  return 0;
+}
diff --git a/20190128/loesung-3-20160129-7.c b/20190128/loesung-3-20160129-7.c
new file mode 100644
index 0000000000000000000000000000000000000000..a576cdb6a67ed5af72b72c11bcb5a8f91af135e2
--- /dev/null
+++ b/20190128/loesung-3-20160129-7.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct
+{
+  char symbol;
+  int (*calculate) (int a, int b);
+}
+operation;
+
+operation *new_operation (void)
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '?';
+  op->calculate = NULL;
+  return op;
+}
+
+int calculate_plus (int a, int b)
+{
+  return a + b;
+}
+
+operation *new_plus ()
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '+';
+  op->calculate = calculate_plus;
+  return op;
+}
+
+int calculate_minus (int a, int b)
+{
+  return a - b;
+}
+
+operation *new_minus ()
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '-';
+  op->calculate = calculate_minus;
+  return op;
+}
+
+int calculate_times (int a, int b)
+{
+  return a * b;
+}
+
+operation *new_times ()
+{
+  operation *op = malloc (sizeof (operation));
+  op->symbol = '*';
+  op->calculate = calculate_times;
+  return op;
+}
+
+int main (void)
+{
+  operation *op[4];
+  op[0] = new_plus ("Hello, world!");
+  op[1] = new_minus (42, 137);
+  op[2] = new_times (3.14159265358979323846, NULL, "Hallo?", op, calculate_times);
+  op[3] = NULL;
+  for (int i = 0; op[i]; i++)
+    printf ("2 %c 3 = %d\n", op[i]->symbol, op[i]->calculate (2, 3));
+  return 0;
+}
diff --git a/20190128/loesung-3-20170206-1.c b/20190128/loesung-3-20170206-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..b57039e35286fd78a3cc15d1b3ba535fbd9ab984
--- /dev/null
+++ b/20190128/loesung-3-20170206-1.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort (strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort (numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}
diff --git a/20190128/loesung-3-20170206-2.c b/20190128/loesung-3-20170206-2.c
new file mode 100644
index 0000000000000000000000000000000000000000..845f8bfd2eee1817764348573c984a7763cfcc9e
--- /dev/null
+++ b/20190128/loesung-3-20170206-2.c
@@ -0,0 +1,41 @@
+#include <stdio.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+int compare_strings (void *x1, void *x2)
+{
+  return 42;
+}
+
+int compare_numbers (void *x1, void *x2)
+{
+  return 42;
+}
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort (strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort (numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}
diff --git a/20190128/loesung-3-20170206-3.c b/20190128/loesung-3-20170206-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..35e323a06aa847f3e4ceb07874064c5607a3d35d
--- /dev/null
+++ b/20190128/loesung-3-20170206-3.c
@@ -0,0 +1,41 @@
+#include <stdio.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+int compare_strings (void *x1, void *x2)
+{
+  return 42;
+}
+
+int compare_numbers (void *x1, void *x2)
+{
+  return 42;
+}
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort ((void **) strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort ((void **) numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}
diff --git a/20190128/loesung-3-20170206-4.c b/20190128/loesung-3-20170206-4.c
new file mode 100644
index 0000000000000000000000000000000000000000..7d5cd5aab8f7d9346ad3b211302307d60bd58c59
--- /dev/null
+++ b/20190128/loesung-3-20170206-4.c
@@ -0,0 +1,42 @@
+#include <stdio.h>
+#include <string.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+int compare_strings (void *x1, void *x2)
+{
+  return strcmp (x1, x2);
+}
+
+int compare_numbers (void *x1, void *x2)
+{
+  return 42;
+}
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort ((void **) strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort ((void **) numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}
diff --git a/20190128/loesung-3-20170206-5.c b/20190128/loesung-3-20170206-5.c
new file mode 100644
index 0000000000000000000000000000000000000000..357e483652ef4227704ead580d9313df40dae9d3
--- /dev/null
+++ b/20190128/loesung-3-20170206-5.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <string.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+int compare_strings (void *x1, void *x2)
+{
+  return strcmp (x1, x2);
+}
+
+int compare_numbers (void *x1, void *x2)
+{
+  if (*x2 < *x1)
+    return 1;
+  else
+    return 0;
+}
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort ((void **) strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort ((void **) numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}
diff --git a/20190128/loesung-3-20170206-6.c b/20190128/loesung-3-20170206-6.c
new file mode 100644
index 0000000000000000000000000000000000000000..822959430613390f70348dec21244b7c7c62ef0e
--- /dev/null
+++ b/20190128/loesung-3-20170206-6.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <string.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+int compare_strings (void *x1, void *x2)
+{
+  return strcmp (x1, x2);
+}
+
+int compare_numbers (int *x1, int *x2)
+{
+  if (*x2 < *x1)
+    return 1;
+  else
+    return 0;
+}
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort ((void **) strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort ((void **) numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}
diff --git a/20190128/loesung-3-20170206-7.c b/20190128/loesung-3-20170206-7.c
new file mode 100644
index 0000000000000000000000000000000000000000..35b3a858787d3a00cbfcb705b3e7a1c929ce9662
--- /dev/null
+++ b/20190128/loesung-3-20170206-7.c
@@ -0,0 +1,47 @@
+#include <stdio.h>
+#include <string.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+int compare_strings (void *x1, void *x2)
+{
+  return strcmp (x1, x2);
+}
+
+int compare_numbers (void *x1, void *x2)
+{
+  int *y1 = x1;
+  int *y2 = x2;
+  if (*y2 < *y1)
+    return 1;
+  else
+    return 0;
+}
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort ((void **) strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort ((void **) numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}
diff --git a/20190128/loesung-3-20170206-8.c b/20190128/loesung-3-20170206-8.c
new file mode 100644
index 0000000000000000000000000000000000000000..4070c305093ab6c4078c836a10d9914ed748f605
--- /dev/null
+++ b/20190128/loesung-3-20170206-8.c
@@ -0,0 +1,47 @@
+#include <stdio.h>
+#include <string.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+int compare_strings (void *x1, void *x2)
+{
+  return strcmp (x1, x2);
+}
+
+int compare_numbers (void *x1, void *x2)
+{
+  int *y1 = (int *) x1;
+  int *y2 = (int *) x2;
+  if (*y2 < *y1)
+    return 1;
+  else
+    return 0;
+}
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort ((void **) strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort ((void **) numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}
diff --git a/20190128/loesung-3-20170206-9.c b/20190128/loesung-3-20170206-9.c
new file mode 100644
index 0000000000000000000000000000000000000000..ef902f3f34aa7ebaf0deb227c1b8905ea9f197db
--- /dev/null
+++ b/20190128/loesung-3-20170206-9.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <string.h>
+
+void sort (void **data, int (*compare) (void *x1, void *x2))
+{
+  for (int i = 0; data[i]; i++)
+    for (int j = i + 1; data[j]; j++)
+      if (compare (data[i], data[j]) > 0)
+        {
+          void *tmp = data[i];
+          data[i] = data[j];
+          data[j] = tmp;
+        }
+}
+
+int compare_strings (void *x1, void *x2)
+{
+  return strcmp (x1, x2);
+}
+
+int compare_numbers (void *x1, void *x2)
+{
+  if (*(int *) x2 < *(int *) x1)
+    return 1;
+  else
+    return 0;
+}
+
+int main (void)
+{
+  char *strings[] = { "Thomas", "Dora", "Konrad", "Adalbert", "Sophie", NULL };
+  sort ((void **) strings, compare_strings);
+  for (int i = 0; strings[i]; i++)
+    printf ("%s\n", strings[i]);
+
+  printf ("\n");
+
+  int two = 2, ten = 10, zero = 0, three = 3, one = 1;
+  int *numbers[] = { &two, &ten, &zero, &three, &one, NULL };
+  sort ((void **) numbers, compare_numbers);
+  for (int i = 0; numbers[i]; i++)
+    printf ("%d\n", *numbers[i]);
+
+  return 0;
+}