From 89653b43a212aee61e18197d92a1db58e55921b5 Mon Sep 17 00:00:00 2001 From: Solirs Date: Sun, 21 Apr 2024 20:51:31 +0200 Subject: [PATCH 1/5] SKIPLIST: Begin skiplist --- skiplist/main.c | 57 ++++++++++++++++ skiplist/makefile | 24 +++++++ skiplist/skiplist | Bin 0 -> 37480 bytes skiplist/skiplist.c | 155 ++++++++++++++++++++++++++++++++++++++++++++ skiplist/skiplist.h | 30 +++++++++ 5 files changed, 266 insertions(+) create mode 100644 skiplist/main.c create mode 100644 skiplist/makefile create mode 100755 skiplist/skiplist create mode 100644 skiplist/skiplist.c create mode 100644 skiplist/skiplist.h diff --git a/skiplist/main.c b/skiplist/main.c new file mode 100644 index 0000000..a6b5511 --- /dev/null +++ b/skiplist/main.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include "skiplist.h" + + +void printlist(struct cdsc_doublylinkedlist_node *nd) { + printf("%d ", cdsc_sl_data_from_node(nd)); +} + +int main() { + + cdsc_sl* list = cdsc_sl_init(4, 0.5); + struct cdsc_doublylinkedlist* last_lv = ((struct cdsc_doublylinkedlist*)(list->layers->tail->data)); + struct cdsc_doublylinkedlist* level_1 = (struct cdsc_doublylinkedlist*)(list->layers->head->data); + + cdsc_doublylinkedlist_foreach(last_lv, printlist, NULL); + struct cdsc_doublylinkedlist_node* l1h = ((struct cdsc_sl_data*)(last_lv->head->data))->below; + + + struct cdsc_doublylinkedlist* ls = ((struct cdsc_doublylinkedlist*)(list->layers->head->next->data)); + printf("SIZE %d\n", ls->size); + + struct cdsc_sl_data *dd = malloc(sizeof(struct cdsc_sl_data)); + + + cdsc_sl_insert(list, 0); + + cdsc_sl_insert(list, 1); + cdsc_sl_insert(list, 2); + cdsc_sl_insert(list, 4); + cdsc_sl_insert(list, 6); + cdsc_sl_insert(list, 10); + cdsc_sl_insert(list, 12); + cdsc_sl_insert(list, 14); + + cdsc_sl_insert(list, 11); + cdsc_sl_insert(list, -1); + + + + + printf("LIST 1:\n"); + printf("SIZE %d\n", list->layers->size); + + + printf("CONTENTS: \n"); + + for (int i = list->layers->size-1; i >= 0; i--){ + struct cdsc_doublylinkedlist* layer = ((struct cdsc_doublylinkedlist*)(cdsc_doublylinkedlist_at(list->layers, i))); + cdsc_doublylinkedlist_foreach(layer, printlist, NULL); + printf("\n"); + } + + return 0; +} diff --git a/skiplist/makefile b/skiplist/makefile new file mode 100644 index 0000000..4bbbdbd --- /dev/null +++ b/skiplist/makefile @@ -0,0 +1,24 @@ +build: + make object + $(CC) $(CFLAGS) main.c libskiplist.a -o skiplist + +objectlist: + $(MAKE) -C ../doublylinkedlist object + mv ../doublylinkedlist/libdoublylinkedlist.o . + +object: + make objectlist + $(CC) $(CFLAGS) -c skiplist.c -Wall -Wextra -o libskiplist.o + ar ruv libskiplist.a libskiplist.o libdoublylinkedlist.o + +clean: + -rm *.a + -rm *.o + +run: + make build + ./skiplist + +valgrind: + make build + valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=valgrind-out.txt ./skiplist diff --git a/skiplist/skiplist b/skiplist/skiplist new file mode 100755 index 0000000000000000000000000000000000000000..0da1f47843703f688a9be5be6348ffed626595f2 GIT binary patch literal 37480 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�vA4YisVa>GWcuoqkIhIX_S9N8Nio;Ex!Rj%I~6VKw0x!@T0sB*rJK^u9$i0R05N%c6^=%?^Og?Tom|>xwJ5^6$;TL z{5|-*2K)f@+j!T%7(_w%$MN|r#&QKp8*he%0Ky-~=i9(fcH-A%uLS;1;MX|u=4#u%cHsX8_&O)PJ;Q$w z@JE1u)QLC0YV$u1{IY)=8-E=5c1as@NS@^v+{&C_5{^l(FjW+%` z@b3X1&%!s`_*1~wV9rLf@VD4_ALeEU@MG~`1^ko1w`B1*+WaelKMQ;;3%|j}w*$Wz zxnV;VKI6Z8fd4b#OPu&sf}I5cdmQ*A@L$9@+VL6gak=ghAuMPp&%B4cv)3sDH0GzJ z9GWL*Kyw{(&=Dt%`5oKNGUS+_15f(`wjT5IHhvcHA4kqwnT5aJ#;*Z>H}G#|;or3J zDd6WKxBWT`KWO9c13nMA?uS|U6E^=#q2qd4h~J8eY9J&EJjyGMU{y$z^!rUZ^zW7N z*rhncvxlfnRP6!v`(#?r(4q0T^o!%DDZ4j$cczWKI z4)M(hO8wiu3ISzooGNvJrIa`ZSBFH2C8juzs#4!y>HDQ}1@F%biJFFQQElCi4T>&b zm0CZ(5EcEIqv%IeTl*QyB7v_^c*XwztkAz7&oyAS8vpB5`EgaYsB*I^KcmVos`Bfq z%$0Zj(xul1t8QLZ3$&2FAkKX>CbGg|6r-sVtp73y+q

>8cFcCr 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 literal 0 HcmV?d00001 diff --git a/skiplist/skiplist.c b/skiplist/skiplist.c new file mode 100644 index 0000000..45e180b --- /dev/null +++ b/skiplist/skiplist.c @@ -0,0 +1,155 @@ +#include "skiplist.h" + + +int cdsc_sl_at(cdsc_sl* skiplist, int layer, int at){ + struct cdsc_doublylinkedlist* layer_list = (struct cdsc_doublylinkedlist*)(cdsc_doublylinkedlist_at(skiplist->layers, layer)); + + struct cdsc_sl_data* dt = (struct cdsc_sl_data*)(cdsc_doublylinkedlist_at(layer_list, at)); + + return (((int)(dt->data))); +} + +// Get the actual data in a node inside a skiplist. +int cdsc_sl_data_from_node(struct cdsc_doublylinkedlist_node* nd){ + struct cdsc_sl_data *dt = (struct cdsc_sl_data*)(nd->data); + + return (int)((dt->data)); +} + +struct cdsc_sl* cdsc_sl_init(int layers, double layer_up_chance){ + struct cdsc_sl* ret = malloc(sizeof(struct cdsc_sl)); + struct cdsc_doublylinkedlist_node *last_null_element = NULL; + ret->layer_up_chance = layer_up_chance; + + ret->layers = cdsc_doublylinkedlist_make_dll(); + + int i; + for (i = 0; i < layers; i++){ + struct cdsc_doublylinkedlist* app = cdsc_doublylinkedlist_make_dll(); + cdsc_doublylinkedlist_append(ret->layers, app); + + // We are inserting a null element at the top of each layer that will be smaller than all elements. + // It's not supposed to be accessible and is mainly here as a starting point for operations. + struct cdsc_sl_data* null_element = malloc(sizeof(struct cdsc_sl_data)); + float nn = NAN; + null_element->data = NULL; + null_element->above = NULL; + null_element->below = NULL; + null_element->invis = true; + cdsc_doublylinkedlist_append(app, null_element); + + + if (last_null_element != NULL){ + null_element->below = last_null_element; + + ((struct cdsc_sl_data*)(last_null_element->data))->above = app->head; + } + + last_null_element = app->head; + } + + return ret; +} + + + +int cdsc_sl_insert(struct cdsc_sl* skiplist, int data){ + + + struct cdsc_doublylinkedlist_node* curr_node = ((struct cdsc_doublylinkedlist*)(skiplist->layers->tail->data))->head; + + struct cdsc_doublylinkedlist* level_1 = (struct cdsc_doublylinkedlist*)(skiplist->layers->head->data); + struct cdsc_sl_data* new_data = malloc(sizeof(struct cdsc_sl_data)); + struct cdsc_doublylinkedlist_node* new_node = NULL; + int previous_head = (int)(level_1->head->data); + + new_data->data = data; + new_data->below = NULL; + new_data->above = NULL; + new_data->invis = false; + + + + + + while (curr_node != NULL){ + int val = cdsc_sl_data_from_node(curr_node); + bool invis = ((struct cdsc_sl_data*)(curr_node->data))->invis; + + // We move until the value to be inserted is superior to the current pointer. + while ((invis == true || data > val) && curr_node->next != NULL){ + curr_node = curr_node->next; + val = cdsc_sl_data_from_node(curr_node); + + } + + if (((struct cdsc_sl_data*)(curr_node->data))->below == NULL){ + // If we are at layer 1 and there is no node after we append. + if (curr_node->next == NULL){ + cdsc_doublylinkedlist_append(level_1, new_data); + new_node = level_1->tail; + }else{ + // Otherwise we insert before the pointer. + new_node = cdsc_doublylinkedlist_insert_before(level_1, curr_node, new_data); + } + break; + }else{ + if (invis == false){ + curr_node = ((struct cdsc_sl_data*)curr_node->previous->data)->below; + }else{ + curr_node = ((struct cdsc_sl_data*)curr_node->data)->below; + } + } + + + } + + + + + // Might be its own function? + // This is the part where we copy an element up a layer with a random chance. + + // Start at layer 1. + struct cdsc_doublylinkedlist_node* curr_list = skiplist->layers->head; + curr_node = new_node; + while (1){ + // We make a seed using the current time in nanoseconds. + // FUTURE: Allow user to supply a function to generate a seed. + struct timespec curTime; + clock_gettime(CLOCK_REALTIME, &curTime); + srand(curTime.tv_nsec); + double rd = (double)(rand()); + + if (rd / (double)RAND_MAX < skiplist->layer_up_chance && curr_list->next != NULL){ // If a random number between 0 and 1 is lower than the layer up chance. + curr_list = curr_list->next; + struct cdsc_doublylinkedlist* list = (struct cdsc_doublylinkedlist*)(curr_list->data); + + + // If curr_node doesn't have any node above it, we look for the closest node to have one. + while (((struct cdsc_sl_data*)(curr_node->data))->above == NULL){ + curr_node = curr_node->previous; + } + // We then move up + curr_node = ((struct cdsc_sl_data*)(curr_node->data))->above; + + // Data to be added to the new node + struct cdsc_sl_data* nd = malloc(sizeof(struct cdsc_sl_data)); + nd->below = new_node; + nd->above = NULL; + nd->data = data; + nd->invis = false; + + // We insert the new node after curr_node + struct cdsc_doublylinkedlist_node* nn = cdsc_doublylinkedlist_insert_after(list, curr_node, nd); + ((struct cdsc_sl_data*)(new_node->data))->above = nn; + new_node = nn; + + }else{ + // If we don't roll the layer up chance or a new node has been added to each layer we quit. + return 1; + } + + } + +} diff --git a/skiplist/skiplist.h b/skiplist/skiplist.h new file mode 100644 index 0000000..72b3159 --- /dev/null +++ b/skiplist/skiplist.h @@ -0,0 +1,30 @@ +#ifndef CDSC_SKIPLIST_ +#define CDSC_SKIPLIST_ + +#include "../doublylinkedlist/doublylinkedlist.h" +#include +#include +#include +#include + +typedef struct cdsc_sl{ + struct cdsc_doublylinkedlist *layers; + double layer_up_chance; + +} cdsc_sl; + +// This is what is contained in the layer doublylinkedlists, points to the node above and below + holds the actual data. +struct cdsc_sl_data{ + void* data; + struct cdsc_doublylinkedlist_node* below; + struct cdsc_doublylinkedlist_node* above; + + // Whether the node is a fake node or not. + bool invis; +}; + +struct cdsc_sl* cdsc_sl_init(int layers, double layer_up_chance); +int cdsc_sl_insert(struct cdsc_sl* skiplist, int data); +int cdsc_sl_at(cdsc_sl* skiplist, int layer, int at); +int cdsc_sl_data_from_node(struct cdsc_doublylinkedlist_node* nd); +#endif From 688c035bc72203978874460498993b04a83212e0 Mon Sep 17 00:00:00 2001 From: Solirs Date: Tue, 23 Apr 2024 00:13:15 +0200 Subject: [PATCH 2/5] SKIPLIST: Fixes + nuke function --- skiplist/main.c | 18 +++++++----------- skiplist/skiplist | Bin 37480 -> 37952 bytes skiplist/skiplist.c | 45 ++++++++++++++++++++++++++++++++++---------- skiplist/skiplist.h | 5 +++-- 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/skiplist/main.c b/skiplist/main.c index a6b5511..bcd748e 100644 --- a/skiplist/main.c +++ b/skiplist/main.c @@ -22,25 +22,20 @@ int main() { struct cdsc_doublylinkedlist* ls = ((struct cdsc_doublylinkedlist*)(list->layers->head->next->data)); printf("SIZE %d\n", ls->size); - struct cdsc_sl_data *dd = malloc(sizeof(struct cdsc_sl_data)); - cdsc_sl_insert(list, 0); - cdsc_sl_insert(list, 1); - cdsc_sl_insert(list, 2); - cdsc_sl_insert(list, 4); cdsc_sl_insert(list, 6); - cdsc_sl_insert(list, 10); - cdsc_sl_insert(list, 12); - cdsc_sl_insert(list, 14); + + cdsc_sl_insert(list, 4); - cdsc_sl_insert(list, 11); - cdsc_sl_insert(list, -1); + cdsc_sl_insert(list, 0); + cdsc_sl_insert(list, -1); + cdsc_sl_insert(list, 12); + cdsc_sl_insert(list, 7); - printf("LIST 1:\n"); printf("SIZE %d\n", list->layers->size); @@ -53,5 +48,6 @@ int main() { printf("\n"); } + cdsc_sl_nuke(list); return 0; } diff --git a/skiplist/skiplist b/skiplist/skiplist index 0da1f47843703f688a9be5be6348ffed626595f2..a93caca2efaa5662b22c661f271d23c8536da94a 100755 GIT binary patch delta 9589 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 T4_ed+c}5NwOE=2ANBaCfFR_;` diff --git a/skiplist/skiplist.c b/skiplist/skiplist.c index 45e180b..7a3254d 100644 --- a/skiplist/skiplist.c +++ b/skiplist/skiplist.c @@ -31,11 +31,9 @@ struct cdsc_sl* cdsc_sl_init(int layers, double layer_up_chance){ // We are inserting a null element at the top of each layer that will be smaller than all elements. // It's not supposed to be accessible and is mainly here as a starting point for operations. struct cdsc_sl_data* null_element = malloc(sizeof(struct cdsc_sl_data)); - float nn = NAN; null_element->data = NULL; null_element->above = NULL; null_element->below = NULL; - null_element->invis = true; cdsc_doublylinkedlist_append(app, null_element); @@ -52,6 +50,29 @@ struct cdsc_sl* cdsc_sl_init(int layers, double layer_up_chance){ } +void _cdsc_sl_nuke_node(struct cdsc_doublylinkedlist_node* nd){ + struct cdsc_sl_data* data = ((struct cdsc_sl_data*)nd->data); + + free(data); + free(nd); +} +void _cdsc_sl_nuke_list(struct cdsc_doublylinkedlist_node* list_node){ + struct cdsc_doublylinkedlist* list = ((struct cdsc_doublylinkedlist*)list_node->data); + cdsc_doublylinkedlist_foreach(list, _cdsc_sl_nuke_node, NULL); + free(list); + +} +int cdsc_sl_nuke(cdsc_sl* skiplist){ + struct cdsc_doublylinkedlist_node* head = skiplist->layers->head; + while(head != NULL){ + _cdsc_sl_nuke_list(head); + head = head->next; + } + cdsc_doublylinkedlist_nuke(skiplist->layers); + free(skiplist->layers); + free(skiplist); + return 1; +} int cdsc_sl_insert(struct cdsc_sl* skiplist, int data){ @@ -66,26 +87,30 @@ int cdsc_sl_insert(struct cdsc_sl* skiplist, int data){ new_data->data = data; new_data->below = NULL; new_data->above = NULL; - new_data->invis = false; - while (curr_node != NULL){ int val = cdsc_sl_data_from_node(curr_node); - bool invis = ((struct cdsc_sl_data*)(curr_node->data))->invis; - + int invis = 0; + if (curr_node->previous == NULL){ + invis = 1; + } // We move until the value to be inserted is superior to the current pointer. - while ((invis == true || data > val) && curr_node->next != NULL){ + while ((invis == 1 || data > val) && curr_node->next != NULL){ + + curr_node = curr_node->next; - val = cdsc_sl_data_from_node(curr_node); + val = cdsc_sl_data_from_node(curr_node); + invis = 0; } + if (((struct cdsc_sl_data*)(curr_node->data))->below == NULL){ // If we are at layer 1 and there is no node after we append. - if (curr_node->next == NULL){ + if ((curr_node->next == NULL && data > val) || invis == 1){ cdsc_doublylinkedlist_append(level_1, new_data); new_node = level_1->tail; }else{ @@ -94,7 +119,7 @@ int cdsc_sl_insert(struct cdsc_sl* skiplist, int data){ } break; }else{ - if (invis == false){ + if (invis == 0){ curr_node = ((struct cdsc_sl_data*)curr_node->previous->data)->below; }else{ curr_node = ((struct cdsc_sl_data*)curr_node->data)->below; diff --git a/skiplist/skiplist.h b/skiplist/skiplist.h index 72b3159..a51aeb9 100644 --- a/skiplist/skiplist.h +++ b/skiplist/skiplist.h @@ -3,7 +3,6 @@ #include "../doublylinkedlist/doublylinkedlist.h" #include -#include #include #include @@ -20,11 +19,13 @@ struct cdsc_sl_data{ struct cdsc_doublylinkedlist_node* above; // Whether the node is a fake node or not. - bool invis; + int invis; }; struct cdsc_sl* cdsc_sl_init(int layers, double layer_up_chance); int cdsc_sl_insert(struct cdsc_sl* skiplist, int data); int cdsc_sl_at(cdsc_sl* skiplist, int layer, int at); int cdsc_sl_data_from_node(struct cdsc_doublylinkedlist_node* nd); +int cdsc_sl_nuke(cdsc_sl* skiplist); + #endif From 047eb30ce17a0ddd80d13761efe8113bb86740da Mon Sep 17 00:00:00 2001 From: Solirs Date: Sun, 12 May 2024 15:31:44 +0200 Subject: [PATCH 3/5] Add skiplist search --- skiplist/main.c | 17 ++++++++------ skiplist/skiplist | Bin 37952 -> 26480 bytes skiplist/skiplist.c | 55 ++++++++++++++++++++++++++++++++++++++++---- skiplist/skiplist.h | 6 ++--- 4 files changed, 63 insertions(+), 15 deletions(-) diff --git a/skiplist/main.c b/skiplist/main.c index bcd748e..f46628f 100644 --- a/skiplist/main.c +++ b/skiplist/main.c @@ -24,17 +24,20 @@ int main() { - cdsc_sl_insert(list, 1); - cdsc_sl_insert(list, 6); + cdsc_sl_insert(list, 1,NULL); + cdsc_sl_insert(list, 6,NULL); - cdsc_sl_insert(list, 4); + cdsc_sl_insert(list, 4,NULL); - cdsc_sl_insert(list, 0); + cdsc_sl_insert(list, 0,NULL); - cdsc_sl_insert(list, -1); - cdsc_sl_insert(list, 12); - cdsc_sl_insert(list, 7); + cdsc_sl_insert(list, -1,NULL); + cdsc_sl_insert(list, 12,NULL); + cdsc_sl_insert(list, 7,NULL); + + struct cdsc_sl_data* sevn = cdsc_sl_search(list, 7,NULL); + printf("LIST 1:\n"); printf("SIZE %d\n", list->layers->size); diff --git a/skiplist/skiplist b/skiplist/skiplist index a93caca2efaa5662b22c661f271d23c8536da94a..c4d807527afa89a87497033e450873a9f30d5fd2 100755 GIT binary patch delta 3887 zcmaJ@3s6+o89w(eE{{Q3Ub}$EOL>Sdd_tqq^?_~(&R~khG)APpqJx#G&=?{tiV#

Vu#$ zT?-FCTlzs;(&y_3XXShCbiezrDCZvyV~40~4AkhKq-GlEh5vLl+mEIP*zBkH*t0x> z%~9|Ag9orYwNqz}k}Vy;q9e5H2e2Ro`_=$fL*sF04`6+zc8mv0={FtU78hFvhL`&&iK7lRo)=YtR~ z>d~~4bv;T+VGn!%EZ;1j(_moiB;4%M7Yl8UJGK&clFd=*a^&B(ITl`n%4I9ZQmrQZ zy~N*<`ovaJc#Zj$w(^zLr(R382V2>_tGrhZXF0|>>P1lPiX*kVKDCoip!=Auv@U-< zD4zL_1f4{59`*kWE-CC(^1RAZZ%<9_E*ji73bD?hlZ>%)bztIjS-y{yd3B`qA230z ztYZp7QnF>7M|1ck@#<#lnSHY19jjfKrN z$5o!awn4~l2zKH+^NiL9r6>oeCMajf@u#Rh7ei9}l(K>?^owAVd6C&FYSNB+h!w%T zj=R%mj6$`0!-F;T3*Z6!B+r(t&}R1@o=r#LHb?$en`7@rzW(OmQJ!KQrl%BOo@2L_ zoZ&o*6o;X<`cmFY=4CSTzR0u~*}qcm`cxM}OSh=hBv7JKqx3QTEA>CemlRU1IYc={ zUzn#VX41?f)t^n2Xql$mq}7)AfaIS@CkTKtz8C&I-(D2Z2>1E8e z?V+E^>b1&m+I+TlJI5xyFt0qO zhLB6@`bRW1ERH@8EmrHhVO~>r{z$P}IX+)Ds?OD(cd-4zt)SmY3V* zoG>iSLv4(47Dd0}VRX6R4Wb3HL3AZHUiG}^d>(sVQRm#HjD!%n8oyCJ*5=Ge7-6hT znr7#Zr%_nA>!zmFz%Fanv|`{zU=^^aMbnyqwLpG5RJLlGNoDNBZB0u8YQPL&_#I8l z1xB=K+8*En;HSV{z$V~xU?U@q{z4g>&3x)A_)6xalu zeIEgU2Z1J>b&nqq0C)(P0et%b#slvF_W)BmF&vUh+fz)3hAi-FNkG;JgBF>oJn z8^0x}Vto9_7dJF50V`m0JxwM+68?$Ew|rBu5$MmsKZRPx$18`)dqU)_WAKYZJ#&bu zOr1U0XlPY@J-t{sbVu+nKs{nn57y_8>hm{(w%?+(31LPz%s<_twJ?35K6s0^!yFB> ztd(kEro;TWl`g}~fqA@@+9!m??SN@OW&M%x|IFZP=vx8&-EEXOG0fNqGvF?z!F0o% zdzaS2^hK%Pyi2tcBh;IBX*-y7FsohE4(3}IT?VrQ%5GN5w$pZ)qhZePpjw#eFpE3rGRz#9mpZ5&<_?%%ZowXbxxh_{lMxr@ z@7GjWJ-4J{Y!TkXOSFeBt;Ye2F zEdO(Wzp2kZ3I0V7MZz;-Hav7*nR3HO*IrFgGZUQw)0Y~&GZU?RF!Q3Ls)aIU8i!v% z=CMIEv&kwDLq%I6wS&0Uxop-2)e;HEAf|Y&M){RPxQqeuo`>`1uksY<*6f3dU+)Bl zD@=J^^&nTy#NppTq=*aiR(oeL#KW&JMFF=Y(K&rxnFpn8{E>-7A+C(==4X}pvBnsyU;-r1A9S3*Xr}Fj zamrabS{OOj2V`GIq{6pxtd``TT z%b9pC0kb6ktt@+%@Zv?K^LCag3xfMwv=8NgH(%QPA<3siTZOLoTwMU~uZI5D2L2)S z)8qlE*26P5_$X;3-=|ccY$IOFe6J3C5zV-dyMTEsvDIx(5BMi z6!AN6XWQ05@}dJY#hWeCodwiF$!ft83ag6yH&Hk$ AivR!s literal 37952 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 + if (keyfn == NULL){ + keyfn = cdsc_sl_data_from_node; + } + while (curr_node != NULL){ + int val = keyfn(curr_node); + int invis = 0; + if (curr_node->previous == NULL){ + invis = 1; + } + + // We move until the value to be inserted is superior to the current pointer. + while ((invis == 1 || key > val) && curr_node->next != NULL){ + + + curr_node = curr_node->next; + val = keyfn(curr_node); + invis = 0; + + } + + + if (((struct cdsc_sl_data*)(curr_node->data))->below == NULL){ + if (key == val){ + // We found the corresponding node + return curr_node->data; + }else if (curr_node->next == NULL){ + // We did NOT find the corresponding node + return NULL; + } + }else{ + if (invis == 0){ + curr_node = ((struct cdsc_sl_data*)curr_node->previous->data)->below; + }else{ + curr_node = ((struct cdsc_sl_data*)curr_node->data)->below; + } + } + + } +} int cdsc_sl_at(cdsc_sl* skiplist, int layer, int at){ struct cdsc_doublylinkedlist* layer_list = (struct cdsc_doublylinkedlist*)(cdsc_doublylinkedlist_at(skiplist->layers, layer)); @@ -74,7 +118,7 @@ int cdsc_sl_nuke(cdsc_sl* skiplist){ return 1; } -int cdsc_sl_insert(struct cdsc_sl* skiplist, int data){ +int cdsc_sl_insert(struct cdsc_sl* skiplist, int data, int (*keyfn)()){ struct cdsc_doublylinkedlist_node* curr_node = ((struct cdsc_doublylinkedlist*)(skiplist->layers->tail->data))->head; @@ -88,11 +132,13 @@ int cdsc_sl_insert(struct cdsc_sl* skiplist, int data){ new_data->below = NULL; new_data->above = NULL; - + if (keyfn == NULL){ + keyfn = cdsc_sl_data_from_node; + } while (curr_node != NULL){ - int val = cdsc_sl_data_from_node(curr_node); + int val = keyfn(curr_node); int invis = 0; if (curr_node->previous == NULL){ invis = 1; @@ -102,7 +148,7 @@ int cdsc_sl_insert(struct cdsc_sl* skiplist, int data){ curr_node = curr_node->next; - val = cdsc_sl_data_from_node(curr_node); + val = keyfn(curr_node); invis = 0; } @@ -163,7 +209,6 @@ int cdsc_sl_insert(struct cdsc_sl* skiplist, int data){ nd->below = new_node; nd->above = NULL; nd->data = data; - nd->invis = false; // We insert the new node after curr_node struct cdsc_doublylinkedlist_node* nn = cdsc_doublylinkedlist_insert_after(list, curr_node, nd); diff --git a/skiplist/skiplist.h b/skiplist/skiplist.h index a51aeb9..8f54ac9 100644 --- a/skiplist/skiplist.h +++ b/skiplist/skiplist.h @@ -18,13 +18,13 @@ struct cdsc_sl_data{ struct cdsc_doublylinkedlist_node* below; struct cdsc_doublylinkedlist_node* above; - // Whether the node is a fake node or not. - int invis; + }; struct cdsc_sl* cdsc_sl_init(int layers, double layer_up_chance); -int cdsc_sl_insert(struct cdsc_sl* skiplist, int data); +int cdsc_sl_insert(struct cdsc_sl* skiplist, int data, int (*keyfn)()); int cdsc_sl_at(cdsc_sl* skiplist, int layer, int at); +struct cdsc_sl_data* cdsc_sl_search(cdsc_sl* skiplist, int key, int (*keyfn)()); int cdsc_sl_data_from_node(struct cdsc_doublylinkedlist_node* nd); int cdsc_sl_nuke(cdsc_sl* skiplist); From 781043b71b8923a88a6b534e9c5539c60ca150ed Mon Sep 17 00:00:00 2001 From: Solirs Date: Sun, 12 May 2024 15:59:49 +0200 Subject: [PATCH 4/5] Add search all function --- skiplist/main.c | 6 ++++-- skiplist/skiplist | Bin 26480 -> 38864 bytes skiplist/skiplist.c | 42 ++++++++++++++++++++++++++++++++++++++---- skiplist/skiplist.h | 3 ++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/skiplist/main.c b/skiplist/main.c index f46628f..02b4817 100644 --- a/skiplist/main.c +++ b/skiplist/main.c @@ -26,6 +26,8 @@ int main() { cdsc_sl_insert(list, 1,NULL); cdsc_sl_insert(list, 6,NULL); + cdsc_sl_insert(list, 6,NULL); + cdsc_sl_insert(list, 4,NULL); @@ -36,8 +38,8 @@ int main() { cdsc_sl_insert(list, 12,NULL); cdsc_sl_insert(list, 7,NULL); - struct cdsc_sl_data* sevn = cdsc_sl_search(list, 7,NULL); - + struct cdsc_doublylinkedlist* sevn = cdsc_sl_search(list, 6,NULL); + printf("RESULT: %d\n", sevn->size); printf("LIST 1:\n"); printf("SIZE %d\n", list->layers->size); diff --git a/skiplist/skiplist b/skiplist/skiplist index c4d807527afa89a87497033e450873a9f30d5fd2..6afbc9a33a2a9496e9576a9a479046e3e673ba04 100755 GIT binary patch literal 38864 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 delta 3435 zcmaKveNa@_8OF~&yL_yJxWKXt%f|vyz!eEAR(6!=qCiO0j#^4$#0ZJ;qea0PoJ1U4 z)IefD1H3B6W*V8Qwbp4uHZ?Yr2F#2fNtqO#G*z4UnV2;}0ZWJ&_4c{v-d%U|N6!rR zdH4Cf=e_6NbI!e&zPI_{XHsh>A6(jIzc{AS%0#QQQnZw9FomfL6D^in}<- zmC+P;PLLa+&bfO!lV%xebe zPEvCEX-CZX{LxUQY*7!gd(;a!8s!odAB<(JdyLYD?#c4jHTR^g_4n9@k3?MzM5m)$ zG1DWjDJMQvbS^K}#cq5-(@d{Kr8gISJ)>xN{TQU)DQR|v)2F5qy$u&j6U_BI?I+rA zexCpRE*UHbB9D%Wp?Z~TJ3LAsS~ARKW_1ML;q0OW(3(*iwJeD=24w3;>AAQ?+&D@{ z;}-M0Sc;0j&hHy(G=6z>-jAZ{9`u}t(7W5n_ojIkjz7+&^%RqlDZNkm8F`W$$9USFF;#NV#~G!PnJk%)OZl`cGmCq@ zv^{ec54%C1WtPF4F!8K@HAYKk5=}JD-oOjLr8avjfA=~hj%G|+s>99p?3uJm@7Wht zD7ELrQff}T`|>QtdT@6y6-WuX8OjQuq)gi-Sw4ig>9Q<0Ku z{u5dQeert~fZF;|0NMrZgU-2$0?_?XBUZKk7WzXEKo>xl44^;s8)z%kIf(wyPG}#L zVI~Hl?$rp4Avhs42RijO3P5*4YoG_AtwfkutUavb)-Qm7L; z6?5=3H1&=wzXTnD?t#9F#di#^7z;Ex6Jmmcye@T1^s z0y$shuiqkJvUSv!n=s)BQirjAW(KBicvz|zJetnrCama3RQ#h1wI9S zD3J3%_)nSze(C@4dEhI(G(FE6T7~eu2;D6R=iZRz%Al&{{;Eg7Tfi%V_!2+w1@8s# z4B~J4c|Z7kY>%TsyvxVkECRRc8WLU$N@(;Yuq^QT*jK*_;=lCsdEgD;tAqG*Kd%D+ z1bkT#e@5e2!YxP$r-i?;xff!)t_Vu2^q1*HRtNYCLA=7x`@z2iuL$A~?^6V}Zz8sT zbReHEy0a8`S$f71>InY>M*v@fiJ&OPSjrFKvB%x86m zQoBnT7;Z!tx6p!u&__;S;;`S)%tn_`bQi5$%MDR-Jr%Q0aElEfgh}Bmv4*7sI827| zqTcgXd9CCrdw#z(&UXUcStiZpdiqOs?jskFB#8qvaNk*U8Q>C=BzWa^kG`f!PwQ%9 zY4OI3^jdwg-B&1_Dce6p8)KNSdq`N|@RI4WPVb4>^s*!wsm=YkRKQhQBJQnHu+U1gHy1xyJKiPiMsdXJK*8L|e3z=(tWxW?D_zb1 zw+3F<{LWN5yE)tac7lozY50nUdnT%Wo92gL$tt55)lUDR=BH_XO^TW?b{1HH<|k>s z*pcv`)BG>2B0q+SCm2Az268Rbz9pM~l}sN)@cD9kOR;r}n$1d)sI*utUu87e6KT=b zZ0navE@4-QBV%hdyfKOP0^dkfal3|3YWQLrUENyD|2l!}FBiM7;sZ}<;za~a#S&J| z5%#k?G+XnlGF(bJyD5&0Ez|t-+7*ju2w0uwm*PuMY2rNteMR%1Qb(7@e8W4S0cWa9 z$!ES>dV&fXElFoInxCxFPLab{Kl~JIvY7Z#yo;5AZ^QSZ(!`4ix|uo~Eot!@4NG&u zW9$WSWNen^mzn88V|x4|?I+n>B0)TH5!HC&n{q?+YbsZ-rG*Sb{j1^o7i2jN!QJOj>+jRnL9NF@v$&K(>vrWC z`U=Fk@u}Ul+d`*zr5KJCs?G-L>adY{vdQ6D=0X};>rrlH-=aP5bY936QER;HplTGx@s>&oeHNBaK&!uop^ diff --git a/skiplist/skiplist.c b/skiplist/skiplist.c index b819478..345dfaf 100644 --- a/skiplist/skiplist.c +++ b/skiplist/skiplist.c @@ -1,8 +1,7 @@ #include "skiplist.h" -// Search a skiplist for a specific key and return the node that contains it -// By default it will look for the key in the node's data, however you can supply it a custom key function -struct cdsc_sl_data* cdsc_sl_search(cdsc_sl* skiplist, int key, int (*keyfn)()){ + +struct cdsc_doublylinkedlist_node* _cdsc_sl_search_one_node(cdsc_sl* skiplist, int key, int (*keyfn)()){ struct cdsc_doublylinkedlist_node* curr_node = ((struct cdsc_doublylinkedlist*)(skiplist->layers->tail->data))->head; if (keyfn == NULL){ @@ -29,7 +28,7 @@ struct cdsc_sl_data* cdsc_sl_search(cdsc_sl* skiplist, int key, int (*keyfn)()){ if (((struct cdsc_sl_data*)(curr_node->data))->below == NULL){ if (key == val){ // We found the corresponding node - return curr_node->data; + return curr_node; }else if (curr_node->next == NULL){ // We did NOT find the corresponding node return NULL; @@ -45,6 +44,41 @@ struct cdsc_sl_data* cdsc_sl_search(cdsc_sl* skiplist, int key, int (*keyfn)()){ } } +// Search a skiplist for a specific key and return the node that contains it +// By default it will look for the key in the node's data, however you can supply it a custom key function +struct cdsc_sl_data* cdsc_sl_search_one(cdsc_sl* skiplist, int key, int (*keyfn)()){ + if (keyfn == NULL){ + keyfn = cdsc_sl_data_from_node; + } + return (struct cdsc_sl_data*)(_cdsc_sl_search_one_node(skiplist, key, keyfn)->data); + +} + +// Search a skiplist for a specific key and return ALL the nodes that contain it +// By default it will look for the key in the node's data, however you can supply it a custom key function +struct cdsc_doublylinkedlist* cdsc_sl_search(cdsc_sl* skiplist, int key, int (*keyfn)()){ + if (keyfn == NULL){ + keyfn = cdsc_sl_data_from_node; + } + struct cdsc_doublylinkedlist* ret = cdsc_doublylinkedlist_make_dll(); + + // We get the first node containing the searched key using _cdsc_sl_search_one_node and we look for any possible other nodes right after it + struct cdsc_doublylinkedlist_node* nod = _cdsc_sl_search_one_node(skiplist, key, keyfn); + + if (nod != NULL){ + cdsc_doublylinkedlist_appendnode(ret, nod); + int ref = keyfn(nod); + while (nod->next != NULL && keyfn(nod->next) == ref){ + cdsc_doublylinkedlist_appendnode(ret, nod->next); + nod = nod->next; + } + + return ret; + }else{ + return NULL; + } +} + int cdsc_sl_at(cdsc_sl* skiplist, int layer, int at){ struct cdsc_doublylinkedlist* layer_list = (struct cdsc_doublylinkedlist*)(cdsc_doublylinkedlist_at(skiplist->layers, layer)); diff --git a/skiplist/skiplist.h b/skiplist/skiplist.h index 8f54ac9..9c1a861 100644 --- a/skiplist/skiplist.h +++ b/skiplist/skiplist.h @@ -24,7 +24,8 @@ struct cdsc_sl_data{ struct cdsc_sl* cdsc_sl_init(int layers, double layer_up_chance); int cdsc_sl_insert(struct cdsc_sl* skiplist, int data, int (*keyfn)()); int cdsc_sl_at(cdsc_sl* skiplist, int layer, int at); -struct cdsc_sl_data* cdsc_sl_search(cdsc_sl* skiplist, int key, int (*keyfn)()); +struct cdsc_sl_data* cdsc_sl_search_one(cdsc_sl* skiplist, int key, int (*keyfn)()); +struct cdsc_doublylinkedlist* cdsc_sl_search(cdsc_sl* skiplist, int key, int (*keyfn)()); int cdsc_sl_data_from_node(struct cdsc_doublylinkedlist_node* nd); int cdsc_sl_nuke(cdsc_sl* skiplist); From 41f78cfbd8d2fe1e8b723b4919bafbc1a30e6480 Mon Sep 17 00:00:00 2001 From: Solirs Date: Sun, 12 May 2024 17:16:59 +0200 Subject: [PATCH 5/5] Add delete functions --- skiplist/main.c | 4 +++- skiplist/skiplist | Bin 38864 -> 39776 bytes skiplist/skiplist.c | 32 ++++++++++++++++++++++++++++++++ skiplist/skiplist.h | 9 ++++++--- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/skiplist/main.c b/skiplist/main.c index 02b4817..6e6a731 100644 --- a/skiplist/main.c +++ b/skiplist/main.c @@ -11,7 +11,7 @@ void printlist(struct cdsc_doublylinkedlist_node *nd) { int main() { - cdsc_sl* list = cdsc_sl_init(4, 0.5); + cdsc_sl* list = cdsc_sl_init(5, 0.75); struct cdsc_doublylinkedlist* last_lv = ((struct cdsc_doublylinkedlist*)(list->layers->tail->data)); struct cdsc_doublylinkedlist* level_1 = (struct cdsc_doublylinkedlist*)(list->layers->head->data); @@ -43,6 +43,8 @@ int main() { printf("LIST 1:\n"); printf("SIZE %d\n", list->layers->size); + + cdsc_sl_delete(list, 6, NULL); printf("CONTENTS: \n"); diff --git a/skiplist/skiplist b/skiplist/skiplist index 6afbc9a33a2a9496e9576a9a479046e3e673ba04..a7084bece9c0b12a828ff0fe507d47281680ae74 100755 GIT binary patch delta 10871 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 HC-eRfw7X|B delta 8985 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, nod); + return 1; +} + + +int cdsc_sl_delete(cdsc_sl* skiplist, int key, int (*keyfn)()){ + if (keyfn == NULL){ + keyfn = cdsc_sl_data_from_node; + } + + + struct cdsc_doublylinkedlist_node* nod = _cdsc_sl_search_one_node(skiplist, key, keyfn); + int ref = keyfn(nod); + while (nod != NULL && keyfn(nod) == ref){ + struct cdsc_doublylinkedlist_node* del = nod; + nod = nod->next; + + struct cdsc_doublylinkedlist_node* curr_layer = skiplist->layers->head; + struct cdsc_doublylinkedlist_node* curr_node = del; + while(curr_layer != NULL && curr_node != NULL){ + struct cdsc_doublylinkedlist_node* above = ((cdsc_sl_data*)(curr_node->data))->above; + + cdsc_doublylinkedlist_remove_node((struct cdsc_doublylinkedlist*)(curr_layer->data), curr_node); + curr_layer = curr_layer->next; + curr_node = above; + } + } + + return 1; +} struct cdsc_doublylinkedlist_node* _cdsc_sl_search_one_node(cdsc_sl* skiplist, int key, int (*keyfn)()){ diff --git a/skiplist/skiplist.h b/skiplist/skiplist.h index 9c1a861..6f4e8cd 100644 --- a/skiplist/skiplist.h +++ b/skiplist/skiplist.h @@ -13,20 +13,23 @@ typedef struct cdsc_sl{ } cdsc_sl; // This is what is contained in the layer doublylinkedlists, points to the node above and below + holds the actual data. -struct cdsc_sl_data{ +typedef struct cdsc_sl_data{ void* data; struct cdsc_doublylinkedlist_node* below; struct cdsc_doublylinkedlist_node* above; -}; +} cdsc_sl_data; struct cdsc_sl* cdsc_sl_init(int layers, double layer_up_chance); int cdsc_sl_insert(struct cdsc_sl* skiplist, int data, int (*keyfn)()); int cdsc_sl_at(cdsc_sl* skiplist, int layer, int at); struct cdsc_sl_data* cdsc_sl_search_one(cdsc_sl* skiplist, int key, int (*keyfn)()); struct cdsc_doublylinkedlist* cdsc_sl_search(cdsc_sl* skiplist, int key, int (*keyfn)()); +int cdsc_sl_delete_one(cdsc_sl* skiplist, int key, int (*keyfn)()); +int cdsc_sl_delete_all(cdsc_sl* skiplist, int key, int (*keyfn)()); + int cdsc_sl_data_from_node(struct cdsc_doublylinkedlist_node* nd); int cdsc_sl_nuke(cdsc_sl* skiplist); - +struct cdsc_doublylinkedlist_node* _cdsc_sl_search_one_node(cdsc_sl* skiplist, int key, int (*keyfn)()); #endif