summaryrefslogtreecommitdiffhomepage
path: root/misc/examples/linkedlists
diff options
context:
space:
mode:
author_Tradam <[email protected]>2023-09-08 01:29:47 +0000
committerGitHub <[email protected]>2023-09-08 01:29:47 +0000
commit3c76c7f3d5db3f9586a90d03f8fbb02d79de9acd (patch)
treeafbe4b540967223911f7c5de36559b82154f02f3 /misc/examples/linkedlists
parent0841165881871ee01b782129be681209aeed2423 (diff)
parent1a72205fe05c2375cfd380dd8381a8460d9ed8d1 (diff)
downloadSTC-modified-modified.tar.gz
STC-modified-modified.zip
Merge branch 'stclib:master' into modifiedHEADmodified
Diffstat (limited to 'misc/examples/linkedlists')
-rw-r--r--misc/examples/linkedlists/intrusive.c33
-rw-r--r--misc/examples/linkedlists/list.c64
-rw-r--r--misc/examples/linkedlists/list_erase.c30
-rw-r--r--misc/examples/linkedlists/list_splice.c38
-rw-r--r--misc/examples/linkedlists/new_list.c70
5 files changed, 235 insertions, 0 deletions
diff --git a/misc/examples/linkedlists/intrusive.c b/misc/examples/linkedlists/intrusive.c
new file mode 100644
index 00000000..edb072c7
--- /dev/null
+++ b/misc/examples/linkedlists/intrusive.c
@@ -0,0 +1,33 @@
+// Example of clist using the node API.
+
+#include <stdio.h>
+
+#define i_type List
+#define i_key int
+#define i_use_cmp
+#include <stc/clist.h>
+
+void printList(List list) {
+ printf("list:");
+ c_foreach (i, List, list)
+ printf(" %d", *i.ref);
+ puts("");
+}
+
+int main(void) {
+ List list = {0};
+ c_forlist (i, int, {6, 9, 3, 1, 7, 4, 5, 2, 8})
+ List_push_back_node(&list, c_new(List_node, {.value=*i.ref}));
+
+ printList(list);
+
+ puts("Sort list");
+ List_sort(&list);
+ printList(list);
+
+ puts("Remove nodes from list");
+ while (!List_empty(&list))
+ c_free(List_unlink_after_node(&list, list.last));
+
+ printList(list);
+}
diff --git a/misc/examples/linkedlists/list.c b/misc/examples/linkedlists/list.c
new file mode 100644
index 00000000..e83dc6b2
--- /dev/null
+++ b/misc/examples/linkedlists/list.c
@@ -0,0 +1,64 @@
+#include <stdio.h>
+#include <time.h>
+#include <stc/algorithm.h>
+#include <stc/crand.h>
+
+#define i_type DList
+#define i_key double
+#define i_use_cmp
+#include <stc/clist.h>
+
+int main(void) {
+ const int n = 3000000;
+ DList list = {0};
+
+ csrand(1234567);
+ int m = 0;
+ c_forrange (n)
+ DList_push_back(&list, crandf()*n + 100), ++m;
+
+ double sum = 0.0;
+ printf("sumarize %d:\n", m);
+ c_foreach (i, DList, list)
+ sum += *i.ref;
+ printf("sum %f\n\n", sum);
+
+ c_forfilter (i, DList, list, c_flt_take(i, 10))
+ printf("%8d: %10f\n", c_flt_getcount(i), *i.ref);
+
+ puts("sort");
+ DList_sort(&list); // qsort O(n*log n)
+ puts("sorted");
+
+ c_forfilter (i, DList, list, c_flt_take(i, 10))
+ printf("%8d: %10f\n", c_flt_getcount(i), *i.ref);
+ puts("");
+
+ DList_drop(&list);
+ list = c_init(DList, {10, 20, 30, 40, 30, 50});
+
+ const double* v = DList_get(&list, 30);
+ printf("found: %f\n", *v);
+
+ c_foreach (i, DList, list)
+ printf(" %g", *i.ref);
+ puts("");
+
+ DList_remove(&list, 30);
+ DList_insert_at(&list, DList_begin(&list), 5); // same as push_front()
+ DList_push_back(&list, 500);
+ DList_push_front(&list, 1964);
+
+ printf("Full: ");
+ c_foreach (i, DList, list)
+ printf(" %g", *i.ref);
+
+ printf("\nSubs: ");
+ DList_iter it = DList_begin(&list);
+
+ c_foreach (i, DList, DList_advance(it, 4), DList_end(&list))
+ printf(" %g", *i.ref);
+ puts("");
+
+ DList_drop(&list);
+}
diff --git a/misc/examples/linkedlists/list_erase.c b/misc/examples/linkedlists/list_erase.c
new file mode 100644
index 00000000..211c5a5d
--- /dev/null
+++ b/misc/examples/linkedlists/list_erase.c
@@ -0,0 +1,30 @@
+// erasing from clist
+#include <stdio.h>
+
+#define i_type IList
+#define i_key int
+#include <stc/clist.h>
+
+int main(void)
+{
+ IList L = c_init(IList, {10, 20, 30, 40, 50});
+
+ c_foreach (x, IList, L)
+ printf("%d ", *x.ref);
+ puts("");
+ // 10 20 30 40 50
+ IList_iter it = IList_begin(&L); // ^
+ IList_next(&it);
+ it = IList_erase_at(&L, it); // 10 30 40 50
+ // ^
+ IList_iter end = IList_end(&L); //
+ IList_next(&it);
+ it = IList_erase_range(&L, it, end); // 10 30
+ // ^
+ printf("list contains:");
+ c_foreach (x, IList, L)
+ printf(" %d", *x.ref);
+ puts("");
+
+ IList_drop(&L);
+}
diff --git a/misc/examples/linkedlists/list_splice.c b/misc/examples/linkedlists/list_splice.c
new file mode 100644
index 00000000..f1fd6e1f
--- /dev/null
+++ b/misc/examples/linkedlists/list_splice.c
@@ -0,0 +1,38 @@
+#include <stdio.h>
+
+#define i_key int
+#define i_tag i
+#include <stc/clist.h>
+
+void print_ilist(const char* s, clist_i list)
+{
+ printf("%s", s);
+ c_foreach (i, clist_i, list) {
+ printf(" %d", *i.ref);
+ }
+ puts("");
+}
+
+int main(void)
+{
+ clist_i list1 = c_init(clist_i, {1, 2, 3, 4, 5});
+ clist_i list2 = c_init(clist_i, {10, 20, 30, 40, 50});
+
+ print_ilist("list1:", list1);
+ print_ilist("list2:", list2);
+
+ clist_i_iter it = clist_i_advance(clist_i_begin(&list1), 2);
+ it = clist_i_splice(&list1, it, &list2);
+
+ puts("After splice");
+ print_ilist("list1:", list1);
+ print_ilist("list2:", list2);
+
+ clist_i_splice_range(&list2, clist_i_begin(&list2), &list1, it, clist_i_end(&list1));
+
+ puts("After splice_range");
+ print_ilist("list1:", list1);
+ print_ilist("list2:", list2);
+
+ c_drop(clist_i, &list1, &list2);
+}
diff --git a/misc/examples/linkedlists/new_list.c b/misc/examples/linkedlists/new_list.c
new file mode 100644
index 00000000..7518929a
--- /dev/null
+++ b/misc/examples/linkedlists/new_list.c
@@ -0,0 +1,70 @@
+#include <stdio.h>
+#include <stc/forward.h>
+
+forward_clist(clist_i32, int);
+forward_clist(clist_pnt, struct Point);
+
+typedef struct {
+ clist_i32 intlist;
+ clist_pnt pntlist;
+} MyStruct;
+
+#define i_key int
+#define i_tag i32
+#define i_is_forward
+#include <stc/clist.h>
+
+typedef struct Point { int x, y; } Point;
+int point_cmp(const Point* a, const Point* b) {
+ int c = a->x - b->x;
+ return c ? c : a->y - b->y;
+}
+
+#define i_key Point
+#define i_cmp point_cmp
+#define i_is_forward
+#define i_tag pnt
+#include <stc/clist.h>
+
+#define i_key float
+#define i_use_cmp // use < and == operators for comparison
+#include <stc/clist.h>
+
+void MyStruct_drop(MyStruct* s);
+#define i_type MyList
+#define i_key MyStruct
+#define i_keydrop MyStruct_drop // define drop function
+#define i_no_clone // must explicitely exclude or define cloning support because of drop.
+#include <stc/clist.h>
+
+void MyStruct_drop(MyStruct* s) {
+ clist_i32_drop(&s->intlist);
+ clist_pnt_drop(&s->pntlist);
+}
+
+
+int main(void)
+{
+ MyStruct my = {0};
+ clist_i32_push_back(&my.intlist, 123);
+ clist_pnt_push_back(&my.pntlist, c_LITERAL(Point){123, 456});
+ MyStruct_drop(&my);
+
+ clist_pnt plist = c_init(clist_pnt, {{42, 14}, {32, 94}, {62, 81}});
+ clist_pnt_sort(&plist);
+
+ c_foreach (i, clist_pnt, plist)
+ printf(" (%d %d)", i.ref->x, i.ref->y);
+ puts("");
+ clist_pnt_drop(&plist);
+
+
+ clist_float flist = c_init(clist_float, {123.3f, 321.2f, -32.2f, 78.2f});
+ clist_float_sort(&flist);
+
+ c_foreach (i, clist_float, flist)
+ printf(" %g", (double)*i.ref);
+
+ puts("");
+ clist_float_drop(&flist);
+}