Advertisement
kernel_memory_dump

Liste svasta

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