From 9927d7645b01f23c96b81952c1af027ef9b81da1 Mon Sep 17 00:00:00 2001 From: ak643du Date: Thu, 14 Mar 2024 16:10:50 +0100 Subject: [PATCH] Initialization --- cv4/list-ops/.docs/instructions.md | 19 ---- cv4/list-ops/.meta/config.json | 25 ------ cv4/list-ops/.meta/example.c | 134 ----------------------------- cv4/list-ops/.meta/example.h | 47 ---------- cv4/list-ops/.meta/tests.toml | 105 ---------------------- cv4/list-ops/.zip | Bin 34359 -> 0 bytes cv4/list_ops.c | 72 ++++++++++++---- 7 files changed, 55 insertions(+), 347 deletions(-) delete mode 100644 cv4/list-ops/.docs/instructions.md delete mode 100644 cv4/list-ops/.meta/config.json delete mode 100644 cv4/list-ops/.meta/example.c delete mode 100644 cv4/list-ops/.meta/example.h delete mode 100644 cv4/list-ops/.meta/tests.toml delete mode 100644 cv4/list-ops/.zip diff --git a/cv4/list-ops/.docs/instructions.md b/cv4/list-ops/.docs/instructions.md deleted file mode 100644 index ccfc2f8..0000000 --- a/cv4/list-ops/.docs/instructions.md +++ /dev/null @@ -1,19 +0,0 @@ -# Instructions - -Implement basic list operations. - -In functional languages list operations like `length`, `map`, and `reduce` are very common. -Implement a series of basic list operations, without using existing functions. - -The precise number and names of the operations to be implemented will be track dependent to avoid conflicts with existing names, but the general operations you will implement include: - -- `append` (*given two lists, add all items in the second list to the end of the first list*); -- `concatenate` (*given a series of lists, combine all items in all lists into one flattened list*); -- `filter` (*given a predicate and a list, return the list of all items for which `predicate(item)` is True*); -- `length` (*given a list, return the total number of items within it*); -- `map` (*given a function and a list, return the list of the results of applying `function(item)` on all items*); -- `foldl` (*given a function, a list, and initial accumulator, fold (reduce) each item into the accumulator from the left*); -- `foldr` (*given a function, a list, and an initial accumulator, fold (reduce) each item into the accumulator from the right*); -- `reverse` (*given a list, return a list with all the original items, but in reversed order*). - -Note, the ordering in which arguments are passed to the fold functions (`foldl`, `foldr`) is significant. diff --git a/cv4/list-ops/.meta/config.json b/cv4/list-ops/.meta/config.json deleted file mode 100644 index dd36a7a..0000000 --- a/cv4/list-ops/.meta/config.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "authors": [ - "wolf99" - ], - "contributors": [ - "patricksjackson", - "rootbeersoup", - "ryanplusplus", - "xihh87" - ], - "files": { - "solution": [ - "list_ops.c", - "list_ops.h" - ], - "test": [ - "test_list_ops.c" - ], - "example": [ - ".meta/example.c", - ".meta/example.h" - ] - }, - "blurb": "Implement basic list operations." -} diff --git a/cv4/list-ops/.meta/example.c b/cv4/list-ops/.meta/example.c deleted file mode 100644 index f2b9e79..0000000 --- a/cv4/list-ops/.meta/example.c +++ /dev/null @@ -1,134 +0,0 @@ -#include "list_ops.h" -#include - -list_t *new_list(size_t length, list_element_t elements[]) -{ - list_t *list = malloc(sizeof(*list) + sizeof(list_element_t) * length); - - if (!list) - return NULL; - - list->length = length; - memcpy(list->elements, elements, sizeof(list_element_t) * length); - - return list; -} - -list_t *append_list(list_t *list1, list_t *list2) -{ - if (!list1 || !list2) - return NULL; - - size_t length = list1->length + list2->length; - list_t *list = malloc(sizeof(*list) + sizeof(list_element_t) * (length)); - - if (!list) - return NULL; - - list->length = length; - if (length) { - memcpy(list->elements, list1->elements, - sizeof(list_element_t) * list1->length); - memcpy(&(list->elements[list1->length]), list2->elements, - sizeof(list_element_t) * list2->length); - } - - return list; -} - -list_t *filter_list(list_t *list, bool (*filter)(list_element_t)) -{ - if (!list || !filter) - return NULL; - - list_t *filtered = - malloc(sizeof(*list) + sizeof(list_element_t) * list->length); - - if (!filtered) - return NULL; - - size_t j = 0; - for (size_t i = 0; i < list->length && j < list->length; ++i) { - if (filter(list->elements[i])) - filtered->elements[j++] = list->elements[i]; - } - filtered->length = j; - - return filtered; -} - -size_t length_list(list_t *list) -{ - if (!list) - return 0; - return list->length; -} - -list_t *map_list(list_t *list, list_element_t (*map)(list_element_t)) -{ - if (!list || !map) - return NULL; - - list_t *mapped = - malloc(sizeof(*list) + sizeof(list_element_t) * list->length); - - if (!mapped) - return NULL; - - mapped->length = list->length; - for (size_t i = 0; i < mapped->length; ++i) - mapped->elements[i] = map(list->elements[i]); - - return mapped; -} - -list_element_t foldl_list(list_t *list, list_element_t initial, - list_element_t (*foldl)(list_element_t, - list_element_t)) -{ - if (!list || !foldl) - return 0; - - for (size_t i = 0; i < list->length; ++i) - initial = foldl(list->elements[i], initial); - - return initial; -} - -list_element_t foldr_list(list_t *list, list_element_t initial, - list_element_t (*foldr)(list_element_t, - list_element_t)) -{ - if (!list || !foldr) - return 0; - - for (size_t i = list->length; i > 0; --i) - initial = foldr(list->elements[i - 1], initial); - - return initial; -} - -list_t *reverse_list(list_t *list) -{ - if (!list) - return NULL; - - list_t *reversed = - malloc(sizeof(*list) + sizeof(list_element_t) * list->length); - - if (!reversed) - return NULL; - - reversed->length = list->length; - for (size_t i = 0, j = reversed->length - 1; i < reversed->length; - i++, j--) { - reversed->elements[i] = list->elements[j]; - } - - return reversed; -} - -void delete_list(list_t *list) -{ - free(list); -} diff --git a/cv4/list-ops/.meta/example.h b/cv4/list-ops/.meta/example.h deleted file mode 100644 index 14a56d8..0000000 --- a/cv4/list-ops/.meta/example.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef LIST_OPS_H -#define LIST_OPS_H - -#include -#include - -typedef int list_element_t; - -typedef struct { - size_t length; - list_element_t elements[]; -} list_t; - -// constructs a new list -list_t *new_list(size_t length, list_element_t elements[]); - -// append entries to a list and return the new list -list_t *append_list(list_t *list1, list_t *list2); - -// filter list returning only values that satisfy the filter function -list_t *filter_list(list_t *list, bool (*filter)(list_element_t)); - -// returns the length of the list -size_t length_list(list_t *list); - -// return a list of elements whose values equal the list value transformed by -// the mapping function -list_t *map_list(list_t *list, list_element_t (*map)(list_element_t)); - -// folds (reduces) the given list from the left with a function -list_element_t foldl_list(list_t *list, list_element_t initial, - list_element_t (*foldl)(list_element_t, - list_element_t)); - -// folds (reduces) the given list from the right with a function -list_element_t foldr_list(list_t *list, list_element_t initial, - list_element_t (*foldr)(list_element_t, - list_element_t)); - -// reverse the elements of the list -list_t *reverse_list(list_t *list); - -// destroy the entire list -// list will be a dangling pointer after calling this method on it -void delete_list(list_t *list); - -#endif diff --git a/cv4/list-ops/.meta/tests.toml b/cv4/list-ops/.meta/tests.toml deleted file mode 100644 index b182853..0000000 --- a/cv4/list-ops/.meta/tests.toml +++ /dev/null @@ -1,105 +0,0 @@ -# This is an auto-generated file. Regular comments will be removed when this -# file is regenerated. Regenerating will not touch any manually added keys, -# so comments can be added in a "comment" key. - -[485b9452-bf94-40f7-a3db-c3cf4850066a] -description = "empty lists" - -[2c894696-b609-4569-b149-8672134d340a] -description = "list to empty list" - -[e842efed-3bf6-4295-b371-4d67a4fdf19c] -description = "empty list to list" - -[71dcf5eb-73ae-4a0e-b744-a52ee387922f] -description = "non-empty lists" - -[28444355-201b-4af2-a2f6-5550227bde21] -description = "empty list" -include = false - -[331451c1-9573-42a1-9869-2d06e3b389a9] -description = "list of lists" -include = false -comment = "C does not easily allow a single implementation for multiple types (Liskov substitution)" - -[d6ecd72c-197f-40c3-89a4-aa1f45827e09] -description = "list of nested lists" -include = false -comment = "C does not easily allow a single implementation for multiple types (Liskov substitution)" - -[0524fba8-3e0f-4531-ad2b-f7a43da86a16] -description = "empty list" - -[88494bd5-f520-4edb-8631-88e415b62d24] -description = "non-empty list" - -[1cf0b92d-8d96-41d5-9c21-7b3c37cb6aad] -description = "empty list" - -[d7b8d2d9-2d16-44c4-9a19-6e5f237cb71e] -description = "non-empty list" - -[c0bc8962-30e2-4bec-9ae4-668b8ecd75aa] -description = "empty list" - -[11e71a95-e78b-4909-b8e4-60cdcaec0e91] -description = "non-empty list" - -[613b20b7-1873-4070-a3a6-70ae5f50d7cc] -description = "empty list" -include = false - -[e56df3eb-9405-416a-b13a-aabb4c3b5194] -description = "direction independent function applied to non-empty list" -include = false -coment = "reimplemented" - -[d2cf5644-aee1-4dfc-9b88-06896676fe27] -description = "direction dependent function applied to non-empty list" - -[36549237-f765-4a4c-bfd9-5d3a8f7b07d2] -description = "empty list" - -[7a626a3c-03ec-42bc-9840-53f280e13067] -description = "direction independent function applied to non-empty list" - -[d7fcad99-e88e-40e1-a539-4c519681f390] -description = "direction dependent function applied to non-empty list" -include = false -comment = "Prefer integer division test case (d2cf5644-aee1-4dfc-9b88-06896676fe27)" - -[aeb576b9-118e-4a57-a451-db49fac20fdc] -description = "empty list" -include = false -coment = "reimplemented" - -[c4b64e58-313e-4c47-9c68-7764964efb8e] -description = "direction independent function applied to non-empty list" -include = false -coment = "reimplemented" - -[be396a53-c074-4db3-8dd6-f7ed003cce7c] -description = "direction dependent function applied to non-empty list" - -[17214edb-20ba-42fc-bda8-000a5ab525b0] -description = "empty list" - -[e1c64db7-9253-4a3d-a7c4-5273b9e2a1bd] -description = "direction independent function applied to non-empty list" - -[8066003b-f2ff-437e-9103-66e6df474844] -description = "direction dependent function applied to non-empty list" -include = false -comment = "Prefer integer division test case (be396a53-c074-4db3-8dd6-f7ed003cce7c)" - -[94231515-050e-4841-943d-d4488ab4ee30] -description = "empty list" - -[fcc03d1e-42e0-4712-b689-d54ad761f360] -description = "non-empty list" - -[40872990-b5b8-4cb8-9085-d91fc0d05d26] -description = "list of lists is not flattened" -include = false -comment = "C does not easily allow a single implementation for multiple types (Liskov substitution)" diff --git a/cv4/list-ops/.zip b/cv4/list-ops/.zip deleted file mode 100644 index a6a14898871b3286ca9b7f4bb874037aada4548b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34359 zcmeFYQ;;xUv+mipZQHhO+qS#kwr$(}wr$(CZQJfX|8MV!iM{uk`C{h&RK!|Qby3en z#V;$L%*dr64GaPW@UN>&+C<|&ZvL+g5&#Fl#?sk^*51LHUR4DW05~}G*wp5q^~W6= z01)I17ytm|{GUzX9|@FyUV;GFlZ{rN!pECA0t5h91O)&<{;v}M($fD&i_YRd#6a-e zODb1?jnAV;4j)0tH$KPZ66M@-7m-%aO6*|8>=(AKxd)t0xcpoq&G zIICMGWe`v}d7rv5%sV-Ms_r!8kZGoGuEvT%z#OoCAVZKBpu10eXs!h^!F-DPLl~94VPoE3#X<3CuiddjcPH zim>26oYy|QS0t6AdPJQdJ4dP)_6NH#{%G4Qlj zYdOf;QWnE=CgWAQkX=ic%VD(2J4%xy+PDQUWt~`u9jlv*h`KwekUh9p3^3$K;!DeX zxxq+j-G;(P;gajJnfD>PRUx^b9TBS-cE&&Y*g)4=S>EoB5W8bx>t8)N@PKg`CKAfE zY3)9~U?ZWSL&M7XigqM<@|E!l7#E~V+@3_%hG7SP)$HsS-SNA&Qk*JMBxkkO@s2}@ zn#N*QoyY+k9iNIqc8Tc6YL8wBmA`=h1V7#`H~B~@zc?7L4ZH*Hq2UX%((wB*1Lf*|d>DWz6Sf)G zyKQ&6yS3GId?saNUiLIJQ~^HGf?Cny`c;zr`W}}>Ce0fg_GfE$P=2ub3hr`{A!f2; z3utgDeT`gxxKiZG`|n>)#ixFY$?1lUp*1_=%zfw;Fw%q=7fTcA*C8@aDmIIQ6XBDc z4!LKj9N0T#mAPtH@{qu3q3jd|$f@KU#Ck>&;}6iKuDo+gmxPRJXOm>QzVpxqK+e-_ zCbDEQG5rD;FXov)T&(?vxuv22meppZl_f`kqRE)Qq9)TU$HQpY%5wVhYdwBMFDTE( zhOJ5b@V4}mnskY2j!9!I*SCs4pjsP6E!;81qvf1|A0}x2mVJx38UJaOuv>}zWa;1}2&G!_~U#8hvI3W1(X8hA}@Q?cp zG4V`aCzde!3D4rH_{WVl#W|JcdkVgfBni`pTnlTP^Yhnds$VSj~~XH_^&?7dr3l0(GSP#9vX#@6lrBH5<&j=X6*w?lTVZYdE7 zIt#*&DZ8R6m;ANiyRb|8m{oEaPVnV5qQOP%i>&v?*>Gp4!`^_B9?aG?asN)V%EhIS zcI;0R(XwYW4aJ=k;IIM7W2<{1%(>USQX$Cdr?8PXpj zi_=n41p<-g_xZo}fcF*J(#tNIDi# zhtD0$2eci@72)i2%zBpc?^Zm9T!msxsL`|11F;-b8NN#GVGYu$qG^ir`MZWJX z$~3U@ zYn-G4OG^BEASGhGM_hhZM!H>THNooK4)J9Qz3KX5D}Ju5r%rQu%}vYd2lW4*9x?v+ zpOmS)p{;|B>Ho=*|0hTOS5t+NIxgAwPonhu$5>(g@6;IE+nHIK(^)y&+x@%TrWz** zHNb!%`pPRhrgfoo3Cj}{PGTxmXi08Drh#~SBcd&fj+y@I_hX)$qO?JB!_X~}!y=V9KhcxFg zelbr!V~*Svsq+c)G4?Gm;KCJ-QnQx-jAxV?A;o;6)i%8cTJ64+3#qcDk0i81Sg3c}{`&ZU+Kf_`Bk2LX zWMH0T9}=<`Z7i(f46>5y{_3!AZ{KjW%~!ta?j~Lw+qJ?00iNx*4EW`~`>ZASrPC_t zbU$@s4Dpq;4WW*fcivD6_j>^VaOM6E04HNhT~S>IteIm9f0xoUgOM z);NvNHT~nz8S0d(U~*{o4}oizQcEd=9CuLTusfoM9;Nt8%?Wr_X!8PG@hThoJE2}B z3O2CNP_%S?JxXlym#XUPDtIu@V1_fhZdG(MRQcnuiU^uUtF7ZPd{JD&vM|rrC3YxP15aQW~^%K*~yoN_ebsundP%Y=K@(-6SZQ5O#{ASNKN)B zMkQSRE#b@|gesSiXIsi7A2}YQaM~2Yn`EGGG!G3oilsKsRShy*rWTGYqHC`YO{b|8 z#h(T*Jr;MH z0^x_(Z&JUH7GWHu{z> zZ2&&^kJ(Aq`nu*IGm>Zj!04Imly}+=j?8XzF6rzBU_=J;^kI;tw%3Hi)C>7i&VFaO zFSkx`@V0Y=+LVqM&ylF%6apmXhr>sjvj;05ehw%4AfjhftY^0%5m_JR#-TX|mae`| za_n;@m~I^H76Jc-tZw8BLownXGmhA8?Ci)UJK}>vjK<6MVS4Ur{OYhJJ4Ojd|7{Fz z9Z4HU@-7QRCTv_B90$kXxoT>$`Rw_C4sehO8g~Qf`&f*05fn%WAhahi2T$TK@Ul%( zT#~sx2^^_100D@QVChj35*(928o~@f2VE57XZLts*71~CJgss1xgg=Z%K$e#6mFQ# zCm$E|5|Ds=$q8xf?mhL3rLabrkfo_>=Cj!=6tPU>2-RaingitDAjF8r$ zP0j2SOs%qFQHSkoGn6|Q1ULhHl0yX@d6OzV1Vb9cN$quxwImP5ZlMGIB62UCZ$;j_dfi53k zJU@ZH9#L=Y)fq(388%oYWe;R#jqizUN)Mq@$folI`d;0XFFoT#hf_KyvPmS8DJ+wz z)6By-F;8&H2%ZK<@5xVHc=*1P8!FGKu#^N^lRWIr zv_|QIBynkUU)gk#dc_p|$w&+^M2P(mMb!Adk5xO8qbM!POV2n1f1t1$WBIV1A(-86 z1YX65eTd&cx}##P9LN>-xEn?L#(3Il`)pG|Ln>})0ai^BX%cM7R1~ep1983mV|qY&G6MSXeYUsk7qor^#M*!mkDdv#QWjrw?{UZOi8EDNwlX$O&>OA2R(B!ai_6`2BZ z*T6{bMoUe1l|`-JM>1ai;ur?uRa9`%#%cC)nWfBEgg5@(6eE{5->qCGE-(C*KP>O4 zB13KN(Zjl;P>I1U%-TFAS{%}5_ELX*Gtum~OpLOw0vSfpNjkzUHKP4hI!0@#mZ*6X zSzZ8B%1vHKCV%%dgik?QT>8cWXP2xSq1H<9KP)Bpx36r`k>MyxJsKIg9;bqA{Yx~F z6`CRMiruZJC8A~}`|+2lyJ5aIgsTCrS6)-(jgN6n4t6|2TxcMCuSkEi8iyWnOsbJV zkyw>*^MlNdeX*|C@dz180%RdMnC}D@y4AS>;#m015D17cXyj87N{w`rTzZXvto1#_XHzV+nWGQ)^oBLD6BgUBa)zLtprfc*^S|FYh($ z`03`9cepiu#C=oN6e!C&GA}<#hGuJm~(dF}vcub=%~K-F;MdV6rDyLn4>kxSV29T-UgYH; zF0r*W9VZ``WVXGv=lAC)QTl7L?%3J+DyNSnO#aga=2-n={QMTa#eq-pJ`AUW zCt9W)wrdUiBeVur;edaRz(H)O$Bi-r-1kUa-Wf}X`wioRBy*uO z2LRJFE*HZbt&c5VINxp6?!^z^#lJOZM)&unhQF0;ZnciqyS z_iaXkOsWB`7Ka$Wf(!n4!^)SH`V*$X-Y9E$(^i?P{VGjuZ zuwuss_TqZ7pYscF;VxowuYZ^bq71#@O}8HgSbq$YlWU%_(`x&vLSqDsVXZk5CyVe&8t}w>Har{HhtY_+ z65u52yGQo**Mp555qRD-=h0dt=P+jzZdNEm1F^XTlz$6)4JNbyN{=<6)MUWZTmu*w z1Hh4gGSK`RN0?}AERz5LNCN(3fT#JX3`SsJ+;M(aj1xzULSNmEG85n@-o6w^bGMU# z_GG|-7H$ndJu=IWmmziu0>J>0z&)`L9cb0HxS0i{XD)s%m<jDVCfD$`9`}K zU}*`;iL8A#G)NEUS``lT*$@nLeF5^>kHEMU!nG@(k85WU#_1zO&%D8jyTP4Q!$rSq z&V0({rXqh`4hEAk>ZjP6_&^Vtv|0iwWZ=#c{2YhbDkNNHn2aO!g7(zu9ecZrkjskr zFf|QKpTmT<@gblFwE|;}`f-8&2ed_6FPOtw7b=La%USSVSz6fdg=s(<;-KGigXgUX z*-mm@f8B`>L-jL2x0SC{|Mh~yz8InBPDizHVc$-wvLYZjZjGn_sse;~k1k{~1PDqI zLNbh^6YQdCAv~ULZT1GBp15uJ#h;d3$atKk`F!18%f30&KbZb_S^hvEuy^%98Wj8c zb~8FByxJz{$E-&0P-Y#%55V&34s3}tM49wNPOw_%1L|jW2MFn48kqEFAoGrs_yd_t zAsCpcD40J74Xolin84SB2j2dK^#*kC-3d9-f1xc@Br$rVPX^1IpCd?R4IscGj)9RZ zOm2h_eCI*snra|wrm9dSV50-S8OW-yfC!wR3U2PHqrUEd_vv@C6VOLfhcoX5@5ar5 z>gxXtV0kCB@qod-39;a8IAd5_fCm`MGhidq0^vOy3rFW*fZ2303+xR)?7Qyt?jjBz zvp~2;&O0(n;VW}d2^6(JigdvcLC<+uuif0kBeV>(I{RIU*&?W zJ{cDeaBs72`aoyY$;TRR^?K8m*S31eGE$R7?=6#%JQ+B}n}D^zH*iw3789b73hEKo z+=R#l0p2pMWnSFv7yZ-kgQ7wCo#D(E!2f{m`;1EA0|`FzMUDHu`y?z z?g#h1z9!{g*LWCCqh*G`IWv*Ap7C{*J*1a6080|tzCg}k61Ki)WMc~yJX0*iEMi!U z)c2)I_xa1S0AM8)QbEEh$rmvU%*+3yh`|%OipSY-cRhpe^nyeqabb8p8#yGKw`HQn z>#&KY@{1%N|G{MX-gu`3^hmn03OnT#mxhVT^wH9#Z{T?Ejq=IwOQR1nPoY{N|04YfK%-Z0h+6$rFaciQ-t?fv6(b!cH5#l zDjTz_-ByffByXvnPS?Pm-{Sdc*ZtiRppfxA^O@Sf0udK9`LusXeA}C9$S64|=b4H* zoGqXEjaa+VEMRjPJNPCQDnameYY~aE^t+2;JA)x%YOxMr+v3$scZD}wtDjvNmcv+eJ2`0+va2H7AlCp&5~6ZO9E^p#^@f7+64;xOM$iF-yl{T{7Zpr=A3*S$%LHdCOwt%2Qh$+{dLwUwEH zhpMSZ;Q4Pj=g68+)X~Ecacab$^cc=MFK!ot3)j4{G4dAi?6KByA`z!Pqc%B|{wuH- z7{BRn2A8?MqiLmRwT)|Z5-c;zBOZTbY=V|B${9B$Wtygh zCPRtSyAU{b7rn3>(~pm8g=x71AWkLaYz0bGMq`+$Xn7UONlVmAd?XC6X*(niuH({^ zMr1XvDNn{?L9d{0m!~|t_7UL@5GxavYII82*Dn0(YL2lENKdeaRSTDh|QnhPax;hLr3F{;=}Tp=n-TWUG3^ z2jF7DJKkp6(hEy!#o1+rMzwalvsJ0^F0$hr@6%T*=gg%)K*yY(CFlxu9(--r1HnKl zI=vstU>!|daqO(-FAkA}fZ-YoKj!Or{n2ZD7A=#2fIO7%jG2Mmc>qCpKKA59EuR+r zAsUeg?}*w#VSEgZ7=$zeY(WA1r2*3r)%p42$^=8j@JpmW>1)F2KwfW6@NKhS{zUNw z{8^oKJ;pMYoyhnHS?4ff`fbE&*ued;8V5nNgOM|?(X7usS6czYphG877V&3|sSdU+ z!)8R*lOh6}AA{onpZo?k0zp5Ik}U}pYs{nA0z4-V2NRj@sec;yvAC8^zPFvKe06{; z|2RlV86htt+r;JwrR+vT4dtlx86y&15Fircr&3k9W;WnX4k3Rhf%O#M?2VHEmg6ps zkh<1P%~+}a9eUOwA`=@Ge3jg^yJgzI#9brb3{?bd+>OY_Z_1AAqQeKt*QK5dUHNb;OIKd(ULg`SnVyMB$++IhsEl0G06;Um(tT{BN<6DGVSqvl zv5e8#nl`G@C*h*a$e~~h$k$nP9?;?M3D&}1kYAHbX#l~65HJ&+L1%d40W>(HxPN=D zp^OD*cGTGA|C+2+5YNd0kr#_5tP$!G1hhg9Yl))}x!W(Ye{mcQh~)5vm!>~z{1(j^ z2H98NhNQqH5x`(NHl0~oucmPnX;eb{hfsQ2@R^3S8b%;?57vE0VwK`2l^ma~M9)ep z@*b;_gvSaz*^AkR2o=pkqCu%1H*6BW0M_IqR>`;D0e0 zNcOPy8TlFT0U-<#jEdM6o(Wvr{}iRK(OU+Cz&RpOb5l(;7Exr#uyBEq{}_x)(VMQTNr*R382)Te9CF0*8VLfi zxD#ZkUABQ5+q`=N54#f!TmD5g$?0yXuq2jp95jAj_m(oF&q|y(-6BYNlNeumFM~dN zpxqW)j~2uhQ8A7eWR3AnkhGd)qLTl3>Q5vgWB;H?*gZat80#=?%c#(zfkPu*IdwTW z1C=+<*OT{Z$-ExP|NXQLvL!KRB7N|-DCM@$Y07Nv9!brh=0>IDlcIe zue;l2|1k>zp%kh|t+K-jzQ_LjQbq{P9^qnm-qGx!Gh6sY%w0Mo4R8g>u4R#w6s+f< z{<^q**o486fuevigMQElu-;nH!C6o?N2SGOz-gn+zwfq0u^tAWoA#Tv^TNPE(Z2pQ z3+eg8!Ub6_^Kb{}YqK619sSPK4NXpE-GCpKXHj!n-cS2{6P`o!>LoZzu5!UIh@wxD%J@Yub4H#Kab9g0}pgD!sc% zyaG$_JQ(PHDo5h+oXVr5?Iz|8(m-zn-)ccpw9uz|YTN9ZHLFUQ!Vr2&^lmVY;S^Jzqq+Qp%qW>p9#L9JtTUBgb6p!> zs$VkJo^EWcP-GB<>9^GcOAHKS(O5lj6CB( zrr~JeGeKQm{0Iq{h0Esi%3jMZZLLOV4`~YJF8!&mp(Fri*r`KW_GcSC_FX5912J;pfVAxb0ktLJ(;r!mGcAG?#I z^vBqVHs69z1D^2#=pOM|Bz5wHBAv^IKOj(V&T6?plTnRqA!&_WE?Ez67*F4JN zIb{DVJFNNxS*yJ{QnEx~f#Z#cVM%5-DsAR6!?sIAzXUsd6C&j>9pHiqe-ZCkr=(nU zkEl?;z$hI-jp9Rb9ds7@9*?MOg~W1$yq-Ws4tYxkHsHxZH@G6Xn8@_U)ONihrXjyThi^9+0bKJ zLffSv$AxRk-&m(!#pJJK3G&P--C3TM%V%&OtIsW_rU)$kJi1_yw01`*gDOa?dv*1T z$a@d^?7m4m7LnOkNNFnN^=a57iwrC0RK_Vp{JHOrIcCNQpZ}Z24b-D|I@riF!AWtCz*nPgDRkTF?RFLdqtay zZ2Tnv?4+>B;(RkhWQ{Wqjwc|s^G|ht2OV_d$!!WsJ>_c7{$vTed;PA9D|C*L@2hXl zZ)YNdl;va5-QKmgH?a4=QXHN+h(jg<>2JCPSNUZ@p1r%axx3HUmaAW-+Z-0NH{fI# zH2|@06F|}?NW-h|NgszpSl=dVFK^s(%d?7^*QyLv^hXZMIY9K`g_9#nq5^U`;yazo`DWo*lexQ>;LTjUoCO^Q(qm<{P;htA>wx)J*YnrKrIdccU-H{r|_rD7L z?<2^guRp>kHv-;IILy5#MB8HC`yOkH$`8ovDV;tVU3u5}4tHV9E8Plw(Y7#u(2j*m z+oY+y4<^;^2Ct4uBa9VDC-Tm-0gkU5FZB-@GhAZwxh>7g|=26<)$ z^BChd+*&>Xm7#u&0`cHDsNF}H)r^zXc|=Hca;74%PdLfywYxV#Z7=%AKJ=qBJhSFHuHP*>Dz>!zU9R8(Q|6B_= z7SBk!#$|~7O37@hq=3C+0G$vdwF|JPp-{E}80)uv!ZvM}h0Z!EKTEK%Bi%_B>4oW!3 zZ&0s+i0+Yb0wK<4a`*u?=Ja^SEe}BRnx?j|qy$!Em36nR&J%Xp)YuCBM>xx63gipT z$R{e20O+H7TX;20(C%z~rsvT?e`?3G#lHI(u8LZ;WoFMaMxL^5q*8VE&%2em-vJkq zn90~Ldv>JJUTX=r$)j2V`zH>yihVjIPA3Z1H}9`<_z?TG^(#r$2)p zLZp=GK=C;G^Ds*_Y}=igy6x9&beY{|rQPyPW(TEez(w$AvrD}W=^9q$^Yj=Jj{SFx z%D5=To&E84*ZDG{{9fFxHvN_oa?rLG&2vL^#>_((8aD8a-BLBA>#@Zv(aTrgU{<$A zhemTt*`nX;tnSulg1Jy%l`A8Rd=2}ys|23EAetJgdf?x7-RtscXJs7wpg8k=L9Em! zzbX6VmV$%?$l|bvzghC{F=;iF;*C9JlRTco`zZ7PI9rQ=*aE%SBZ(O+Q>xeqKsXQ!e35t)0z{=zX`))kJdo`%q!^*KNVtX(ZYkZG9^IX%ymF{Dnogi{ng)n?l0P;Ulv16A{rf9#L zJM}Luj>P=>exOOh#GI~5+LTU$-jsVAPQ*(s-VHb?7Qn{F)yc9Z)g6gQr$N7;jvORu zvp%DW+Sg%hC2u%zr^6YB2_86q!sr<%UnqRK6-k652|D*>Ob}r*3i*n-i_U&jSnWSf z;B!7te*1vVfNdq$r4?@@7Hsx5P-b>;vY%q_hO$;cE(q(L{L4rT&@BX{fTCZiy4T9a zTAjw>^)giU^s>t_uwCG);BU_FXmrS%?!sD_Su1%&^Se>nFL0mEme~ zJiu0Uruc#yX;1~UnkENsR-0{Ej$>G4-_&;tGsOIxQgg(vO^nMlm4##EYPV9c!}aI{k?^mnsm0LbH56DUytW70 zCrFMhIHEP3B+hYCLmp>r5@y_Y$Zv{pTnKKq&N!$&;A_z^bSp;XbvU`Z3cZjG7~?l9 zKgYW}{K(E+xTW8>%8oOZ6Bv>6D!Yk#ooK5CJY!@xV!gFyuPmA&dYE>tC|7u{rHkIn z>@91ItnDbW#IF$yE7LO7tliS@$fVqnNxLGDYMSq4lmGK68<$i^pE^*UT({hHh~Oa! z=tf9$78?4i$}4SdHq;4X2Lb>V8H$HhMGDqoN;0B*CP$fYc&J+2(ZDOe9?%-HVdmxueu8D3eyC+pf_Uf*IM+9n|JRnB^ZjHB-sbLU|y$94wi?i zglKSiCA|w+R@Deb2Y5;ip>Epw9*~dr4iM7Z=tVq^XW}kB@!oX^#T9aFx3CpKE*AC- z|C3~6XU2%xN;qRJvh0xa&(; z%MQV_&w*iclV53UVmESeNRy^H8yAUITZOy$!zOWP! zIPZc7zQHB8Nx0`-E=BCp0|lEFk(uN7?M}@tuA;)N;8|Q$;N{juPJ2V)BkCe0y*`~0 z8z-aQ-Z#{{mO)>;u2sA8pJ|BIgRYywDM zR2wBUL*UUpqDv|xqXlYgvl93Wuyvygs0l><`6_2}JCoK{euWIR5S77upVEEV?4@`n zst*Mf6b>Qej?9`paizU>3mx#VHRA&z6Uq&1$$^_H@rpqnjW@Quuba8TwLw;2CBP>{| zv}lDdK~!p@%(A3{@yU^R*4Lt6^ODc+I2R(g+?nTm%k1J0D~F2A`X%czYPKgA;FgHu zoi3ev;N=6#=kX-c-XIwMv_{tOk8GSZB#iy4G@+Joa zR!(US7)PWV^Wxsgw#+CM!LgY*ITTF3u9^AHY44PQkycfcq#QpL5^F`{QbgOda5#3g ze9q`Gn=6%8eoWmRSA{#VgE@dXI34#Hq&)G@8G~PGnUySWC-qzKVpC7am+KuP)jC$Q4ZlLSSh6Cq7sxvNCac5j z>3mnMfpw6{!Vk)oK)ZO68o%;`a(BELpK1RWPb%+oCp993RdrIobvE?8q%eXkWHhMC zS2>D~?)VT^Xcb
TJ-`7(k-Qyl_&_!1N_2^>m(Q)sO`XgKZM&HF z%me8lY%gs)<9mW$ID1@k_pmk@u#?rk6+QMby$lhRpk_QJO7U(nlDJkp-G5GOaL`}{ z0?%aWt6%KRp{aq<*gH5!((ns*RtRAD{d3k`M6swm1mU>bn*&h zCwG^fy*Vwfh*B3PN>G=Y!h4yC{e*7~p4mD9pDJXngw;bK@)}b!s@@+7ALgRM* zI0=}@t9bV;MM2zXxRR^?u*&i*Eh_Sew{kvPGr@e} z7UuGf-atHAa7>}IV0vZh*_ghsR5h&Wkc3WQ5^Lzy%~A1(%Dv|rvwNjN|!_-t4k#)VZvgBT~)z{NVU9 zx3?&JKk!ErWlfFbT3%?BC__2O7g&Zdm`bBzChWY9J62T<5)GyCRm}Kld>1@l$W%Ep zz9>$DdkO+Vbw;6KL*}%=ZZXqqv^fKeCTxPdK)GltV>={YD2n@Gd~iRJkcSR=7kcl@ z4COK}UmFjm9xUDLOb4*3aa^5t3qN%at&RH7V9Oo6Efem+L4YVow8Rg&W&WmCQ z+cGGM%-c@u90|XqB`H!wYiUez+c?+{<1+(75I!3(cP0cLaf!S@!awk}q1}r&%fojD z3^vpnBN!X+`TSRS3r>%3bOXo7Iw>ZGO17}J58Rref=(iC-PZ!_f6TrgTRdsXK!y~6 z&?+W$|IEIMwxO6S_I?$B#xEkUJ?npDgk0kNSObHAl?U3Nxs>J(67DXX1un_6k2-|2JaeS6qnzz3 zVU63G@8UP(YS$g($2p@`skOQNfq&#qW0iiM{U-{&dN$Vyq(hW(e<>n$%q${|%6`OS z<~R}wKb|3F$vG}?@!i0;8x3y_*1EZF`g1rWR5cf*(;l?c-xaN;Cu1*;+b!?!$B&0E zD+hy;kWT?QuJUs8T*7qk3)_akH!H0#D|1kmMD6VeZW$2}o#JKGXfS7nt@z@SOuxB5 zC!^?SPEbrZMtCaTCQ_;(u`7oZ;UA5jt6Z#w(V)|12ejeaohIMWH|8i@a-a z2=Nj*;gLikkk|R+5(qK@Y6gaNk|xOqcGa0UPB4yZWGRleGpR{}bzEH|hx3H=r@W=2 z+-p)1aAo}CeQ0W#RpWErQAr#}>9MYkN3#FodTbcsiBE|%n&=E0a~xxQ4mm=G@lI<= zxn9P*iJ3p=0x+vI=rz7>wI6RYrg!0o?F3>%mi*IyQ}AMXl$8Tj1s8m-P+eK>?;VU2 z*`3|ls0^F6ZBI!ZzqYNPpPr78FTe7xh@SnEdt)$%-$i212&g1F=L_Aymxsv-O97>{ z;fF(B0XlcVy!le$i*wF{-g~3!33DB;=0~LU-5xnm44(nBVSKDj&oW1jbB265lEFE~ zsZu(i(8{6WuKl>zzxpJ|G`6ROLt-pv?Gpbswem?|x^uvp>M?GAhVVAjN}vs+tf8rv zwDsJ%YF8?w0NS{%RUu^`;I)zUjU!8DcrXUa5@U|c6WM`ie4iU>`9-w8Kf{qjFGwk) zeXFgCrXhMhR>PbV(uzM27(Mwl-KHv@yVD?Vbq^{(1$j=jU7yR z0o^HPg4E5u2XJVYFezO@rT`qs&Rvr|mA{FLX-oECX`S>qnLZHJ10O#~%WQ8rFwHU~ zo}Ai-ln_(Uz;4LK)F#))b?-MLyv;oPL~Gjc0FbnAasE$ybaqWXTK40;s(q_+{q|tw z^^b+B&D+9mP13ww>zIY7zh|DE_ygzP>;vX2@pymG_-n*$G)#lm(l>}`bx0PY+aa1H zdXjXI1Ty2uLokl?*h_9h*+hhbi-uslvLVNs{Dg#ICdEIfTuoCYRUU%$NxbHkqnccD zkFsA#lOT=&6Bx~8VD*yWbQn>~+=wsmN?hF7R}6E9ND9Z1G=clY3;^f2+@C1bLqK+kFVphY#puAkq)>e-T8x@SFE@)n^RrFDB5A) zyaQA~8|kUmkEJbQ@B4s2I~Av|UG&0k2QTAb(gd)8lQ#Xu-X3{0lvt9y zmyeVe{B5#0ahND_%V2KKE~!Q*XgYV8+5e6Ow%=T9*7XRee!J9n7+EiRj`#8EEY(E% zOgz9G6m;*U7~Yaz?X>aue&hf5qbQ5|pZfeb006Dpfd3x`AOG$7=j)tb`^}NWKEGG} zdf5QJ^12){Tj%~}UV#=%ZFS8DNu!6rLBagulwtJ9CE{`t-`kyE-^NLLB2uUJgBcD{ zN5BmZG}gzA^_-lH;xeCi-cQ-jS;!#%mfI2eD?XT?kyA!)V_vpn#i<%$^J#wYeeo6; zAy-QJZWuQCg3q={P4gYoTEDmb-5I@JBexsz8DBS{IC1XuKZiKnKSO zJE5PkozC1-u1g81k6XsqHspKI&B)6&UB3yio9s_Se)HD{QnUxsE+p_NY5nltp+wVu zxk5v(>|$oM&H_A0Jn*2imWVXOBf{axe6r#*w5S z3y#jq?^6q!DNkKDLBDjJJLhRobXPxz;`qJ?{v5fK8+||1+8vkm--d7XVk7tGYWI2} zbM+2UcT=`3`z~9OAMSm9BfO8R;p3JQKdoi z^!2IJ_BmM$Z>JDAMoni)A%x$7)6F%HI}We44n1!=5q?nZh}1HGga;=yJ0E-rJkGD( z2tlN|ZWtlL6C@W82S+f19bB8>gjhGal8@3p-MaA6ml9&%tDnR#GO$^_0P{wDyi*eL zR0sI4`DdR1sx8pfdILy)smCu2ouoZ+ZT3(Nxu0CK$j+&lwUG#sBWS}P*KYu^K#=^sFCd5rWAJnwzFVR-okWN5s8ZuDc#`1ZX1{3SSbOQ$0_6sK%koT{8P z)LxH?<^V#5P1hjuEjG$n0+@+h=3)E30OtKF+p$6u5!pcpn5BA`FK)b!$H^q99#A*0u$+Wkb9{LjMx&%ct}%0CU^s@ zH$;&DoUjjxBx5%Cc4TMAA)jN zka5jAo}`H(F2sQ1d-Iv^$ESguqrTVRQDj&E3jMHhBAwPOTuwR4F1H3KKsyFpI$*zZ zK0D#^?3g1Ua3H_|isg&dEcAr1FFUgmBIuMUcT-#V&yU)5>3qWR5doO;*d)vvz9@ zV`!vVCi@xO-G9o(rl;K*jh2&pDt`}}9JfqeY9zciuKR_-MY=*!P2b3$?o>~s-QBp6 z#r3Sb$h7cg3J+b5Q=eZePwnpq1C}nuZeM;Nz!i>e5gq4iP&plpEh&6Gc(LyCJ2V(t z7)F`JV)v{%X*qaK{+zj(#JMsgQqifK(G^quR3{@AHgC8Bs+^91sUtC>fj!Xu^I7Vf zMo|J4nd)(ul`I*WyQpVR^+Lo<$ak;wlPF0)jX}G2?!ucWR16g0Sj;an~2Uytq2Mu4B06*xQ!^2z7*7 zM?f_)&qPg=Qsw`^UFqv<8(VW+zm^#I_)(m=)$${7L?j&Oub^IfN6sA2>S_i@nowTM zSaj+^pJtB>aqDKcQF!MdMB3d?HnB)`0aDLxe1}b$E%V)jXe%X>nL<@%`qOuHJQKgp zqYtPn_yWLnQe`ro!7pYw?8UuV5?f1UASDiwiqy8mb!7@|kYCiI;GO)cofH&FD+KAp z+O$uxHq_0=zJbDYJwn24hvPuPX-D`~i=vX9UT5X`{oI>tqKipJCZ|l0Hl6;N&!IhJ zN~iNewkAq88CMH7_<>rwd}KffajNst5mZb<8M@aeA_&jdLO(ana=`^>%`C%Zt2gQR zUyYpukS0yG_uIB@bK16T+qP}nc2C>3J#8D)m^P+++W2~Qzq@zdyZ7#HMLbVtMpgaK ziHwt38C9A2a~o0xb%zKvPUySb74C*d6*9HaT;jlFt_tOl`|6-V#yR1gU8uabAy<)qJjJZNs3&0qmof?JC4U|YWN>&y zr?4@3n$HAdGEexN{dK{@R7>B)uUP3JCUcBS&xLXq72hK78%`zriG%q7AwPP>9hapq zP)ysu4lD_2CD@MgM=wVWjYJktdGn$w327r=$Q=ED1+ z;XY;C&4ex?h8KM}595{uoNRcah87$UKZ!QWT1iyZk{cxF%o#76Nz1xmSh_++RkUo6 zlb%SNK2LxuZu$p(2e=U}y<-Okwt6?kcX`Zu*@H-)!kQbfWl;7+A%>=z>?Wuj?qvHC zO9M<9)M9!Rlnb(HO0WJZ`q?GnhVuG(L(qwQ0IH+@AEdh1us{kA{-GcNs(!)zQFT+ju;JG!Eep4ZA<3-Pc{Jo8m6m|y1(p-0U-D5V zmocy6I%6f&qkiLH+>r-ynW$G&tEc1eG~4%~N1%2g0V1F!B3A)4=Pt2G%l7qFp)8u` z_aT@yZc|OBXInkYgQT^XE7s#1X{K$bEc=<&o}?B>pkBZ=77`8wlQi?p<~KxBUDhjo zA}}ns6FNcY49k;IZm_yT`b@Puc}%O5QjcJo3rN0t7&fX*HQyh;&Y8083;OC|{VpC# z%};)N0^2N_c%st2iIA#l=t6RHT)~EkkKDpZwcO8!Ni~Ew#9uatrJhr?7CK+ZtTrIk zj?4-7(Qag^3YMzJtdFy53B9n7xSx}1D;XBdNY$r)^GBnc4|iRFx33qBF&BFCN2gv6 zzh8uRuMdnd*UF(-4R>9ZYAQ+bh)CtG#8f*X)&5y!s-2N$Ki-(>VA3;4x^6@|AzI+$%;EElI1e?mrW1Ni}Rwx{F zCz#D5#r+$pJ7G`BaPO zZwlHC#<0xmr9fbFFSKDrFIhb0YyNT}64A5JIMA-%Sc+A9bF9iU9oRS;r;{t`~W3?T_1=?sMG}|B1W}!EoTx%0hgN?>= zX0=^ZK`s)_iNSVV8Y(kLOa3-A6y7CYH%n%!F|-G?P;yiVgrmE@sIBM^ES;4JX$oRv zNk_>KfQHI;fE)ysWzNL<$OfkGh1T z@Up)quk@0%0bm7`iRkhM(2iIqJBw9c>puXY&Sf66s^)JS9D}{gA_ChD8}6X9qBn~j zfU(-l1Ky1qo}jZ4HmenYvEJMbS&eGZD`*8;4_g>UNXwZRnX(D7-motZ7y{d5A{GJ! zMQr{p)+|%zZv|&!V{9Qzq%f#x>-eb!61dh|_C&Lp{+XH&jB$4V6o!Yh4|%GLRfv9h=%v<<1z<$|$5NGMC0U>Wu@F z2hnRgO$ik|L^cvAw}qR6f6@0W zmW>OYZM57)#^^XIL3oP~G2g823GzYyBg;zuPlv->(mjPp(nR z(hQo^^3+epcmF()n>?vuuSEddVphhUix6x+3YK3u{lO22*=143I-mq
BlcC9?8 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

SOvj}(U{6}ZS7zA2)t39Hg0lf@{BVDw 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 TiGN2p0>JWT*DK}!yY&A64`D0v diff --git a/cv4/list_ops.c b/cv4/list_ops.c index a488be1..4bf4a64 100644 --- a/cv4/list_ops.c +++ b/cv4/list_ops.c @@ -39,11 +39,30 @@ list_t *append_list(list_t *list1, list_t *list2) { } // filter list returning only values that satisfy the filter function -list_t *filter_list(list_t *list, bool (*filter)(list_element_t)){ - return NULL; +list_t *filter_list(list_t *list, bool (*filter)(list_element_t)) { + if (list == NULL) return NULL; + + size_t filteredLength = 0; + for (size_t i = 0; i < list->length; ++i) { + if (filter(list->elements[i])) { + ++filteredLength; + } + } + list_t *filtered = malloc(sizeof(list_t) + filteredLength * sizeof(list_element_t)); + if (filtered != NULL) { + filtered->length = filteredLength; + size_t j = 0; + for (size_t i = 0; i < list->length; ++i) { + if (filter(list->elements[i])) { + filtered->elements[j++] = list->elements[i]; + } + } + } + return filtered; } + // returns the length of the list size_t length_list(list_t *list) { return (list != NULL) ? list->length : 0; @@ -64,28 +83,47 @@ list_t *map_list(list_t *list, list_element_t (*map)(list_element_t)) { } // folds (reduces) the given list from the left with a function -list_element_t foldl_list(list_t *list, list_element_t initial, list_element_t (*foldl)(list_element_t, list_element_t)){ - list_element_t accumulator = initial; - - return res; - +list_element_t foldl_list(list_t *list, list_element_t initial, + list_element_t (*foldl)(list_element_t, list_element_t)) { + list_element_t accumulator = initial; + if (list != NULL) { + for (size_t i = 0; i < list->length; ++i) { + accumulator = foldl(list->elements[i], accumulator); + } + } + return accumulator; } // folds (reduces) the given list from the right with a function -list_element_t foldr_list(list_t *list, list_element_t initial,list_element_t (*foldr)(list_element_t, list_element_t)){ - list_element_t res=0; - return res; - +list_element_t foldr_list(list_t *list, list_element_t initial, + list_element_t (*foldr)(list_element_t, list_element_t)) { + list_element_t accumulator = initial; + if (list != NULL) { + for (size_t i = list->length; i > 0; --i) { + accumulator = foldr(list->elements[i - 1], accumulator); + } + } + return accumulator; } // reverse the elements of the list -list_t *reverse_list(list_t *list){ - return NULL; - +list_t *reverse_list(list_t *list) { + if (list == NULL) return NULL; + + list_t *reversedList = new_list(list->length, list->elements); + if (reversedList != NULL) { + for (size_t i = 0; i < list->length / 2; ++i) { + list_element_t temp = reversedList->elements[i]; + reversedList->elements[i] = reversedList->elements[list->length - i - 1]; + reversedList->elements[list->length - i - 1] = temp; + } + } + return reversedList; } + // destroy the entire list // list will be a dangling pointer after calling this method on it -void delete_list(list_t *list){ - -} \ No newline at end of file +void delete_list(list_t *list) { + free(list); +}