-
Notifications
You must be signed in to change notification settings - Fork 1
/
r3_slist_insert.c
71 lines (69 loc) · 2.38 KB
/
r3_slist_insert.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "r3_slist.h"
// TODO не проверял
typedef int (*GCompareFunc)(void*, void*);
/*! \brief добавить элемент в список перед указанным
\param list - список
\param sibling - элемент списка перед которым вставляется новый элемент
\param data - данные
\return начало списка
*/
GSList* g_slist_insert_before(GSList * list, GSList* sibling, void* data)
{
// if (!list) return list;
GSList* first = list;
if (first == sibling || first==NULL){ // перед первым элементом
first = g_slice_new(GSList);
first->data = data, first->next = sibling;
} else {
while (list->next)
{
if (list->next == sibling){
break;
}
list = list->next;
}
// доехали до конца списка, не нашли, вставим в конец
list->next = g_slice_new(GSList);
list = list->next;
list->data = data, list->next = sibling;
}
return first;
}
GSList* g_slist_insert_after (GSList * list, GSList* sibling, void* data)
{
GSList * elem = g_slice_new(GSList);
elem->data = data, elem->next= NULL;
if (sibling == NULL) {
list = elem;
} else {
elem->next = sibling->next;
sibling->next = elem;
}
return list;
}
/*! \brief добавить элемент в список с сортировкой
\param list - список
\param data - данные
\param func - функция сравнения, возвращает >0 если a после b
\return начало списка
*/
GSList* g_slist_insert_sorted (GSList *list, void* data, GCompareFunc func)
{
GSList* first = list;
if (first == NULL || func(list->data, data)>0) {// первым элементом списка
first = g_slice_new(GSList);
first->data = data, first->next = list;
} else {
GSList* prev = first;
list = list->next;
while (list){
if (func(list->data, data)>0) break;
prev = list;
list = list->next;
}
prev->next = g_slice_new(GSList);
prev = prev->next;
prev->data = data, prev->next = list;
}
return first;
}