#include <stdlib.h>
typedef struct Element
{
int data;
struct Element* next;
} Element;
typedef Element* List;
int compare_elements_greater(const Element *lhs, const Element *rhs)
{
return lhs->data > rhs->data;
}
void bubble_sort(List *root, int (*comparison)(const Element*, const Element*))
{
// If the list has 0 or 1 element, it is already sorted:
if (! *root || !(*root)->next)
return;
// Otherwise use extra stupid sort:
int num_changes;
do
{
num_changes = 0;
Element **p1 = root;
Element *p2 = *root;
Element *p3 = (*root)->next;
while (p3)
{
if (comparison(p2, p3))
{
++num_changes;
*p1 = p3;
p2->next = p3->next;
p3->next = p2;
p1 = &p3->next;
p3 = p2->next;
}
else
{
p1 = &p2->next;
p2 = p3;
p3 = p3->next;
}
}
}
while (num_changes);
}
List create_list()
{
return NULL;
}
int insert_list(int value, List *list)
{
List old_list = *list;
*list
= malloc(sizeof(Element
)); if (*list)
{
(*list)->data = value;
(*list)->next = old_list;
return 1;
}
else
{
*list = old_list;
return 0;
}
}
void delete_list(List* list)
{
while (*list)
{
List next = (*list)->next;
*list = next;
}
}
List iterate_list(List *list)
{
*list = (*list)->next;
return *list;
}
int get_list_data(List list)
{
return list->data;
}
#include <time.h>
#include <stdio.h>
int main()
{
List list = create_list();
for(int i = 0; i < 25; ++i)
{
if (!insert_list
(rand() % 42, &list
)) {
fputs("Fehler beim Einfügen!\n", stderr
); goto Exception;
}
}
bubble_sort(&list, &compare_elements_greater);
for(List iterator = list; iterator; iterate_list(&iterator))
{
printf("%d\n", get_list_data
(iterator
)); }
Exception:
delete_list(&list);
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgoKdHlwZWRlZiBzdHJ1Y3QgRWxlbWVudAp7CiAgaW50IGRhdGE7CiAgc3RydWN0IEVsZW1lbnQqIG5leHQ7Cn0gRWxlbWVudDsKCnR5cGVkZWYgRWxlbWVudCogTGlzdDsKCgppbnQgY29tcGFyZV9lbGVtZW50c19ncmVhdGVyKGNvbnN0IEVsZW1lbnQgKmxocywgY29uc3QgRWxlbWVudCAqcmhzKQp7CiAgcmV0dXJuIGxocy0+ZGF0YSA+IHJocy0+ZGF0YTsKfQoKCnZvaWQgYnViYmxlX3NvcnQoTGlzdCAqcm9vdCwgaW50ICgqY29tcGFyaXNvbikoY29uc3QgRWxlbWVudCosIGNvbnN0IEVsZW1lbnQqKSkKewogIC8vIElmIHRoZSBsaXN0IGhhcyAwIG9yIDEgZWxlbWVudCwgaXQgaXMgYWxyZWFkeSBzb3J0ZWQ6CiAgaWYgKCEgKnJvb3QgfHwgISgqcm9vdCktPm5leHQpCiAgICByZXR1cm47CgogIC8vIE90aGVyd2lzZSB1c2UgZXh0cmEgc3R1cGlkIHNvcnQ6CiAgaW50IG51bV9jaGFuZ2VzOwogIGRvCiAgICB7CiAgICAgIG51bV9jaGFuZ2VzID0gMDsKICAgICAgRWxlbWVudCAqKnAxID0gcm9vdDsKICAgICAgRWxlbWVudCAqcDIgPSAqcm9vdDsKICAgICAgRWxlbWVudCAqcDMgPSAoKnJvb3QpLT5uZXh0OwogICAgICAKICAgICAgd2hpbGUgKHAzKQogICAgICAgIHsKICAgICAgICAgIGlmIChjb21wYXJpc29uKHAyLCBwMykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICArK251bV9jaGFuZ2VzOwogICAgICAgICAgICAgIAogICAgICAgICAgICAgICpwMSA9IHAzOyAKICAgICAgICAgICAgICBwMi0+bmV4dCA9IHAzLT5uZXh0OyAKICAgICAgICAgICAgICBwMy0+bmV4dCA9IHAyOyAgICAgICAgCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgcDEgPSAmcDMtPm5leHQ7CiAgICAgICAgICAgICAgcDMgPSBwMi0+bmV4dDsgIAogICAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBwMSA9ICZwMi0+bmV4dDsKICAgICAgICAgICAgICBwMiA9IHAzOwogICAgICAgICAgICAgIHAzID0gcDMtPm5leHQ7IAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogIHdoaWxlIChudW1fY2hhbmdlcyk7Cn0KCgpMaXN0IGNyZWF0ZV9saXN0KCkKewogIHJldHVybiBOVUxMOwp9CgoKaW50IGluc2VydF9saXN0KGludCB2YWx1ZSwgTGlzdCAqbGlzdCkKewogIExpc3Qgb2xkX2xpc3QgPSAqbGlzdDsKICAqbGlzdCA9IG1hbGxvYyhzaXplb2YoRWxlbWVudCkpOwogIGlmICgqbGlzdCkKICAgIHsKICAgICAgKCpsaXN0KS0+ZGF0YSA9IHZhbHVlOwogICAgICAoKmxpc3QpLT5uZXh0ID0gb2xkX2xpc3Q7CiAgICAgIHJldHVybiAxOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgKmxpc3QgPSBvbGRfbGlzdDsKICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KCgp2b2lkIGRlbGV0ZV9saXN0KExpc3QqIGxpc3QpCnsKICB3aGlsZSAoKmxpc3QpCiAgICB7CiAgICAgIExpc3QgbmV4dCA9ICgqbGlzdCktPm5leHQ7CiAgICAgIGZyZWUoKmxpc3QpOwogICAgICAqbGlzdCA9IG5leHQ7CiAgICB9Cn0KCgpMaXN0IGl0ZXJhdGVfbGlzdChMaXN0ICpsaXN0KQp7CiAgKmxpc3QgPSAoKmxpc3QpLT5uZXh0OwogIHJldHVybiAqbGlzdDsKfQoKCmludCBnZXRfbGlzdF9kYXRhKExpc3QgbGlzdCkKewogIHJldHVybiBsaXN0LT5kYXRhOwp9CgoKCiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKaW50IG1haW4oKQp7CiAgTGlzdCBsaXN0ID0gY3JlYXRlX2xpc3QoKTsKCiAgc3JhbmQodGltZSgwKSk7CiAgZm9yKGludCBpID0gMDsgaSA8IDI1OyArK2kpCiAgICB7CiAgICAgIGlmICghaW5zZXJ0X2xpc3QocmFuZCgpICUgNDIsICZsaXN0KSkKICAgICAgICB7CiAgICAgICAgICBmcHV0cygiRmVobGVyIGJlaW0gRWluZsO8Z2VuIVxuIiwgc3RkZXJyKTsKICAgICAgICAgIGdvdG8gRXhjZXB0aW9uOwogICAgICAgIH0KICAgIH0KCiAgYnViYmxlX3NvcnQoJmxpc3QsICZjb21wYXJlX2VsZW1lbnRzX2dyZWF0ZXIpOwoKICBmb3IoTGlzdCBpdGVyYXRvciA9IGxpc3Q7IGl0ZXJhdG9yOyBpdGVyYXRlX2xpc3QoJml0ZXJhdG9yKSkKICAgIHsKICAgICAgcHJpbnRmKCIlZFxuIiwgZ2V0X2xpc3RfZGF0YShpdGVyYXRvcikpOwogICAgfQoKIEV4Y2VwdGlvbjoKICBkZWxldGVfbGlzdCgmbGlzdCk7Cn0K