📄 glist.c
字号:
} } return list;}static inline GList*_g_list_remove_link (GList *list, GList *link){ if (link) { if (link->prev) link->prev->next = link->next; if (link->next) link->next->prev = link->prev; if (link == list) list = list->next; link->next = NULL; link->prev = NULL; } return list;}GList*g_list_remove_link (GList *list, GList *link){ return _g_list_remove_link (list, link);}GList*g_list_delete_link (GList *list, GList *link){ list = _g_list_remove_link (list, link); _g_list_free_1 (link); return list;}GList*g_list_copy (GList *list){ GList *new_list = NULL; if (list) { GList *last; new_list = _g_list_alloc (); new_list->data = list->data; last = new_list; list = list->next; while (list) { last->next = _g_list_alloc (); last->next->prev = last; last = last->next; last->data = list->data; list = list->next; } } return new_list;}GList*g_list_reverse (GList *list){ GList *last; last = NULL; while (list) { last = list; list = last->next; last->next = last->prev; last->prev = list; } return last;}GList*g_list_nth (GList *list, guint n){ while ((n-- > 0) && list) list = list->next; return list;}GList*g_list_nth_prev (GList *list, guint n){ while ((n-- > 0) && list) list = list->prev; return list;}gpointerg_list_nth_data (GList *list, guint n){ while ((n-- > 0) && list) list = list->next; return list ? list->data : NULL;}GList*g_list_find (GList *list, gconstpointer data){ while (list) { if (list->data == data) break; list = list->next; } return list;}GList*g_list_find_custom (GList *list, gconstpointer data, GCompareFunc func){ g_return_val_if_fail (func != NULL, list); while (list) { if (! func (list->data, data)) return list; list = list->next; } return NULL;}gintg_list_position (GList *list, GList *link){ gint i; i = 0; while (list) { if (list == link) return i; i++; list = list->next; } return -1;}gintg_list_index (GList *list, gconstpointer data){ gint i; i = 0; while (list) { if (list->data == data) return i; i++; list = list->next; } return -1;}GList*g_list_last (GList *list){ if (list) { while (list->next) list = list->next; } return list;}GList*g_list_first (GList *list){ if (list) { while (list->prev) list = list->prev; } return list;}guintg_list_length (GList *list){ guint length; length = 0; while (list) { length++; list = list->next; } return length;}voidg_list_foreach (GList *list, GFunc func, gpointer user_data){ while (list) { GList *next = list->next; (*func) (list->data, user_data); list = next; }}GList*g_list_insert_sorted (GList *list, gpointer data, GCompareFunc func){ GList *tmp_list = list; GList *new_list; gint cmp; g_return_val_if_fail (func != NULL, list); if (!list) { new_list = _g_list_alloc (); new_list->data = data; return new_list; } cmp = (*func) (data, tmp_list->data); while ((tmp_list->next) && (cmp > 0)) { tmp_list = tmp_list->next; cmp = (*func) (data, tmp_list->data); } new_list = _g_list_alloc (); new_list->data = data; if ((!tmp_list->next) && (cmp > 0)) { tmp_list->next = new_list; new_list->prev = tmp_list; return list; } if (tmp_list->prev) { tmp_list->prev->next = new_list; new_list->prev = tmp_list->prev; } new_list->next = tmp_list; tmp_list->prev = new_list; if (tmp_list == list) return new_list; else return list;}static GList *g_list_sort_merge (GList *l1, GList *l2, GFunc compare_func, gboolean use_data, gpointer user_data){ GList list, *l, *lprev; gint cmp; l = &list; lprev = NULL; while (l1 && l2) { if (use_data) cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); else cmp = ((GCompareFunc) compare_func) (l1->data, l2->data); if (cmp <= 0) { l->next = l1; l = l->next; l->prev = lprev; lprev = l; l1 = l1->next; } else { l->next = l2; l = l->next; l->prev = lprev; lprev = l; l2 = l2->next; } } l->next = l1 ? l1 : l2; l->next->prev = l; return list.next;}static GList* g_list_sort_real (GList *list, GFunc compare_func, gboolean use_data, gpointer user_data){ GList *l1, *l2; if (!list) return NULL; if (!list->next) return list; l1 = list; l2 = list->next; while ((l2 = l2->next) != NULL) { if ((l2 = l2->next) == NULL) break; l1 = l1->next; } l2 = l1->next; l1->next = NULL; return g_list_sort_merge (g_list_sort_real (list, compare_func, use_data, user_data), g_list_sort_real (l2, compare_func, use_data, user_data), compare_func, use_data, user_data);}GList *g_list_sort (GList *list, GCompareFunc compare_func){ return g_list_sort_real (list, (GFunc) compare_func, FALSE, NULL); }GList *g_list_sort_with_data (GList *list, GCompareDataFunc compare_func, gpointer user_data){ return g_list_sort_real (list, (GFunc) compare_func, TRUE, user_data);}static GList* g_list_sort2 (GList *list, GCompareFunc compare_func){ GSList *runs = NULL; GList *tmp; /* Degenerate case. */ if (!list) return NULL; /* Assume: list = [12,2,4,11,2,4,6,1,1,12]. */ for (tmp = list; tmp; ) { GList *tmp2; for (tmp2 = tmp; tmp2->next && compare_func (tmp2->data, tmp2->next->data) <= 0; tmp2 = tmp2->next) /* Nothing */; runs = g_slist_append (runs, tmp); tmp = tmp2->next; tmp2->next = NULL; } /* Now: runs = [[12],[2,4,11],[2,4,6],[1,1,12]]. */ while (runs->next) { /* We have more than one run. Merge pairwise. */ GSList *dst, *src, *dstprev = NULL; dst = src = runs; while (src && src->next) { dst->data = g_list_sort_merge (src->data, src->next->data, (GFunc) compare_func, FALSE, NULL); dstprev = dst; dst = dst->next; src = src->next->next; } /* If number of runs was odd, just keep the last. */ if (src) { dst->data = src->data; dstprev = dst; dst = dst->next; } dstprev->next = NULL; g_slist_free (dst); } /* After 1st loop: runs = [[2,4,11,12],[1,1,2,4,6,12]]. */ /* After 2nd loop: runs = [[1,1,2,2,4,4,6,11,12,12]]. */ list = runs->data; g_slist_free (runs); return list;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -