#include #include typedef struct Person Person; struct Person { const gchar *fn, *ln; }; Person * person_new (const gchar *fn, const gchar *ln) { Person *this = g_new0(Person, 1); this->fn = fn; this->ln = ln; return this; } gint person_sort (gconstpointer a, gconstpointer b) { gint ret = g_ascii_strcasecmp(((Person *)a)->ln, ((Person *)b)->ln); if(ret == 0) ret = g_ascii_strcasecmp(((Person *)a)->fn, ((Person *)b)->fn); return ret; } void person_print (gpointer data, gpointer user_data) { g_printf(" %s, %s\n", ((Person *)data)->ln, ((Person *)data)->fn); } int main (int argc, char **argv) { GSList *people = NULL; #define APPEND(FN, LN) people = g_slist_append(people, person_new(FN, LN)); APPEND("John", "Doe"); APPEND("Bob", "Dole"); APPEND("John", "Smith"); APPEND("Jane", "Doe"); APPEND("Foo", "Bar"); g_printf("Original list:\n"); g_slist_foreach(people, person_print, NULL); people = g_slist_sort(people, person_sort); g_printf("\nSorted list:\n"); g_slist_foreach(people, person_print, NULL); return 0; }