#include #include #include #include #define PATH "auta.txt" #define EVER ;; #define pravda 1 #define loz 0 typedef struct auta { char kategoria[50]; char spz[8]; char znacka[50]; char predajca[100]; double cena; int rok_vyroby; char stav_vozidla[200]; struct auta *next; //ukazatel na dalsi prvok }AUTA; AUTA *secureMalloc() //funkcia na alokovanie jedneho prvku { //struktury AUTA *auta; auta = (AUTA *)malloc(sizeof(AUTA)); if (auta == NULL) { printf("Nepodarilo sa alokovat.\n"); return; } return auta; } void garbageCollector(AUTA *auta) //samostatna funkcia na vymaz { //vsetkych zaznamov ulozenych v AUTA *a; //pamati if(auta==NULL) { return; //ak tam neni nic, nerobi nic } do { a = auta; auta = auta->next; free(a); } while(auta!=NULL); } char *tolow(char *a ) //funkcia na prehodenie pismen { //aby to bolo case insensitive int index,dlzka; //vo funkcii z dlzka=strlen(a); for (index = 0; index < dlzka; index++) { a[index] = tolower(a[index]); } return a; } void nacitaj(AUTA **auta) { FILE *fp = NULL; AUTA *p_akt, *p_new, *p_first; int intBuf; double doubleBuf; char charBuf[200], dolar = '\0'; char c; int zaznamy = 0; garbageCollector(*auta); //vymaze vsetky struktury, AK su nejake if ((fp = fopen(PATH, "r")) == NULL) { printf("Zaznamy neboli nacitane\n"); return; } while((c=getc(fp))!= EOF) //cyklus spocita pocet zaznamov v subore { ungetc(c,fp); if (c=getc(fp)=='*') //dolarom sa zacne zaznam, cize kolko { //dolarov, tolko zaznamov zaznamy++; } } p_first = secureMalloc(); //alokujeme prvy prvok p_akt = p_first; rewind(fp); for(intBuf = 0; intBuf < zaznamy; intBuf++) { if (intBuf>0) { p_new = secureMalloc(); //alokujeme novy prvok, samozrejme, prvy prvok sa p_akt->next = p_new; //nam alokoval pred forom p_akt=p_new; } fscanf(fp, "%c\n", &dolar); //toten dolar nacitam fgets(p_akt->kategoria, 50, fp); fscanf(fp, "%s\n", &p_akt->spz); fgets(p_akt->znacka, 50, fp); fgets(p_akt->predajca, 50, fp); fscanf(fp, "%lf\n", &p_akt->cena); fscanf(fp, "%d\n", &p_akt->rok_vyroby); fgets(p_akt->stav_vozidla, 200, fp); } p_akt -> next = NULL; //nastavenie poslednej struktury na NULL printf("Nacitalo sa %d zaznamov\n", zaznamy); if (fclose(fp) == EOF) { //printf("Subor sa neuzavrel\n"); } *auta = p_first; //vratime toten ukazovatel na prvu strukturu, odkial } //vieme, ze kde sa zoznam zacina void vypis(AUTA *auta) { AUTA *p_akt; //no comment, obycajny vypis int index = 1; p_akt = auta; if (p_akt == NULL) { return; //ak je zoznam prazdny, nic sa nestane } while (p_akt != NULL) //postupuje, dokym nenarazi na koniec, cize NULL { printf("%d.\n",index++); printf("kategoria: %s",p_akt->kategoria); printf("spz: %s\n",p_akt->spz); printf("znacka: %s",p_akt->znacka); printf("predajca: %s",p_akt->predajca); printf("cena: %.2lf\n",p_akt->cena); printf("rok_vyroby: %d\n",p_akt->rok_vyroby); printf("stav_vozidla: %s",p_akt->stav_vozidla); p_akt = p_akt->next; } printf("\n"); } AUTA *pridaj(AUTA *auta) { int pos, iter, count = 2; AUTA *p_load = NULL, *p_akt, *p_temp; p_akt = auta; p_load = secureMalloc(); //naalokujeme si tu struct ktory nacitam scanf("%d",&pos); getchar(); fgets(p_load->kategoria, 50, stdin); //stdinom presmerujem vstup fgets(p_load->spz, 25, stdin); p_load->spz[7] = '\0'; fgets(p_load->znacka, 50, stdin); //z konzoly, cize toto je fgets(p_load->predajca, 100, stdin); //ako key obyc gets scanf("%lf",&p_load->cena); scanf("%d",&p_load->rok_vyroby); getchar(); //getchar kvoli scanfom fgets(p_load->stav_vozidla, 200, stdin);//aby to neskakalo cez fgets p_load->next = NULL; if (auta == NULL) { p_load->next = NULL; //ked neexistoval ziadny prvok, tak sa to ulozi na prve miesto, logicky auta = p_load; } else { if(pos==1) { //pridavanie na prve miesto, ak zoznam uz existuje p_load->next=auta; //auta je prvy clen tak do load auta = p_load; //nacitame ten prvy } //a potom prehodime load ako novy prvy prvok else { while (--pos > 1 && p_akt->next != NULL) { p_akt = p_akt->next; //krokujeme do daneho prvku } p_temp = p_akt->next; //vopchatie prvku na dane miesto a nasledne zretazenie p_akt->next = p_load; p_load->next = p_temp; } } return auta; } void vyhladaj(AUTA *auta) { char spz[3]; int cena, jeTam = 0; AUTA *p_akt = auta; scanf("%d %s", &cena, spz); while (p_akt != NULL) //postupuje, dokym nenarazi na koniec, cize NULL { if(spz[0] == p_akt->spz[0] && spz[1] == p_akt->spz[1] && cena >= p_akt->cena) { jeTam = 1; printf("kategoria: %s",p_akt->kategoria); printf("spz: %s\n",p_akt->spz); printf("znacka: %s",p_akt->znacka); printf("predajca: %s",p_akt->predajca); printf("cena: %.2lf\n",p_akt->cena); printf("rok_vyroby: %d\n",p_akt->rok_vyroby); printf("stav_vozidla: %s\n",p_akt->stav_vozidla); } p_akt = p_akt->next; } if(jeTam == 0) { printf("V ponuke nie su hladane auta\n"); } } void odstran_prvok(AUTA **zoznam, AUTA *prvok) { AUTA *pom; if (*zoznam == prvok) { *zoznam = (*zoznam)->next; // odstranenie prvého } else { // nájdenie predchodcu odoberaného prvku pom = *zoznam; while (pom->next != prvok) pom = pom->next; // spojenie predchodcu s nasledovníkom odoberaneho prvku pom->next = prvok->next; } free(prvok); } void zmaz(AUTA *auta) { AUTA *p_akt, *p_temp, *p_prev = NULL; char string[99]; int index = 0; int zaznamy = 0; p_akt = auta; scanf("%s",&string); //tutaj je string, ktora nam predstavuje ihlu v kope sena p_prev = auta; //ono toto je sranda, totiz tu cyklujes tak, ze si uchovavas predosly aj aktualny pointer //cize ak musis mazat daco, tak sa ti vie zretazit spat, na miesto toho co vypadlo if(strstr(tolow(p_akt->kategoria), tolow(string))) //tuto pomocou case sensitive funkcie strstr spravime case { //insensitive funkciu, co nam hlada spendlik v kope hnoja p_temp = p_prev->next; p_prev->next = p_temp->next; p_prev = p_akt = p_akt->next; free(p_temp); zaznamy++; //pocet vymazanych zaznamov } while (p_akt != NULL) { p_prev = p_akt; while (p_prev->next != NULL) { if(strstr(tolow(p_akt->kategoria), tolow(string))) //tuto pomocou case sensitive funkcie strstr spravime case { //insensitive funkciu, co nam hlada spendlik v kope hnoja p_temp = p_prev->next; p_prev->next = p_temp->next; free(p_temp); zaznamy++; //pocet vymazanych zaznamov if(p_prev->next == NULL) { break; } } p_prev = p_prev->next; } p_akt = p_akt->next; } printf ("Vymazalo sa %d zaznamov\n", zaznamy); } void aktualizuj(AUTA *auta) { AUTA *p_akt = auta; char spz[3]; scanf("%s", spz); while(p_akt != NULL) { if(spz[0] == p_akt->spz[0] && spz[1] == p_akt->spz[1]) { fgets(p_akt->kategoria, 50, stdin); //stdinom presmerujem vstup fgets(p_akt->spz, 25, stdin); p_akt->spz[7] = '\0'; fgets(p_akt->znacka, 50, stdin); //z konzoly, cize toto je fgets(p_akt->predajca, 100, stdin); //ako key obyc gets scanf("%lf",&p_akt->cena); scanf("%d",&p_akt->rok_vyroby); getchar(); //getchar kvoli scanfom fgets(p_akt->stav_vozidla, 200, stdin);//aby to neskakalo cez fgets printf("Zaznam sa aktualizoval\n"); return; } p_akt = p_akt->next; } printf("Zaznam sa neaktualizoval\n"); } int main(void) { AUTA *auta = NULL; for (EVER) { char c = getchar(); switch (c) { case 'c': nacitaj(&auta); break; case 'v': vypis(auta); break; case 'p': auta = pridaj(auta); break; case 'z': zmaz(auta); break; case 'a': aktualizuj(auta); break; case 'h': vyhladaj(auta); break; case 'k': garbageCollector(auta); //ku koncu, v lepsich rodinach sa slusi po sebe odpad odpratat exit(0); break; } } return 0; }