Advertisement
Guest User

Untitled

a guest
Jul 28th, 2015
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.55 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. typedef struct auta{
  7.     char kategoria[52];
  8.     char spz[9];
  9.     char znacka[52];
  10.     char predajca[102];
  11.     int cena;
  12.     int rok;
  13.     char stav[202];
  14.     struct auta *p_dalsi; // smernik na dalsi zaznam
  15. }AUTA; // definovanie struktury
  16.  
  17. AUTA *nacitaj_zaznam(AUTA *p_prvy, int *poc) //nacitanie do spajaneho zoznamu
  18. {
  19.     FILE *fr = NULL;
  20.     int c,i;
  21.     AUTA *p_actual = NULL, *cistic=NULL;
  22.     *poc = 0;
  23.  
  24.     if ((fr = fopen("e:\\auta.txt", "r")) == NULL) { //testovanie otvorenia suboru
  25.         printf("Zaznamy neboli nacitane\n");
  26.         return p_prvy;
  27. }
  28.     else {
  29.         if (p_prvy != NULL) { // ak bol zaznam vytvoreny, dealokujeme ho postupne
  30.             for (p_actual = p_prvy; p_actual != NULL;) {
  31.                 p_prvy = p_actual;
  32.                 p_actual = p_actual->p_dalsi;
  33.                 free((void*)p_prvy);
  34.                 p_prvy = NULL;
  35.             }
  36.         }
  37.  
  38.        
  39.  
  40.         while ((c = getc(fr)) != EOF) { // citame do konca suboru znaky
  41.             if (c == '*')
  42.                 (*poc)++; // zistenie poctu zaznamov
  43.             getc(fr); // zjedenie enteru
  44.             if (p_prvy == NULL) { // ak prvy nebol alok, tak ho alokujeme
  45.                 p_prvy = (AUTA*)malloc(sizeof(AUTA));
  46.  
  47.                 fgets(p_prvy->kategoria, 52, fr); // nacitanie do prveho zaznamu
  48.                 fgets(p_prvy->spz, 9, fr);
  49.                 fgets(p_prvy->znacka, 52, fr);
  50.                 fgets(p_prvy->predajca, 102, fr);
  51.                 fscanf(fr, "%d\n", &p_prvy->cena);
  52.                 fscanf(fr, "%d\n", &p_prvy->rok);
  53.                 fgets(p_prvy->stav, 202, fr);
  54.                 p_actual = p_prvy; // nastavenie aktualneho na prvy
  55.             }
  56.             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
  57.                 p_actual->p_dalsi = (AUTA *)malloc(sizeof(AUTA)); // alokujeme si nasledujuci
  58.                 p_actual = p_actual->p_dalsi; // nastavime aktualny na nasledujuci
  59.                
  60.                 fgets(p_actual->kategoria, 52, fr); // nacitanie dalsieho zaznamu a dookola pokial nemame vsetky
  61.                 fgets(p_actual->spz, 9, fr);
  62.                 fgets(p_actual->znacka, 52, fr);
  63.                 fgets(p_actual->predajca, 102, fr);
  64.                 fscanf(fr, "%d\n", &p_actual->cena);
  65.                 fscanf(fr, "%d\n", &p_actual->rok);
  66.                 fgets(p_actual->stav, 202, fr);
  67.                
  68.                 p_actual->p_dalsi = NULL; // nasledujuci nastavujeme vzdy na null
  69.             }
  70.  
  71.  
  72.            
  73.         }
  74.         printf("Nacitalo sa %d zaznamov\n", *poc); // vypis poctu zaznamov
  75.         if (fr != NULL) // ak bol subor otvoreny, zatvarame
  76.             fclose(fr);
  77.         return p_prvy; // vratime zaciatok spajaneho zoznamu
  78.     }
  79. }
  80.  
  81. void vypis(AUTA *p_prvy, int poc) //funkcia vypis
  82. {
  83.     int i;
  84.     AUTA *p_actual = NULL;
  85.  
  86.     if (p_prvy != NULL) { // ak bol zoznam vytvoreny
  87.         for (i = 0; i < poc; i++) { // cyklus do pocet zaznamov, vypisuje jednotlive polozky zaznamu
  88.             if (i == 0) { // ak prvy prvok sp zoznamu
  89.                 printf("%d.\n", i + 1); // poradie
  90.                 printf("kategoria: %s", p_prvy->kategoria);
  91.                 printf("SPZ: %s", p_prvy->spz);
  92.                 printf("znacka: %s", p_prvy->znacka);
  93.                 printf("predajca: %s", p_prvy->predajca);
  94.                 printf("cena: %d\n", p_prvy->cena);
  95.                 printf("rok_vyroby: %d\n", p_prvy->rok);
  96.                 printf("stav_vozidla: %s", p_prvy->stav);
  97.                 p_actual = p_prvy;
  98.             }
  99.             else { // ak nasledujuce zaznamy
  100.                 p_actual = p_actual->p_dalsi; // posun na nasledujuci
  101.                 printf("%d.\n", i + 1); // vypis jedntl poloziek postupne
  102.                 printf("kategoria: %s", p_actual->kategoria);
  103.                 printf("SPZ: %s", p_actual->spz);
  104.                 printf("znacka: %s", p_actual->znacka);
  105.                 printf("predajca: %s", p_actual->predajca);
  106.                 printf("cena: %d\n", p_actual->cena);
  107.                 printf("rok_vyroby: %d\n", p_actual->rok);
  108.                 printf("stav_vozidla: %s", p_actual->stav);
  109.  
  110.             }
  111.         }
  112.     }
  113. }
  114.  
  115. AUTA *pridaj(AUTA *p_prvy, int *poc) // pridanie zaznamu
  116. {
  117.     int cislo, i;
  118.     AUTA *p_novy = NULL;
  119.     AUTA *p_actual = NULL, *p_pom=NULL;
  120.  
  121.     scanf(" %d", &cislo); // nacitanie na kt poziciu chceme pridat
  122.     getchar();
  123.     p_novy = (AUTA *)malloc(sizeof(AUTA)); // alok pre novy zaznam
  124.  
  125.     fgets(p_novy->kategoria, 52, stdin); // nacitanie poloziek
  126.     fgets(p_novy->spz, 9, stdin);
  127.     fgets(p_novy->znacka, 52, stdin);
  128.     fgets(p_novy->predajca, 102, stdin);
  129.     scanf("%d\n", &p_novy->cena);
  130.     scanf("%d\n", &p_novy->rok);
  131.     fgets(p_novy->stav, 202, stdin);
  132.     if (p_prvy == NULL) { // ak zoznam este nebol vytvoreny, novy zaznam pridame na zaciatok zoznamu
  133.         p_prvy = p_novy;
  134.         p_prvy->p_dalsi = NULL;
  135.         *poc = 1; // pocet zaznamov v zozname je 1
  136.     }
  137.     else { // ak bol zoznam vytvoreny uz
  138.         if (cislo <= (*poc)) { // ak je pozicia mensia rovna
  139.             if (cislo != 1) { // a lisi sa od 1
  140.                 p_actual = p_prvy;
  141.                 for (i = 1; i <= (*poc); i++) {
  142.                     if (i > 1) // posuvame sa ak cyklus uz raz zbehol, koli tomu aby sme prip mohli pridavat na 2 poz v zozname
  143.                         p_actual = p_actual->p_dalsi; // posun na dalsi
  144.                     if (i + 1 == cislo) // ak sa nasledujuci prvok nachadza na pozicii na kt chceme pridavat
  145.                     {
  146.                         p_pom = p_actual->p_dalsi; // dalsi prvok si uchovame
  147.                         p_actual->p_dalsi = p_novy;// na jeho poziciu dame dalsi
  148.                         p_novy->p_dalsi = p_pom; // dalsi prvok posuvame o poz dalej v zozname o 1
  149.                     }
  150.                 }
  151.  
  152.             }
  153.             else { // ak pridavame na zaciatok zoznamu
  154.                 p_novy->p_dalsi = p_prvy; // prvy posunieme na 2. poziciu
  155.                 p_prvy = p_novy; // zaciatku zoznamu priradime novy
  156.             }
  157.         }
  158.         else { // ak je zadana pozicia vyssia ako pocet prvkov v zozname
  159.             p_actual = p_prvy; // nast aktual na prvy
  160.             for (i = 0; i < (*poc); i++) {
  161.  
  162.                 if (p_actual->p_dalsi == NULL) { // ak je dalsi zaznam prazdny tzv sme na poslednom
  163.                     p_actual->p_dalsi = p_novy; // tak na posl poziciu pridame novy
  164.                     p_novy->p_dalsi = NULL;
  165.                     break; // ukoncenie slucky po uspesnom pridani
  166.                 }
  167.                 else // ak niesme na posl prvku zoznamu, posuvame sa o jeden dalej
  168.                     p_actual = p_actual->p_dalsi;
  169.             }
  170.         }
  171.  
  172.         (*poc)++; // pocet zaznamov v zozname sa zvysi o 1
  173.     }
  174.     return p_prvy; // vratime zaciatok/prvy prvok zoznamu
  175. }
  176.  
  177. AUTA *zmaz(AUTA *p_prvy, int *poc)
  178. {
  179.     AUTA *p_actual = NULL, *p_pom = NULL, *vymaz = NULL;
  180.     char katfind[52], pomkat[52];
  181.     int i, j, maz = 0, pom = 0, pocet = 0;
  182.  
  183.     scanf(" %s", katfind); // nacitame retazec
  184.     if (p_prvy != NULL) {
  185.         for (i = 0; i < strlen(katfind); i++) // vsetky pismena na male
  186.             katfind[i] = tolower(katfind[i]);
  187.  
  188.         p_actual = p_prvy; // inicial pomoc premennych
  189.         pocet = *poc;
  190.         p_pom = p_actual;
  191.  
  192.         for (i = 0; i < pocet; i++) {
  193.             if (p_actual != NULL) {
  194.                 strcpy(pomkat, p_actual->kategoria); // pomocny string obsahuje kategoriu aktualnu
  195.  
  196.                 for (j = 0; j < strlen(pomkat) - 2; j++)
  197.                     pomkat[j] = tolower(pomkat[j]); // nastavime pomocny string na male pismena
  198.  
  199.                 if ((strstr(pomkat, katfind)) != NULL) { // ak mame nacitany podretazec v retazci kategorie
  200.                     vymaz = p_actual; //ulozime si zoznam na vymazanie
  201.                     maz++; // nech vieme kolko sme vymazali
  202.                     (*poc)--; // pocet sa zmensi
  203.                     if (p_prvy == vymaz) p_prvy = p_prvy->p_dalsi; // ak prvy mazeme posuvame sa na druhy, prvy sa vymaze, druhy bude prvy
  204.  
  205.                     else { // inak do pomocnej si dame zaciatok
  206.                         p_pom = p_prvy;
  207.                         while (p_pom->p_dalsi != vymaz) // zistime kedy nasledujuci prvok budeme mazat
  208.                             p_pom = p_pom->p_dalsi;
  209.                         p_pom->p_dalsi = vymaz->p_dalsi; // spojime prvok pred a prvok za ... aktualny mazeme
  210.                     }
  211.                     p_actual = p_actual->p_dalsi; // posun na dalsi prvok
  212.                     free((void*)vymaz); // mazanie zoznamu
  213.                     vymaz = NULL;
  214.                     pom = 1; // aby sme vedeli ci sa mazalo
  215.                 }
  216.                 if (!pom) // ak sa nemazalo, posuvame sa
  217.                     p_actual = p_actual->p_dalsi;
  218.                 pom = 0;
  219.             }
  220.            
  221.             }
  222.         }
  223.         printf("Vymazalo sa %d zaznamov\n", maz);
  224.         return p_prvy; // vratime zaciatok zoznamu
  225.     }
  226.  
  227. void hladaj(AUTA *p_prvy, int poc)
  228. {
  229.     char okres[4];
  230.     int hcena, cena = 0 , i, poci = 0;
  231.     AUTA *p_actual;
  232.     if (p_prvy != NULL) {
  233.         scanf(" %d", &hcena);
  234.         scanf(" %s", okres);
  235.         p_actual = p_prvy;
  236.  
  237.         for (i = 0; i < poc; i++) {
  238.             cena = p_actual->cena;
  239.             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
  240.                 poci++; // pocitadlo na vypis poradia ... vypis jednotl prvkov zaznamu kt vyhovuje poziadavkam
  241.                 printf("%d.\n", poci);
  242.                 printf("kategoria: %s", p_actual->kategoria);
  243.                 printf("SPZ: %s", p_actual->spz);
  244.                 printf("znacka: %s", p_actual->znacka);
  245.                 printf("predajca: %s", p_actual->predajca);
  246.                 printf("cena: %d\n", p_actual->cena);
  247.                 printf("rok_vyroby: %d\n", p_actual->rok);
  248.                 printf("stav_vozidla: %s", p_actual->stav);
  249.  
  250.             }
  251.             if (p_actual->p_dalsi != NULL) // posun na dalsi pokial sa je kde posuvat
  252.                 p_actual = p_actual->p_dalsi;
  253.         }
  254.         if (!poci) // ak sa neinkrementovalo
  255.             printf("V ponuke nie su hladane auta\n");
  256.     }
  257. }
  258.  
  259. void aktualizuj(AUTA *p_prvy, int poc)
  260. {
  261.     char udspz[9];
  262.     int i, update = 0;
  263.     AUTA *p_actual = NULL;
  264.     char kategoria[52];
  265.     char spz[9];
  266.     char znacka[52];
  267.     char predajca[102];
  268.     int cena;
  269.     int rok;
  270.     char stav[202];
  271.  
  272.     scanf(" %s\n", udspz); // citanie spz na porovnavanie + nacitanie novych poloziek pre aktualiz
  273.     fgets(kategoria, 52, stdin);
  274.     fgets(spz, 9, stdin);
  275.     fgets(znacka, 52, stdin);
  276.     fgets(predajca, 102, stdin);
  277.     scanf("%d\n", &cena);
  278.     scanf("%d\n", &rok);
  279.     fgets(stav, 202, stdin);
  280.     udspz[7] = '\n'; // nast posl znaku retazca na enter aby sme mohli porovnat
  281.     udspz[8] = '\0';
  282.  
  283.     if (p_prvy != NULL) { // ak zoznam existuje
  284.         p_actual = p_prvy;
  285.         for (i = 0; i < poc; i++) {
  286.             if ((strcmp(p_actual->spz, udspz)) == 0) { // ak sa spz rovnaju, aktualizujeme
  287.                 strcpy(p_actual->kategoria, kategoria);
  288.                 strcpy(p_actual->spz, spz);
  289.                 strcpy(p_actual->znacka, znacka);
  290.                 strcpy(p_actual->predajca, predajca);
  291.                 p_actual->cena = cena;
  292.                 p_actual->rok = rok;
  293.                 strcpy(p_actual->stav, stav);
  294.                 update = 1; // nech vieme ci sa aktualizovalo
  295.  
  296.             }
  297.             if (p_actual->p_dalsi != NULL)
  298.                 p_actual = p_actual->p_dalsi; // posun dalej ak je mozny
  299.         }
  300.         if (!update)
  301.             printf("Zaznam sa neaktualizoval\n");
  302.         else
  303.             printf("Zaznam sa aktualizoval\n");
  304.         return p_prvy;
  305.     }
  306. }
  307.  
  308. int main()
  309. {
  310.     AUTA *p_prvy = NULL, *p_actual=NULL;
  311.     int c, poc=0, i;
  312.  
  313.     while ((c = getchar()) != 'k') { // ak nestlacime k
  314.         switch (c)
  315.         {
  316.         case 'c': p_prvy = nacitaj_zaznam(p_prvy, &poc); break;
  317.         case 'v': vypis(p_prvy, poc); break;
  318.         case 'p': p_prvy = pridaj(p_prvy, &poc); break;
  319.         case 'z': p_prvy = zmaz(p_prvy, &poc); break;
  320.         case 'h': hladaj(p_prvy, poc); break;
  321.         case 'a': aktualizuj(p_prvy, poc); break;
  322.         default:
  323.             break;
  324.         }
  325.     }
  326.     if (p_prvy != NULL) { // ak zoznam existuje a nebol uvolneny ... postupne uvolnime
  327.         for (p_actual = p_prvy; p_actual != NULL;) {
  328.             p_prvy = p_actual;
  329.             p_actual = p_actual->p_dalsi;
  330.             free((void*)p_prvy);
  331.             p_prvy = NULL;
  332.         }
  333.     }
  334.  
  335.     return 0;
  336. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement