Advertisement
kernel_memory_dump

Л И С Т А

Jan 20th, 2014
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 14.69 KB | None | 0 0
  1. /************************************
  2. T E L E F O N S K I ___ I M E N I K
  3. +++++++++++++++++++++++++++++++++++++++
  4. Ucitati podatke o osobama iz datoteke, cije se ime zadaje
  5. preko terminala pri pozivu programa.
  6. Podatke iz datoteke smestiti u jednostruko spregnutu listu (JSL)
  7. Napraviti korisnicki meni sa opcijama:
  8. 1.  Sort liste po imenima
  9. 2. Sort list po prezimenima
  10. 3. Sort po brojavima
  11. 4. Prikaz svih osoba cije prezime pocinje na odredjeno slovo
  12. 5. Brisanje iz liste svih osoba cije prezime pocinje na odredjeno slovo
  13. 6.  Upis cele liste u datoteku
  14. 1337. izlaz
  15.  
  16. Broj telefona je uvek CEO BROJ!
  17. 0,1,2,3,4,5...999 999
  18. Podaci u datoteci izgledaju ovako:
  19. Petar Petrovic 12
  20. Nikola Nikolic 39
  21. Jovan Jovanovic
  22.  
  23.  
  24. ****************************************/
  25.  
  26.  
  27.  
  28. #include <stdio.h>
  29. #include <stdlib.h> /* zbog exit funkcije  */
  30. #include <errno.h>
  31.  
  32. #define MAX 50
  33.  
  34. struct Podaci {
  35.    char ime[MAX];
  36.    char prezime[MAX];
  37.    int broj;
  38. };
  39. struct CVOR{
  40.     struct Podaci x; // sve lepo zapakovano
  41.     struct CVOR* sledeci;
  42. };
  43.  
  44. // pokazivac na glavu, jer se glava mora modifikovati
  45. // kada se dodaje prvi element, da glava pokazuje na njega
  46. void dodajElement(struct CVOR** pGlava, struct Podaci podaci);
  47.  
  48.  
  49.  
  50.  
  51. void sortPoImenima(struct CVOR* glava);
  52. void sortPoPrezimenima(struct CVOR* glava);
  53. void sortPoBrojevima(struct CVOR* glava);
  54. void prikazSvihNaSlovo(struct CVOR* glava, char slovo);
  55. void brisiBroj(struct CVOR** pGlava, int broj);
  56. void upisUDatoteku(struct CVOR* glava, char* dat);
  57. void ispisNaEkran(struct CVOR* glava);
  58. void unistiListu (struct CVOR** pGlava);
  59. void ucitajIzDatoteke(struct CVOR**, char* imeDat);
  60. void ispisJednogCvora(struct CVOR* cvor);
  61.  
  62. //  ./program ulaz.txt izlaz.txt
  63. int main(int brArg, char** args)
  64. {
  65.    FILE* pfUlaz;
  66.    FILE* pfIzlaz;
  67.    struct CVOR* glava = NULL; /*   prazna lista na pocetku !1!! s*/
  68.    struct Podaci podaci; // podaci za tastature
  69.    // da mogu da se  lepo upakuju i proslede kao parametar
  70.    // funkciji za dodavanje novog elementa u listu
  71.    int izbor; /*  izbor opcije iz menija  */
  72.    char slovo; /*  za prikaz  zeljenih prezimena */
  73.    int brojTelefona;
  74.    int i;
  75.  
  76.    for (i  =0;i<brArg; i++)
  77.     puts(args[i]);
  78.  
  79.  
  80.    // O T VARANJE DATOTEKA ZA DALJI RAD
  81.    ///////////////////////////////////////////
  82.    pfUlaz = fopen(args[1], "r");
  83.    if (pfUlaz == NULL)
  84.    {
  85.       printf("Datoteka nije otvorena zbog:");
  86.       perror(errno);
  87.       return -1; // fail, program ne moze da nastavi dalje
  88.    }
  89.    pfIzlaz = fopen(args[2], "w");
  90.       if (pfUlaz == NULL)
  91.    {
  92.       printf("Datoteka nije otvorena zbog:");
  93.       perror(errno);
  94.       return -1; // fail, program ne moze da nastavi dalje
  95.    }
  96.  
  97.    //////////////////////////////////////
  98.    // ucitavanje liste iz ulazne datoteke
  99.    while( fscanf(pfUlaz, "%s ", podaci.ime) != EOF)
  100.    {  // ako je uspeo da ucita ime, valjda ostatak podataka stoji
  101.    //  u nastavku
  102.        // !=EOF, OK IMA STA DA SE CITA!
  103.        // ime niza je pokazivac na nulti clan,
  104.        fscanf(pfUlaz, "%s ", podaci.prezime);
  105.        fscanf(pfUlaz , "%d", &podaci.broj);
  106.        // podatke iz datoteke smo zapakovali u strukturu podaci
  107.        // saljemo je funkciji da u novi element upise te podatke
  108.       // u novi cvor (koga ce jelte, napraviti prvo)
  109.        dodajElement(&glava, podaci);
  110.  
  111.    }
  112.    fclose(pfUlaz);
  113.  
  114.    // sve ok za sada
  115.    do
  116.    {
  117.         printf("\n\n\n\n L__I__S__T___A\n\n");
  118.         printf("1.  Sort liste po imenima\n");
  119.         printf("2. Sort list po prezimenima\n");
  120.         printf("3. Sort po brojevima\n");
  121.         printf("4. Prikaz svih osoba cije prezime pocinje na odredjeno slovo\n");
  122.         printf("5. Brisanje iz liste osobe sa nekim brojem telefona\n");
  123.         printf("6.  Upis cele liste u izlaznu datoteku\n");
  124.         printf("7. Ispis cele liste na ekran\n");
  125.         printf("8. Unisti listu \n");
  126.         printf("9. Ucitaj listu iz ulazne datoteke\n");
  127.         scanf("%d", &izbor);
  128.  
  129.         switch(izbor)
  130.         {
  131.             case 1:
  132.             // ne treba adresa glave, jer ne diramo glavu, niti listu celu
  133.             // samo obrcemo sadrzaj
  134.             // x od jednog cvora upisemo u x od drugog cvora
  135.             // i to je to!
  136.                 sortPoImenima(glava);
  137.                 break;
  138.             case 2:
  139.                 sortPoPrezimenima(glava);
  140.                 break;
  141.             case 3:
  142.                 sortPoBrojevima(glava);
  143.                 break;
  144.             case 4:
  145.                 printf("Unesite slovo\n");
  146.                 scanf("%c", &slovo);
  147.                 prikazSvihNaSlovo(glava, slovo);
  148.                 break;
  149.             case 5:
  150.                 printf("Unesite broj telefona\n");
  151.                 scanf("%d", &brojTelefona);
  152.                 // adresa glave se daje
  153.                 // sta ako je u pitanju prvi element?
  154.                 // onda lista mora da pokazuje na sledeceg
  155.                 // ili ako je prvi jedini, glava treba da je NULL
  156.                 brisiBroj(&glava, brojTelefona);
  157.                 break;
  158.             case 6:
  159.                 upisUDatoteku(glava, args[2]);
  160.                 break;
  161.             case 7:
  162.                 ispisNaEkran(glava);
  163.                 break;
  164.             case 8:
  165.             // mora adres aglave da bi se postavila na NULL
  166.             // kada ne bude vise liste
  167.                 unistiListu(&glava);
  168.                 break;
  169.             case 9:
  170.             // mora adresa glave , jer ce se menjati
  171.             // formira se nova lista
  172.                 ucitajIzDatoteke(&glava, args[1]);
  173.                 break;
  174.             default:
  175.                 printf("Greska! Los izbor: 1~9\n");
  176.         }
  177.  
  178.  
  179.  
  180.    }while(izbor!=1337);
  181.  
  182.  
  183.    ///////////////////////////////////////////
  184.  
  185. }
  186.  
  187.  
  188. void dodajElement(struct CVOR** pGlava, struct Podaci podaci)
  189. {
  190.  
  191.     struct CVOR* novi; // cuva adresu koju malloc vrati
  192.     struct CVOR* trenutni; // za kretanje kroz listu, jer glavu NE KORISTIMO ZA KRETANJE KROZ LISTU,  jer bi nam se lista raspala!!
  193.  
  194.     // napravimo novi element, kasnije cemo ga uvezati u listu
  195.     novi = (struct CVOR*) malloc (sizeof(struct CVOR));
  196.     if (novi == NULL)
  197.     {
  198.         printf("NEMA DOVOLJNO MEMORIJE ZA RAD PROGRAMA!");
  199.         exit(EXIT_FAILURE); // exit funkcija zavrsava ceo program cak iako je u funkciji
  200.     }
  201.     novi->sledeci = NULL;
  202.     novi->x = podaci;
  203.  
  204.  
  205.  
  206.  
  207.     if (*pGlava == NULL)
  208.     {
  209.     // prazna lista
  210.     // glava pokazuje sada na prvi (jedini) element liste
  211.     *pGlava = novi; // deref pokazivac da bi izmenio ono na sta on pokazuje (glavu iz mejna)
  212.     }
  213.     else
  214.     {
  215.         trenutni = *pGlava;
  216.  
  217.         /*   idemo do poslednjeg elementa u listi
  218.            trenutni ce pokazivati na njeega
  219.         poslednji element u listi je onaj
  220.         kome je polje sledecei jednako NULL
  221.  
  222.         U to polje cemo upisati adresu novog elementa
  223.          i to je to
  224.         */
  225.         while(trenutni->sledeci != NULL)
  226.         // kada se while zavrsi, bicemo sigurni da smo dosli do poslednjeg elementa
  227.         // trenutni ce u sebi drzati adresu poslednjeg elementa liste
  228.         {
  229.         // prelazimo na sledeci element liste
  230.             trenutni = trenutni ->sledeci;
  231.         }
  232.         //
  233.         // sada  samo da napisemo da poslednji pokazuje na novi
  234.         trenutni->sledeci = novi;
  235.  
  236.     }
  237. }
  238.  
  239. void sortPoImenima(struct CVOR* glava)
  240. {
  241.     struct CVOR* i; /*  ovog poredimo sa ostatkom liste */
  242.     struct CVOR* j; //*  j su ostali elementi sa kojima poredimo i */
  243.     struct Podaci trecaCasa;
  244.     // treca casa je tipa struktura koja u sebi samo cuva podatke cvora
  245.     // jer samo njih i obrcemo
  246.  
  247.     i = glava;
  248.     /*  idemo bubble sort
  249.     for(i = 0; i< n - 1; i++)
  250.        for ( j = i + 1; j < n; j++)
  251.            if ( niz[j] < niz[i])
  252.               {
  253.            trecaCasa = niz[j];
  254.            niz[j] = niz[i];
  255.            niz[i] = trecaCasa;
  256.          }
  257.     */
  258.     while (i->sledeci!=NULL)
  259.     {
  260.         j = i->sledeci;
  261.         while(j!=NULL)
  262.         {
  263.         // izvucemo prvo slovo imena
  264.         // u ASCII tabeli B je vece od A
  265.         // A = 65, B = 66....
  266.             if ( j->x.ime[0] > i->x.ime[0])
  267.             {
  268.             // obrcem sadrzaj cvorova i, j
  269.                 trecaCasa = j->x; // sadrzaj cvora j u pomocnu
  270.                 j->x = i->x; // sadrzaj cvora i     ide u cvor j
  271.                 i->x = trecaCasa; // prethodno sacuvan
  272.                 // sadrzaj cvor j, sada ide u cvor i
  273.             }
  274.             // j ide dalje
  275.             // jer za svaki i, treba otici od i+1 do kraja liste
  276.             j = j -> sledeci;
  277.         }
  278.         // ako je j stiglo do kraja liste, to znaci da je sada == NULL
  279.         // pomeramo i    na sledeci cvor
  280.         i = i -> sledeci;
  281.  
  282.     }
  283.  
  284. }
  285. void sortPoPrezimenima(struct CVOR* glava)
  286. {
  287.  
  288.     struct CVOR* i; /*  ovog poredimo sa ostatkom liste */
  289.     struct CVOR* j; //*  j su ostali elementi sa kojima poredimo i */
  290.     struct Podaci trecaCasa;
  291.     // treca casa je tipa struktura koja u sebi samo cuva podatke cvora
  292.     // jer samo njih i obrcemo
  293.  
  294.     i = glava;
  295.     /*  idemo bubble sort
  296.     for(i = 0; i< n - 1; i++)
  297.        for ( j = i + 1; j < n; j++)
  298.            if ( niz[j] < niz[i])
  299.               {
  300.            trecaCasa = niz[j];
  301.            niz[j] = niz[i];
  302.            niz[i] = trecaCasa;
  303.          }
  304.     */
  305.     while (i->sledeci!=NULL)
  306.     {
  307.         j = i->sledeci;
  308.         while(j!=NULL)
  309.         {
  310.         // izvucemo prvo slovo prezimena
  311.         // u ASCII tabeli B je vece od A
  312.         // A = 65, B = 66....
  313.             if ( j->x.prezime[0] > i->x.prezime[0])
  314.             {
  315.             // obrcem sadrzaj cvorova i, j
  316.                 trecaCasa = j->x; // sadrzaj cvora j u pomocnu
  317.                 j->x = i->x; // sadrzaj cvora i     ide u cvor j
  318.                 i->x = trecaCasa; // prethodno sacuvan
  319.                 // sadrzaj cvor j, sada ide u cvor i
  320.             }
  321.             // j ide dalje
  322.             // jer za svaki i, treba otici od i+1 do kraja liste
  323.             j = j -> sledeci;
  324.         }
  325.         // ako je j stiglo do kraja liste, to znaci da je sada == NULL
  326.         // pomeramo i    na sledeci cvor
  327.         i = i -> sledeci;
  328.  
  329.     }
  330.  
  331. }
  332. void sortPoBrojevima(struct CVOR* glava)
  333. {
  334.     struct CVOR* i; /*  ovog poredimo sa ostatkom liste */
  335.     struct CVOR* j; //*  j su ostali elementi sa kojima poredimo i */
  336.     struct Podaci trecaCasa;
  337.     // treca casa je tipa struktura koja u sebi samo cuva podatke cvora
  338.     // jer samo njih i obrcemo
  339.  
  340.     i = glava;
  341.     /*  idemo bubble sort
  342.     for(i = 0; i< n - 1; i++)
  343.        for ( j = i + 1; j < n; j++)
  344.            if ( niz[j] < niz[i])
  345.               {
  346.            trecaCasa = niz[j];
  347.            niz[j] = niz[i];
  348.            niz[i] = trecaCasa;
  349.          }
  350.     */
  351.     while (i->sledeci!=NULL)
  352.     {
  353.         j = i->sledeci;
  354.         while(j!=NULL)
  355.         {
  356.  
  357.             if ( j->x.broj > i->x.broj)
  358.             {
  359.             // obrcem sadrzaj cvorova i, j
  360.                 trecaCasa = j->x; // sadrzaj cvora j u pomocnu
  361.                 j->x = i->x; // sadrzaj cvora i     ide u cvor j
  362.                 i->x = trecaCasa; // prethodno sacuvan
  363.                 // sadrzaj cvor j, sada ide u cvor i
  364.             }
  365.             // j ide dalje
  366.             // jer za svaki i, treba otici od i+1 do kraja liste
  367.             j = j -> sledeci;
  368.         }
  369.         // ako je j stiglo do kraja liste, to znaci da je sada == NULL
  370.         // pomeramo i    na sledeci cvor
  371.         i = i -> sledeci;
  372.     }
  373.  
  374. }
  375. void prikazSvihNaSlovo(struct CVOR* glava, char slovo)
  376. {
  377.     struct CVOR* trenutni;
  378.  
  379.     trenutni = glava;
  380.  
  381.     // do kraja liste
  382.     // kraj je kada trneutni uzme sadrzaj polaj sledeci
  383.     while(trenutni!=NULL)
  384.     {
  385.         if (trenutni->x.prezime[0] == slovo)
  386.         {
  387.             ispisJednogCvora(trenutni);
  388.         }
  389.         trenutni = trenutni ->sledeci;
  390.  
  391.     }
  392.  
  393. }
  394. void brisiBroj(struct CVOR** pGlava, int broj)
  395. {
  396.     struct CVOR* trenutni;
  397.     struct CVOR* prethodni;
  398.  
  399.     trenutni = *pGlava;
  400.  
  401.     // napomena: BROJEVI TELEFONA SU JEDINSTVENI
  402.     while(trenutni!=NULL)
  403.     {
  404.         // do kraja liste
  405.         // kraj je kada trneutni uzme sadrzaj polaj sledeci
  406.         prethodni = prethodni;
  407.  
  408.         if (trenutni->x.broj == broj)
  409.         {
  410.             printf("\n\nCVOR ZA BRISANJE:\n");
  411.             ispisJednogCvora(trenutni);
  412.         }
  413.         prethodni = trenutni;
  414.         trenutni = trenutni->sledeci;
  415.  
  416.     }
  417.  
  418.  
  419.     // nakon ove dve while petlje
  420.     // nasli smo cvor sa trazenim brojem
  421.     // da li je mozda to prvi cvor liste i jos uz to JEDINI CVOR LISTE??
  422.     // tada bi trenutni otisao na NULL, prethodni bi bio jednak glavi
  423.     if ( prethodni == *pGlava && trenutni == NULL)
  424.     {
  425.         // onda nakon brisanja ovog elementa, dobicemo praznu listu
  426.         free(prethodni);
  427.         *pGlava = NULL;
  428.     }
  429.  
  430.     // sta ako je prvi element, ali  nije jedini?
  431.     else if(trenutni == *pGlava && trenutni->sledeci != NULL)
  432.     {
  433.         // glavu treba pomeriti na drugi element, pre nego sto oslobodimo prvi element
  434.         *pGlava = trenutni->sledeci; // glava na onaj posle prvog
  435.         free(trenutni);
  436.     }
  437.     // ok nije na pocetku, definitino, ajde da vidimo da li je u sredini?
  438.     // to znaci da trenutni->sledeci nije   jednak NULL, jer ima nekog posle njega
  439.     // to znaci da ima neko i PRE njega (prehtodni)
  440.     else if (trenutni != *pGlava &&  trenutni-> sledeci != NULL)
  441.     {
  442.         // ako ima nekog iza njega
  443.         // i nije prvi
  444.         // to znaci da  onaj iza njega TREBA DA POKAZUJE na onog ispred njega
  445.         // primer, ovo je CVOR #2, njega brisemo
  446.         // iza njega je CVOR#1
  447.         // ispred je CVOR#3
  448.         // pre nego sto izbrisemo CVOR#2
  449.         // CVOR#1 mora da pokazuje na CVOR#3, kako se lista ne bi raspala
  450.         // CVOE#1 je prethodni
  451.         // CVOR#3 je CVOR#2->sledeci
  452.         prethodni->sledeci = trenutni -> sledeci;
  453.         free(trenutni);
  454.     }
  455.     // jos jedan slucaj!
  456.     // STA AKO JE cvor koji se brise POSLEDNJI?
  457.     else if ( trenutni != *pGlava && trenutni->sledeci == NULL)
  458.     {
  459.         // tada prethodni treba da pokazuje na NULL
  460.         prethodni->sledeci = NULL;
  461.         free(trenutni);
  462.     }
  463.  
  464.  
  465.  
  466.  
  467.  
  468.     }
  469.  
  470. void upisUDatoteku(struct CVOR* glava, char* dat)
  471. {
  472.     struct CVOR* trenutni;
  473.     FILE* fIzlaz;
  474.     fIzlaz = fopen(dat, "w");
  475.  
  476.     trenutni = glava;
  477.     while(trenutni!=NULL)
  478.     {
  479.         fprintf(fIzlaz,"%s %s %d\n", trenutni->x.ime,
  480.              trenutni->x.prezime, trenutni->x.broj);
  481.              trenutni = trenutni ->sledeci;
  482.  
  483.     }
  484.     fclose(fIzlaz);
  485.  
  486.  
  487. }
  488. void ispisNaEkran(struct CVOR* glava)
  489. {
  490.     struct CVOR* trenutni;
  491.  
  492.     trenutni = glava;
  493.  
  494.     // do kraja liste
  495.     // kraj je kada trneutni uzme sadrzaj polaj sledeci
  496.     while(trenutni!=NULL)
  497.     {
  498.         ispisJednogCvora(trenutni);
  499.         trenutni = trenutni ->sledeci;
  500.  
  501.     }
  502.  
  503. }
  504. void unistiListu (struct CVOR** pGlava)
  505. {
  506.     struct CVOR* brisi;
  507.     while( *pGlava != NULL)
  508.     {
  509.         brisi = *pGlava;
  510.         // moram da prvo derefenciram
  511.         // pokazivac na glavu
  512.         // da bi dobio pokazivac na strukturu
  513.         // zato sto samo tada mogu da koristim ->
  514.         *pGlava = (*pGlava)-> sledeci;  // pokazivac na pokazivac!
  515.         free(brisi);
  516.     }
  517.  
  518. }
  519. void ucitajIzDatoteke(struct CVOR** pGlava, char* imeDat)
  520. {
  521.     *pGlava = NULL;
  522.     FILE* pfUlaz;
  523.     struct Podaci podaci;
  524.  
  525.  
  526.  
  527.    // O T VARANJE DATOTEKA ZA DALJI RAD
  528.    ///////////////////////////////////////////
  529.    pfUlaz = fopen(imeDat, "r");
  530.    if (pfUlaz == NULL)
  531.    {
  532.       printf("Datoteka nije otvorena zbog:");
  533.       perror(errno);
  534.       return -1; // fail, program ne moze da nastavi dalje
  535.    }
  536.  
  537.    //////////////////////////////////////
  538.    // ucitavanje liste iz ulazne datoteke
  539.    while( fscanf(pfUlaz, "%s ", podaci.ime) != EOF)
  540.    {  // ako je uspeo da ucita ime, valjda ostatak podataka stoji
  541.    //  u nastavku
  542.        // !=EOF, OK IMA STA DA SE CITA!
  543.        // ime niza je pokazivac na nulti clan,
  544.        fscanf(pfUlaz, "%s ", podaci.prezime);
  545.        fscanf(pfUlaz , "%d", &podaci.broj);
  546.        // podatke iz datoteke smo zapakovali u strukturu podaci
  547.        // saljemo je funkciji da u novi element upise te podatke
  548.       // u novi cvor (koga ce jelte, napraviti prvo)
  549.       // imamo vec adresu glave u pokazivacu na Glavu
  550.       // NECEMO DATI ADRESU POKAZIVACA  NA GLAVU!
  551.       // nego vrednost tog pokazivaca  (on u sebi cuva &glava)
  552.        dodajElement(pGlava, podaci);
  553.  
  554.    }
  555.  
  556.  
  557.  
  558. }
  559. void ispisJednogCvora(struct CVOR* cvor)
  560. {
  561.     printf("\n-------------\n");
  562.     printf("Ime:%s\n", cvor->x.ime);
  563.     printf("Prezime:%s\n", cvor->x.prezime);
  564.     printf("Broj telefona:%d\n", cvor->x.broj);
  565.  
  566. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement