Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- typedef struct auta{
- char kategoria[52];
- char spz[9];
- char znacka[52];
- char predajca[102];
- int cena;
- int rok;
- char stav[202];
- struct auta *p_dalsi; // smernik na dalsi zaznam
- }AUTA; // definovanie struktury
- AUTA *nacitaj_zaznam(AUTA *p_prvy, int *poc) //nacitanie do spajaneho zoznamu
- {
- FILE *fr = NULL;
- int c,i;
- AUTA *p_actual = NULL, *cistic=NULL;
- *poc = 0;
- if ((fr = fopen("e:\\auta.txt", "r")) == NULL) { //testovanie otvorenia suboru
- printf("Zaznamy neboli nacitane\n");
- return p_prvy;
- }
- else {
- if (p_prvy != NULL) { // ak bol zaznam vytvoreny, dealokujeme ho postupne
- for (p_actual = p_prvy; p_actual != NULL;) {
- p_prvy = p_actual;
- p_actual = p_actual->p_dalsi;
- free((void*)p_prvy);
- p_prvy = NULL;
- }
- }
- while ((c = getc(fr)) != EOF) { // citame do konca suboru znaky
- if (c == '*')
- (*poc)++; // zistenie poctu zaznamov
- getc(fr); // zjedenie enteru
- if (p_prvy == NULL) { // ak prvy nebol alok, tak ho alokujeme
- p_prvy = (AUTA*)malloc(sizeof(AUTA));
- fgets(p_prvy->kategoria, 52, fr); // nacitanie do prveho zaznamu
- fgets(p_prvy->spz, 9, fr);
- fgets(p_prvy->znacka, 52, fr);
- fgets(p_prvy->predajca, 102, fr);
- fscanf(fr, "%d\n", &p_prvy->cena);
- fscanf(fr, "%d\n", &p_prvy->rok);
- fgets(p_prvy->stav, 202, fr);
- p_actual = p_prvy; // nastavenie aktualneho na prvy
- }
- else if (c!='\n') { // podmnienka pre posledny znak v subore teda enter , inak by cyklus zbehol este raz a to nechceme ak mame vsetky zaznamy
- p_actual->p_dalsi = (AUTA *)malloc(sizeof(AUTA)); // alokujeme si nasledujuci
- p_actual = p_actual->p_dalsi; // nastavime aktualny na nasledujuci
- fgets(p_actual->kategoria, 52, fr); // nacitanie dalsieho zaznamu a dookola pokial nemame vsetky
- fgets(p_actual->spz, 9, fr);
- fgets(p_actual->znacka, 52, fr);
- fgets(p_actual->predajca, 102, fr);
- fscanf(fr, "%d\n", &p_actual->cena);
- fscanf(fr, "%d\n", &p_actual->rok);
- fgets(p_actual->stav, 202, fr);
- p_actual->p_dalsi = NULL; // nasledujuci nastavujeme vzdy na null
- }
- }
- printf("Nacitalo sa %d zaznamov\n", *poc); // vypis poctu zaznamov
- if (fr != NULL) // ak bol subor otvoreny, zatvarame
- fclose(fr);
- return p_prvy; // vratime zaciatok spajaneho zoznamu
- }
- }
- void vypis(AUTA *p_prvy, int poc) //funkcia vypis
- {
- int i;
- AUTA *p_actual = NULL;
- if (p_prvy != NULL) { // ak bol zoznam vytvoreny
- for (i = 0; i < poc; i++) { // cyklus do pocet zaznamov, vypisuje jednotlive polozky zaznamu
- if (i == 0) { // ak prvy prvok sp zoznamu
- printf("%d.\n", i + 1); // poradie
- printf("kategoria: %s", p_prvy->kategoria);
- printf("SPZ: %s", p_prvy->spz);
- printf("znacka: %s", p_prvy->znacka);
- printf("predajca: %s", p_prvy->predajca);
- printf("cena: %d\n", p_prvy->cena);
- printf("rok_vyroby: %d\n", p_prvy->rok);
- printf("stav_vozidla: %s", p_prvy->stav);
- p_actual = p_prvy;
- }
- else { // ak nasledujuce zaznamy
- p_actual = p_actual->p_dalsi; // posun na nasledujuci
- printf("%d.\n", i + 1); // vypis jedntl poloziek postupne
- printf("kategoria: %s", p_actual->kategoria);
- printf("SPZ: %s", p_actual->spz);
- printf("znacka: %s", p_actual->znacka);
- printf("predajca: %s", p_actual->predajca);
- printf("cena: %d\n", p_actual->cena);
- printf("rok_vyroby: %d\n", p_actual->rok);
- printf("stav_vozidla: %s", p_actual->stav);
- }
- }
- }
- }
- AUTA *pridaj(AUTA *p_prvy, int *poc) // pridanie zaznamu
- {
- int cislo, i;
- AUTA *p_novy = NULL;
- AUTA *p_actual = NULL, *p_pom=NULL;
- scanf(" %d", &cislo); // nacitanie na kt poziciu chceme pridat
- getchar();
- p_novy = (AUTA *)malloc(sizeof(AUTA)); // alok pre novy zaznam
- fgets(p_novy->kategoria, 52, stdin); // nacitanie poloziek
- fgets(p_novy->spz, 9, stdin);
- fgets(p_novy->znacka, 52, stdin);
- fgets(p_novy->predajca, 102, stdin);
- scanf("%d\n", &p_novy->cena);
- scanf("%d\n", &p_novy->rok);
- fgets(p_novy->stav, 202, stdin);
- if (p_prvy == NULL) { // ak zoznam este nebol vytvoreny, novy zaznam pridame na zaciatok zoznamu
- p_prvy = p_novy;
- p_prvy->p_dalsi = NULL;
- *poc = 1; // pocet zaznamov v zozname je 1
- }
- else { // ak bol zoznam vytvoreny uz
- if (cislo <= (*poc)) { // ak je pozicia mensia rovna
- if (cislo != 1) { // a lisi sa od 1
- p_actual = p_prvy;
- for (i = 1; i <= (*poc); i++) {
- if (i > 1) // posuvame sa ak cyklus uz raz zbehol, koli tomu aby sme prip mohli pridavat na 2 poz v zozname
- p_actual = p_actual->p_dalsi; // posun na dalsi
- if (i + 1 == cislo) // ak sa nasledujuci prvok nachadza na pozicii na kt chceme pridavat
- {
- p_pom = p_actual->p_dalsi; // dalsi prvok si uchovame
- p_actual->p_dalsi = p_novy;// na jeho poziciu dame dalsi
- p_novy->p_dalsi = p_pom; // dalsi prvok posuvame o poz dalej v zozname o 1
- }
- }
- }
- else { // ak pridavame na zaciatok zoznamu
- p_novy->p_dalsi = p_prvy; // prvy posunieme na 2. poziciu
- p_prvy = p_novy; // zaciatku zoznamu priradime novy
- }
- }
- else { // ak je zadana pozicia vyssia ako pocet prvkov v zozname
- p_actual = p_prvy; // nast aktual na prvy
- for (i = 0; i < (*poc); i++) {
- if (p_actual->p_dalsi == NULL) { // ak je dalsi zaznam prazdny tzv sme na poslednom
- p_actual->p_dalsi = p_novy; // tak na posl poziciu pridame novy
- p_novy->p_dalsi = NULL;
- break; // ukoncenie slucky po uspesnom pridani
- }
- else // ak niesme na posl prvku zoznamu, posuvame sa o jeden dalej
- p_actual = p_actual->p_dalsi;
- }
- }
- (*poc)++; // pocet zaznamov v zozname sa zvysi o 1
- }
- return p_prvy; // vratime zaciatok/prvy prvok zoznamu
- }
- AUTA *zmaz(AUTA *p_prvy, int *poc)
- {
- AUTA *p_actual = NULL, *p_pom = NULL, *vymaz = NULL;
- char katfind[52], pomkat[52];
- int i, j, maz = 0, pom = 0, pocet = 0;
- scanf(" %s", katfind); // nacitame retazec
- if (p_prvy != NULL) {
- for (i = 0; i < strlen(katfind); i++) // vsetky pismena na male
- katfind[i] = tolower(katfind[i]);
- p_actual = p_prvy; // inicial pomoc premennych
- pocet = *poc;
- p_pom = p_actual;
- for (i = 0; i < pocet; i++) {
- if (p_actual != NULL) {
- strcpy(pomkat, p_actual->kategoria); // pomocny string obsahuje kategoriu aktualnu
- for (j = 0; j < strlen(pomkat) - 2; j++)
- pomkat[j] = tolower(pomkat[j]); // nastavime pomocny string na male pismena
- if ((strstr(pomkat, katfind)) != NULL) { // ak mame nacitany podretazec v retazci kategorie
- vymaz = p_actual; //ulozime si zoznam na vymazanie
- maz++; // nech vieme kolko sme vymazali
- (*poc)--; // pocet sa zmensi
- if (p_prvy == vymaz) p_prvy = p_prvy->p_dalsi; // ak prvy mazeme posuvame sa na druhy, prvy sa vymaze, druhy bude prvy
- else { // inak do pomocnej si dame zaciatok
- p_pom = p_prvy;
- while (p_pom->p_dalsi != vymaz) // zistime kedy nasledujuci prvok budeme mazat
- p_pom = p_pom->p_dalsi;
- p_pom->p_dalsi = vymaz->p_dalsi; // spojime prvok pred a prvok za ... aktualny mazeme
- }
- p_actual = p_actual->p_dalsi; // posun na dalsi prvok
- free((void*)vymaz); // mazanie zoznamu
- vymaz = NULL;
- pom = 1; // aby sme vedeli ci sa mazalo
- }
- if (!pom) // ak sa nemazalo, posuvame sa
- p_actual = p_actual->p_dalsi;
- pom = 0;
- }
- }
- }
- printf("Vymazalo sa %d zaznamov\n", maz);
- return p_prvy; // vratime zaciatok zoznamu
- }
- void hladaj(AUTA *p_prvy, int poc)
- {
- char okres[4];
- int hcena, cena = 0 , i, poci = 0;
- AUTA *p_actual;
- if (p_prvy != NULL) {
- scanf(" %d", &hcena);
- scanf(" %s", okres);
- p_actual = p_prvy;
- for (i = 0; i < poc; i++) {
- cena = p_actual->cena;
- if ((cena <= hcena) && ((p_actual->spz[0] == okres[0]) && (p_actual->spz[1] == okres[1]))) { // ak je hladana cena vacsia rovna a sucasne okresy sa rovnaju
- poci++; // pocitadlo na vypis poradia ... vypis jednotl prvkov zaznamu kt vyhovuje poziadavkam
- printf("%d.\n", poci);
- printf("kategoria: %s", p_actual->kategoria);
- printf("SPZ: %s", p_actual->spz);
- printf("znacka: %s", p_actual->znacka);
- printf("predajca: %s", p_actual->predajca);
- printf("cena: %d\n", p_actual->cena);
- printf("rok_vyroby: %d\n", p_actual->rok);
- printf("stav_vozidla: %s", p_actual->stav);
- }
- if (p_actual->p_dalsi != NULL) // posun na dalsi pokial sa je kde posuvat
- p_actual = p_actual->p_dalsi;
- }
- if (!poci) // ak sa neinkrementovalo
- printf("V ponuke nie su hladane auta\n");
- }
- }
- void aktualizuj(AUTA *p_prvy, int poc)
- {
- char udspz[9];
- int i, update = 0;
- AUTA *p_actual = NULL;
- char kategoria[52];
- char spz[9];
- char znacka[52];
- char predajca[102];
- int cena;
- int rok;
- char stav[202];
- scanf(" %s\n", udspz); // citanie spz na porovnavanie + nacitanie novych poloziek pre aktualiz
- fgets(kategoria, 52, stdin);
- fgets(spz, 9, stdin);
- fgets(znacka, 52, stdin);
- fgets(predajca, 102, stdin);
- scanf("%d\n", &cena);
- scanf("%d\n", &rok);
- fgets(stav, 202, stdin);
- udspz[7] = '\n'; // nast posl znaku retazca na enter aby sme mohli porovnat
- udspz[8] = '\0';
- if (p_prvy != NULL) { // ak zoznam existuje
- p_actual = p_prvy;
- for (i = 0; i < poc; i++) {
- if ((strcmp(p_actual->spz, udspz)) == 0) { // ak sa spz rovnaju, aktualizujeme
- strcpy(p_actual->kategoria, kategoria);
- strcpy(p_actual->spz, spz);
- strcpy(p_actual->znacka, znacka);
- strcpy(p_actual->predajca, predajca);
- p_actual->cena = cena;
- p_actual->rok = rok;
- strcpy(p_actual->stav, stav);
- update = 1; // nech vieme ci sa aktualizovalo
- }
- if (p_actual->p_dalsi != NULL)
- p_actual = p_actual->p_dalsi; // posun dalej ak je mozny
- }
- if (!update)
- printf("Zaznam sa neaktualizoval\n");
- else
- printf("Zaznam sa aktualizoval\n");
- return p_prvy;
- }
- }
- int main()
- {
- AUTA *p_prvy = NULL, *p_actual=NULL;
- int c, poc=0, i;
- while ((c = getchar()) != 'k') { // ak nestlacime k
- switch (c)
- {
- case 'c': p_prvy = nacitaj_zaznam(p_prvy, &poc); break;
- case 'v': vypis(p_prvy, poc); break;
- case 'p': p_prvy = pridaj(p_prvy, &poc); break;
- case 'z': p_prvy = zmaz(p_prvy, &poc); break;
- case 'h': hladaj(p_prvy, poc); break;
- case 'a': aktualizuj(p_prvy, poc); break;
- default:
- break;
- }
- }
- if (p_prvy != NULL) { // ak zoznam existuje a nebol uvolneny ... postupne uvolnime
- for (p_actual = p_prvy; p_actual != NULL;) {
- p_prvy = p_actual;
- p_actual = p_actual->p_dalsi;
- free((void*)p_prvy);
- p_prvy = NULL;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement