commenting everything

This commit is contained in:
Anton Dolozin 2025-10-13 20:23:10 +02:00
parent 23045930b6
commit a5e349deb4

View File

@ -5,32 +5,42 @@
#include <ctype.h> #include <ctype.h>
#include <locale.h> #include <locale.h>
#define BRACKETS_NUM 100 #define BRACKETS_NUM 100
// struktura pre spojkovany zoznam
typedef struct Node{ typedef struct Node{
char data; char data;
struct Node* next; struct Node* next;
} LinkedNode; } LinkedNode;
// funkcia na vytrovorenie
LinkedNode* createNode(char data){ LinkedNode* createNode(char data){
//dynamicke allokujeme node v pamati pomocou mallalocu. Allokujeme v heape; rozdiel medzi mallocom a callacom v tom, ze ne bity neinitializovane
LinkedNode* node = (LinkedNode*)malloc(sizeof(LinkedNode)); LinkedNode* node = (LinkedNode*)malloc(sizeof(LinkedNode));
//pridame nejaky char informacii v node spojkovaneho zoznamu
node->data = data; node->data = data;
// pointer na nasledujuci node je null, cize nic
node->next = NULL; node->next = NULL;
// vratime node
return node; return node;
} }
// pracujeme s refenciou na referenciu, pretoze mozet potrebovat zmenit hodnotu referencii
/// funkcia pre pridanie nodu na konied;
void push(LinkedNode** head, char data){ void push(LinkedNode** head, char data){
// ked' hodnota prveho nodu je NULL, vytvorime novy nod, pridame prvemu ho ako hodnotu a zrusime program
if(*head == NULL){ if(*head == NULL){
LinkedNode* node = createNode(data); LinkedNode* node = createNode(data);
*head = node; *head = node;
return; return;
} }
//ideme na koniec spojkovaneho zoznamu pomocou while; pomocou * berieme hodnotu
LinkedNode* cur = *head; LinkedNode* cur = *head;
while(cur->next){ while(cur->next){
cur = cur->next; cur = cur->next;
} }
// u posledneho nodu pridame novy pomocou funckcii
cur->next = createNode(data); cur->next = createNode(data);
} }
// funkcia pre porovnanie zatvoriek;
bool compare(char data1, char data2){ bool compare(char data1, char data2){
if(data1 == '(' && data2 == ')'){ if(data1 == '(' && data2 == ')'){
return true; return true;
@ -46,41 +56,58 @@ bool compare(char data1, char data2){
} }
return false; return false;
} }
// funkcia pre dostavanie hodnoty char nodu od konca; pracujeme z spjkovanym zoznamom ako keby zo stackom
char pop(LinkedNode** head){ char pop(LinkedNode** head){
// mame pointer na predchadzajuci nod ako NULL na zaciatku a pointer na prvy nod
LinkedNode* prev = NULL; LinkedNode* prev = NULL;
LinkedNode* ptr = *head; LinkedNode* ptr = *head;
// pokial refencia v pamati an nasledujuci nie je NULL - ideme na koniec; pri tom, ukladajeme informaciou o predchadzajuecem v prev
while (ptr->next) while (ptr->next)
{ prev = ptr; { prev = ptr;
ptr = ptr->next; ptr = ptr->next;
} }
// informacia v poslednem node
char res = ptr->data; char res = ptr->data;
if(prev){ if(prev){
// ak v spajkovanom zozname ne len prvy nod, tak vynulujeme poslednej
prev->next = NULL;} prev->next = NULL;}
else{ else{
//inak v zozname len hlava - vynulujeme ju
*head = NULL; *head = NULL;
} }
// potrebujeme vyvolnyt pointer aby nebolo nejaky memory leak
free(ptr); free(ptr);
// vratim hodnotu posledneho nodu
return res; return res;
} }
// funkcia pre nacitanie vstupu; ma ako parameter
void read_input(LinkedNode** head){ void read_input(LinkedNode** head){
// buffer pre nacitnie zo standartneho vstupu
char buff[BRACKETS_NUM]; char buff[BRACKETS_NUM];
fgets(buff, 100, stdin); /// nacitujeme zo standartneho vstupu
fgets(buff, BRACKETS_NUM, stdin);
// index pre iterovanie
int i =0; int i =0;
// pokial nacitane nie je null
while (buff[i]) while (buff[i])
{ { //mozeme kludne ignorovat' vsetky symboly, ktory nie su zatvorky
// ked' je to otvoraca zatvorka - pridame ju do zasobniku
if(buff[i] == '[' || buff[i] == '<' || buff[i] == '{' || buff[i] == '('){ if(buff[i] == '[' || buff[i] == '<' || buff[i] == '{' || buff[i] == '('){
push(head, buff[i]);} push(head, buff[i]);}
// ked' je to zatvoraca zatvvorka tak, porovnajeme ju pomocou funkcii ak nieco v zsaobniku je
if(buff[i] == '>' || buff[i] == '}' || buff[i] == ']' || buff[i] == ')'){ if(buff[i] == '>' || buff[i] == '}' || buff[i] == ']' || buff[i] == ')'){
// ak prvy nod je NULL, tak "stack" je przadny; nemozeme urobit' nic a vypiseme chybovu hlasku, zrusim program
if(*head == NULL){ if(*head == NULL){
printf("Read: %sUnexpected closing bracket %c in %d\n", buff, buff[i], i); printf("Read: %sUnexpected closing bracket %c in %d\n", buff, buff[i], i);
return; return;
} }
//dostaneme otvorku zo stacku
char popped = pop(head); char popped = pop(head);
// ak nie je to spravny typ, tak vypiseme chybovu hlasku podl'a podmienok: aky symbol nie je sprany, kde a co ocakovame
if (!compare(popped, buff[i])) if (!compare(popped, buff[i]))
{ {
if (popped == '[' && buff[i] == '>') if (popped == '[' && buff[i] == '>')
@ -192,11 +219,15 @@ void read_input(LinkedNode** head){
} }
// ak prvy node, hlava, nie je NULL, tak to zmanema ze nejaka otrvoraca uz nenasla zatvoracu zatvorku
if(*head != NULL){ if(*head != NULL){
// vypiseme chybovu hlasku, a ptom zaciname dostavat' hodnotu od konca
printf("Read: %sMissing closing brackets: ", buff); printf("Read: %sMissing closing brackets: ", buff);
LinkedNode* ptr = *head; LinkedNode* ptr = *head;
// pokial v "stacku" nieco je
while(ptr){ while(ptr){
char popped = pop(&ptr); char popped = pop(&ptr);
// v zavislosti od typu zatvorky pridame prislusnu zatvoracu zatvorku d chybovu hlasku do standartneho vystupu pomocou putchar
if(popped == '['){ if(popped == '['){
putchar(']'); putchar(']');
@ -216,11 +247,13 @@ if(*head != NULL){
putchar('\n'); putchar('\n');
return; return;
} }
/// ak vsetko je spravne - vypiseme to
printf("Read: %sAll brackets OK\n", buff); printf("Read: %sAll brackets OK\n", buff);
} }
int main(void){ int main(void){
// zaciname od nuly, "stack" je prazdny na zaciatku
LinkedNode* head = NULL; LinkedNode* head = NULL;
read_input(&head); read_input(&head);