// Тип: элемент списка
typedef struct slist_ {
long val;
struct slist_ *next;
} slist;
slist *radix_list(slist *l) {
// Вспомогательные переменные
int i, j, d;
// Параметры сортировки
int range = 10, width = 2;
slist *temp, *out, *head[10], *tail[10];
// результирующий массив
out=l;
int rangepow = 1;
for (j = 0; j < width; j++) {
for (i = 0; i < range; i++)
head[i] = (tail[i] = NULL);
// РАСПРЕДЕЛЕНИЕ
while ( l != NULL ) {
// Значение текущего разряда
d = ((int)(l->val / rangepow)) % range;
temp = tail[d];
if (head[d]==NULL) {
head[d] = l;
} else {
temp->next = l;
}
temp = tail[d] = l;
l = l->next;
temp->next = NULL;
}
// Находим первый непустой карман
for (i=0; i < range; i++)
if ( head[i] != NULL ) break;
// СБОРКА
l = head[i];
temp = tail[i];
for (d = i+1; d < range; d++) {
if ( head[d] != NULL) {
temp->next = head[d];
temp = tail[d];
}
}
rangepow*=10;
}
return (out);
}