Return to Snippet

Revision: 60695
at November 12, 2012 07:25 by ivadobrincic1


Initial Code
#include <iostream>

#include "lista_pokazivaci.h"
//#include "lista_polje.h"

using namespace std;

int sifra = 1;

int dodaj(Lista *lis) {
    animal nova_zivotinja;
    cout << "Unesi ime zivotinje (pocnite velikim slovom): ";
    cin >> nova_zivotinja.naziv;
    cout << "Unesi vrstu: ";
    cin >> nova_zivotinja.vrsta;
    cout << "Unesi datum: ";
    cin >> nova_zivotinja.datum;
    cout << "Unesi cijenu: ";
    cin >> nova_zivotinja.cijena;
    nova_zivotinja.sifra = sifra;
    ++sifra;

    return InsertL(nova_zivotinja, EndL(lis), lis);
}

void ispis_po_sifri_od_najnovije(Lista *lis) {
    animal zadnja_zivotinja;
    element tekuci = EndL(lis);

    if (FirstL(lis) == EndL(lis)) {
        cout << "Lista je prazna. " << endl;
        return;
    }

    do {
        tekuci = PreviousL(tekuci, lis);
        zadnja_zivotinja = RetrieveL(tekuci, lis);

        cout << "Sifra zivotinje: ";
        cout << zadnja_zivotinja.sifra << endl;
        cout << "Ime zivotinje: ";
        cout <<  zadnja_zivotinja.naziv << endl;
        cout << "Vrsta: ";
        cout <<  zadnja_zivotinja.vrsta << endl;
        cout << "Datum: ";
        cout <<  zadnja_zivotinja.datum << endl;
        cout << "Cijena: ";
        cout <<  zadnja_zivotinja.cijena << endl;
        cout << "================================" << endl;
    } while (zadnja_zivotinja.sifra != RetrieveL(FirstL(lis), lis).sifra);
}

void b(Lista *lis) {
    int ukupan_broj = 0;
    if (FirstL(lis) == EndL(lis)) {
        cout << "Lista je prazna." << endl;
        return;
    }
    cout << "================================" << endl;
    animal zivotinja;
    element tekuci = FirstL(lis);  

    while (tekuci != EndL(lis)) {
          zivotinja = RetrieveL(tekuci, lis);
        if (zivotinja.datum > "20120923") {
            ukupan_broj++;
            cout << "Sifra zivotinje: ";
            cout << zivotinja.sifra << endl;
            cout << "Ime zivotinje: ";
            cout <<  zivotinja.naziv << endl;
            cout << "Vrsta: ";
            cout <<  zivotinja.vrsta << endl;
            cout << "Datum: ";
            cout <<  zivotinja.datum << endl;
            cout << "Cijena: ";
            cout <<  zivotinja.cijena << endl;
            cout << "================================" << endl;

        }       
        
        tekuci = NextL(tekuci, lis);
    }  
    cout << "Ukupno je " << ukupan_broj << " dodanih tada.";
    cout << endl;
}

int c_po_nazivu(Lista *lis) {
    if (FirstL(lis) == EndL(lis)) {
        cout << "Lista je prazna " << endl;
        return 0;
    }
    
    string naziv;
    cout << "Naziv zivotinje za brisanje: ";
    cin >> naziv;

    animal zivotinja;
    element tekuci = FirstL(lis);  

    while (tekuci != EndL(lis)) {
         zivotinja = RetrieveL(tekuci, lis);
        if (zivotinja.naziv == naziv) {
            
            DeleteL(LocateL(zivotinja, lis), lis);  
            tekuci = FirstL(lis);        
        }
        else { 
            tekuci = NextL(tekuci, lis);
        }
    }
    return 1;
}

int c_po_vrsti(Lista *lis) {
    if (FirstL(lis) == EndL(lis)) {
        cout << "Lista je prazna " << endl;
        return 0;
    }

    string naziv;
    cout << "Vrsta zivotinje za brisanje: ";
    cin >> naziv;

    animal zivotinja;
    element tekuci = FirstL(lis);  
    element za_brisanje;

    while (tekuci != EndL(lis)) {
         zivotinja = RetrieveL(tekuci, lis);
        if (zivotinja.vrsta == naziv) {
            za_brisanje = tekuci;
            DeleteL(za_brisanje, lis);   
            tekuci = FirstL(lis);          
        }
        else { 
            tekuci = NextL(tekuci, lis);
        }
    }
    return 1;

}

void mergesort_po_nazivu(animal polje[], int left, int right) {
    int middle = (left + right) / 2;
    animal temp;
    if (right - left == 1) { 
        if (polje[right].naziv > polje[left].naziv) {
            temp = polje[right];
            polje[right] = polje[left];
            polje[left] = temp;
            return;
        }
    }    
    else if (right == left) { 
        return;
    }
    else { 
        mergesort_po_nazivu(polje, left, middle);
        mergesort_po_nazivu(polje, middle +1, right);
    
        int size_pomocno = right-left +1;
        animal *polje_pomocno = new animal[size_pomocno];
        int l = left;
        int s = middle +1;

        for (int i = 0; i < size_pomocno; i++) {
            if (l == middle+1) { 
                polje_pomocno[i] = polje[s]; s++;
                continue;
            }
            if (s == right +1) { 
                polje_pomocno[i] = polje[l]; l++;
                continue;
            }

            if (polje[l].naziv > polje[s].naziv) {
                polje_pomocno[i] = polje[l];
                l++;
            }
            else {
                polje_pomocno[i] = polje[s];
                s++;
            }
        } 
        
        int j = 0;
        for (int i = left; i <= right; i++) {
            polje[i] = polje_pomocno[j]; j++;
        }
    }
}


void mergesort_po_cijeni(animal polje[], int left, int right) {
    int middle = (left + right) / 2;
    animal temp;
    if (right - left == 1) { 
        if (polje[right].cijena > polje[left].cijena) {
            temp = polje[right];
            polje[right] = polje[left];
            polje[left] = temp;
            return;
        }
    }    
    else if (right == left) { 
        return;
    }
    else { 
        mergesort_po_cijeni(polje, left, middle);
        mergesort_po_cijeni(polje, middle +1, right);
    
        int size_pomocno = right-left +1;
        animal *polje_pomocno = new animal[size_pomocno];
        int l = left;
        int s = middle +1;

        for (int i = 0; i < size_pomocno; i++) {
            if (l == middle+1) { 
                polje_pomocno[i] = polje[s]; s++;
                continue;
            }
            if (s == right +1) { 
                polje_pomocno[i] = polje[l]; l++;
                continue;
            }

            if (polje[l].cijena > polje[s].cijena) {
                polje_pomocno[i] = polje[l];
                l++;
            }
            else {
                polje_pomocno[i] = polje[s];
                s++;
            }
        } 
        
        int j = 0;
        for (int i = left; i <= right; i++) {
            polje[i] = polje_pomocno[j]; j++;
        }
    }
}

void d(Lista *lis) {
    int n = 0;
    element temp = FirstL(lis);
    while (temp != EndL(lis)) {
        ++n;
        temp = NextL(temp, lis);
    }

    animal *polje = new animal[n];

    temp = FirstL(lis);
    for (int i = 0; temp != EndL(lis); i++) {
        polje[i] = RetrieveL(temp, lis);
        temp = NextL(temp, lis);
    }
    cout << "Sortiramo po nazivu." << endl;
    cout << endl;
    mergesort_po_nazivu(polje, 0, n-1);
    for (int i = 0; i < n; i++) {
        
        cout << "Sifra zivotinje: ";
        cout << polje[i].sifra << endl;
        cout << "Ime zivotinje: ";
        cout <<  polje[i].naziv << endl;
        cout << "Vrsta: ";
        cout <<  polje[i].vrsta << endl;
        cout << "Datum: ";
        cout <<  polje[i].datum << endl;
        cout << "Cijena: ";
        cout <<  polje[i].cijena << endl;
        cout << "================================" << endl;
    }
    cout << endl;
    
    DeleteAll(lis);
    for (int i = 0; i < n; i++) {
        InsertL(polje[i], EndL(lis), lis);
    }
    
    cout << "Lista sortirana po cijeni zivotinje: " << endl;
    cout << endl;
    mergesort_po_cijeni(polje, 0, n-1);
    for (int i = 0; i < n; i++) {
        
        cout << "Sifra zivotinje: ";
        cout << polje[i].sifra << endl;
        cout << "Ime zivotinje: ";
        cout <<  polje[i].naziv << endl;
        cout << "Vrsta: ";
        cout <<  polje[i].vrsta << endl;
        cout << "Datum: ";
        cout <<  polje[i].datum << endl;
        cout << "Cijena: ";
        cout <<  polje[i].cijena << endl;
        cout << "================================" << endl;
    }
    cout << endl;
    
    DeleteAll(lis);
    for (int i = 0; i < n; i++) {
        InsertL(polje[i], EndL(lis), lis);
    }

}

int main() {

    animal a;
    a.sifra = sifra; sifra++;
    a.naziv = "Kodi";
    a.vrsta = "pas";
    a.datum = "20111005"; 
    a.cijena = 7000;

    Lista popis;
    InitL(&popis);

    InsertL(a, EndL(&popis), &popis);

    a.sifra = sifra; sifra++;
    a.naziv = "Friki";
    a.vrsta = "macka";
    a.datum = "20121023";
    a.cijena = 300;

    InsertL(a, EndL(&popis) , &popis);

    a.sifra = sifra; sifra++;
    a.naziv = "Dona";
    a.vrsta = "pas";
    a.datum = "19990214";
    a.cijena = 9543;
    InsertL(a, EndL(&popis) , &popis);

    a.sifra = sifra; sifra++;
    a.naziv = "Mrvica";
    a.vrsta = "zec";
    a.datum = "20040313";
    a.cijena = 574;
    InsertL(a, EndL(&popis) , &popis);

    a.sifra = sifra; sifra++;
    a.naziv = "Brza";
    a.vrsta = "kornjaca";
    a.datum = "20130414";
    a.cijena = 378;
    InsertL(a, EndL(&popis) , &popis);

    ispis_po_sifri_od_najnovije(&popis);
    
    dodaj(&popis);
    cout << "================================" << endl;
    dodaj(&popis);
    cout << "================================" << endl;
    
    ispis_po_sifri_od_najnovije(&popis);
    cout << "===== Slijedi ispis zivotinja dodanih nakon 23.9.2012. =====";
    cout << endl;
    
    b(&popis);
    
    cout << endl;
    c_po_nazivu(&popis);
    cout << "===== Ispis nakon brisanja po nazivu =====" << endl;
    cout << endl;
    ispis_po_sifri_od_najnovije(&popis);
    
    cout << endl;
    c_po_vrsti(&popis);
    cout << "===== Ispis nakon brisanja po vrsti =====" << endl;
    cout << endl;
    ispis_po_sifri_od_najnovije(&popis);

    cout << endl;
    cout << "===== Merge sort. =====" << endl;
    d(&popis);
    
    
    system ("pause");
    return 0;
}

Initial URL


Initial Description
Glavni dio programa za 1. zadatak iz kolegija "Strukture podataka"

Initial Title
Glavni program_zadatak_1_sp

Initial Tags
sort

Initial Language
C++