From ff659f8685973cbfd0cc76b3b046d5f3749c17fd Mon Sep 17 00:00:00 2001 From: Anton Dolozin Date: Wed, 5 Nov 2025 20:14:10 +0100 Subject: [PATCH] finished commenting everything --- du5/a_station.c | 56 ++++++++++++++++++++++++++++++----- du5/a_station.o | Bin 4440 -> 5696 bytes du5/input.txt | 10 +++++++ du5/input_2.txt | 0 du5/main.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++-- du5/main.o | Bin 6856 -> 8952 bytes du5/station | Bin 35368 -> 35608 bytes 7 files changed, 133 insertions(+), 10 deletions(-) create mode 100644 du5/input.txt create mode 100644 du5/input_2.txt diff --git a/du5/a_station.c b/du5/a_station.c index d17f0ef..d0671fa 100644 --- a/du5/a_station.c +++ b/du5/a_station.c @@ -3,81 +3,117 @@ #include #include +// funkcia pre vytvorenie stanice struct station* create_station(){ + // allokujeme dynamicke v pamati (na heape) pomocou calloc; vsetky byty su inticializovane na 0 + // tak tiez, allokujeme 1 krat struct station* station = (struct station*)calloc(1,sizeof(struct station)); + // double pointer: potrebujeme menit hodnotu; to je pointer na adresu ineho pointeru, a tot - na hodnotu. + // Defaultne referencia je na prvy pointer pol'a. Allokacia 10 krat (makros) station->tracks = (struct car**)calloc(STATION_SIZE, sizeof(struct car*)); station->track_count = STATION_SIZE; return station; } - +/// funkcia pre uvolnenie pamati void destroy_station(struct station* station){ + // Mozeme uvolnit' array jednoducho, pretoze allokovali sme ho ako jeden 'kus' free(station->tracks); + // uvolnenie stanice free(station); } - +// Heshovacia funckica int select_track(struct station* station, const char* target){ + /// Pouzivame unsigned int pretoze cislo nesmie byt' zapornym unsigned int hash = 0; + ///iteracia po prvkoch kluca for (int i = 0; i < strlen(target); i++) + /// Operator << je bitovy posun vl'avo. To iste ako vynasobit' nieco na 2^n. + ///Napriklad <<6 je to iste ako * 2^6 { hash += target[i] + (hash<<6) + (hash<<16) - hash; } + /// Budeme mat' obrovske cislo na e vysledku, aj tak musime pouzit' mod velkos'ti pol'a. + /// Index musi byt' v intervale od 0 do n-1. hash = hash %station->track_count; return hash; } +// Funkica pre vytvorenie noveho nodu v poli alebo zvacsenie capacity void add_target_capacity(struct station* station,const char* target, int capacity){ + // Dostaneme index int res = select_track(station, target); + /// Pomocny pointer pre predchadzajucy struct car* previous = NULL; + // adresa hlavy pre iteraciu. Prvok pod indexom. Vlasne, potrebuejeme vziat' adresu nodu, co robime. struct car** ptr = &station->tracks[res]; + //Berieme hodnotu - adresu pointeru pre iteraciu. struct car* head = *ptr; - +/// Prechadzame po linked listu while(head){ + //Ak destinacia nodu a hl'adane su rovnake, tak zvacsime capacitu nodu a prerusime program. if(strcmp(head->value, target) == 0){ head->capacity += capacity; return; } + /// Prechadzame linked list previous = head; head = head->next; } + // Ak sme vysli z cyklusu, to znamena ze polozka z prislusnym kl'ucom neexistuje a potrebuejeme vytvorit' nod. + + //Vytvorame nod a prerdaime hodnoty struct car* next = (struct car*)calloc(1, sizeof(struct car)); strcpy(next->value, target); next->capacity = capacity; + //Ak posledny nod nie je NULL, ho nasledujucy bude vytvoreny if(previous){ previous->next = next; } + //Inak, zoznam prazdny a pointer pojde na adresu v pamati vytvoreneho else{ *ptr = next; } } - +/// Funkcia na dostanie capacity(hodnoty) kl'uca int get_target_capacity(struct station* station,const char* target){ + /// Index res podl'a kl'uca int res = select_track(station, target); + /// Pointer na jednotlivy linked list struct car** ptr = &station->tracks[res]; + /// Berieme prvy nod v nom pre prechadzanie, cize berieme hodnotu double pointeru; struct car* head = *ptr; + /// pokial' nie jie NULL while (head) + // Ak najdeme v linked liste s prislusnym indexom nod z kl'com hl'adanym, tak vratime hodnotu tho nodu (capacitu) {if(strcmp(head->value, target) == 0){ return head->capacity; } + /// prechadzanie head = head->next; } - + //Inak - nenajsli a vratime 0 return 0; } - +// Funkcia pre pocet vsetkych destinacii int count_targets(struct station* station){ + /// Ak je stanica NULL alebo pole NULL, vratime 0 + /// || - logicky operator OR v C if(station == NULL || station->tracks == NULL){ return 0; } int total = 0; + /// Iteracia po linked listoch pol'a for(int i = 0; itrack_count; i++){ + /// Pomocny pointer pre prechadzanie po jednotliyvych polozkach linked lista struct car* ptr = station->tracks[i]; + /// Incrementujeme pocet ak nie je to NULL, respektive je nejaka destinacia a prechadzame d'alej while(ptr){ total++; ptr = ptr->next; @@ -85,22 +121,28 @@ int count_targets(struct station* station){ } +/// Vratime pocet return total; } - +/// Funkcia pre spocitanie vsetkych capacit (hodnot) int count_capacity(struct station* station){ + // Ak stanica je NULL alebo pole je NULL - vratime 0 if(station == NULL || station->tracks == NULL){ return 0; } int total = 0; + /// Iteracia po linked listoch v pole for(int i = 0; itrack_count; i++){ + /// Pomocny pointer pre prechadzanie struct car* ptr = station->tracks[i]; while(ptr){ + /// Pripocitame capacitu nodu a pojdeme d'alej total += ptr->capacity; ptr = ptr->next; } } + /// Vratime sucet return total; } diff --git a/du5/a_station.o b/du5/a_station.o index 2ae49c96475d15d2e40ca5e7e55018eb6b83f8e2..7984fd31feca5bf3260b173f2f3856466732c153 100644 GIT binary patch literal 5696 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 NJLrkfUiy9Lz~4> #include #include +#include void print_station(struct station* station){ // Vypise celu stanicu @@ -18,6 +19,7 @@ void print_station(struct station* station){ printf("NULL\n"); } printf("<<Y1c0S`x{U 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 literal 6856 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 delta 2743 zcmai0drVVT82|3QEzmM7U;!gaD`Oo#LcqtOQ}DW~%Qj?4w!|%)6?sWOROp-pP0K^A z4kO*E$TBxUmyBka!=VYy5@*I<*(=fzhi+yl{!uovI2SXz$-3{m_gqt%%TD;+@BY5m z`ObIFJ*BHt?DdHqBVxJEdv$%X*#IB_z#aq*vwRB9P>?cURK2&U zS|BbmuP&Y45_SrkSgDvU7}-8?Vag_1^}NJAiA&s5$9@zSiP=VGlro>Xg$_#q+=(b} zxdA3oiilZ=$!35jQC>U%@Fi9fkMG3@8hIR~TZM?HGS$ z($%clV)Mob;0wje;kXnz9EykVZ;?nEg@DKAjR5$tQgg4}F%YMRq+Yva;0Mj#ZS(#C ztW&>QzeVtl0lTWt6i0#mtxpxN0!xiqnf2)c?-!UMWRk<9>2i4dQFlOSte(8_upFpG zJ?W0KS7Mg9P9vLYD)HalvC$tH)OjyTj?0lj7@BGl{Zp;rjRSW{$OM6p2Q35G-Qb7l z{~iK2%r}ZPk7E62B9Y@HvDLm&lN^|8dIEESnyZy^3H~WNc&!*Oi0)uJ`Ncw57TmEx zL2w5>z;X-)#wJBChZ}+IHau=^L>iK?Jp%l4N`U969n`Mzcz3{1J-(cU40Doy#h&0Q z1O8UW4qs1i&IIHBJ!YaC3Et5TxW%ATu#y~H6#R-&B?RW%N){VLz$uaq@ zvI+<&(_qH&csUR!7;3ChQ)@d#Gt#b5XYNo1w2LB~r`Ybnw+Hfs7;IKjQKeE`wZ-ae0T!zqpj}tWewxE>pS8;Br2fd0ejI z($3`uRXzjHbH!#ZE4i%Y(#hpsF59_0#^qaFzH8K0_Wq0nE7n$w*o%l~N$x@mUP{6q zL>t0~cn8skxPbT$fE9Zdvi+W!?4)PTv-PEQ<=|*=*4I|lfx}t7y#mvyLvR3oYU(8< z!Cezb;7-QJL=x)CN_Uo)RXZCY*;!g&RpD%aGzmfpY(sN;#<>~jHJpTx6AAd}GvMPU z>Dus)GO*X0t6U8gwH0MfhqJ!4tOm9^D;k_wL#eZRM;%o0>H7@BLYG)rnA;_c2(!$} zX<9AlM2za?=3W{ndlsS)L4$Y^KBDdA0xN2n?K+I==z2SmQ+;{$_tzKVQ$3BT zs348w>jS5Xw$u8S#;Rq!$m2P8DYa3p_#r8S5>l;N0C7rC&J!F%P6cS3>=fUHph2AC zqwN%bm&d1~o#IvQQUfT#2!e)|KnoyF35MfTTMcqbpmDNOJYLhvAWj8D+bMp6$FD>? z#Vh<}Bosgi%m^C9DS;M1oDu+j_$2TGR1#>MbPtNhLtVc=$EB@vHIk%Mor$2{w_%P;xgm*4A$tSsy~sNA!d3J2SFXhn>t!z#i< z_)m~+v94UzgP>hlZyq>V+kMT~k=cJ;o>zNge{j3)+Gn?&!54fPO_`N1eZb6zw^+05 zj$Z1&vN7T7j4|`joto{hdOol69saqgHK)CJ>9TqKMwS{w-Jl