Revision: 60714
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at November 12, 2012 08:03 by dhrgar
Initial Code
// Implementacija liste pomocu polja
L#define ERROR -1
struct tDatum {
short dan, mjesec, godina;
};
typedef tDatum Datum;
struct tZiv {
int sifra;
char vrsta[50], naziv[50];
float cijena;
tDatum datum;
};
typedef tZiv Zivotinja;
struct tLista {
tZiv el[10000];
int kursor;
};
typedef int Element;
typedef tLista Lista;
bool operator==(Zivotinja z, Zivotinja z2) {
if(z.sifra != z2.sifra)
return false;
else if(z.cijena != z2.cijena)
return false;
else if(z.sifra != z2.sifra)
return false;
else if(z.sifra != z2.sifra)
return false;
else if(z.datum.dan!=z2.datum.dan || z.datum.mjesec!=z2.datum.mjesec ||
z.datum.godina!=z2.datum.godina)
return false;
else
return true;
}
Element FirstL(Lista* L) {
return 0;
}
Element EndL(Lista* L) {
return L->kursor;
}
Element NextL(Element p, Lista* L) {
if(p==EndL(L) )
return ERROR;
return p+1;
}
Element PreviousL(Element p, Lista* L) {
if(p==FirstL(L) )
return ERROR;
return p-1;
}
Element LocateL(Zivotinja x, Lista* L) {
int i=0;
while(i<L->kursor) {
if(L->el[i] == x)
return i;
i++;
}
return EndL(L);
}
bool InsertL(Zivotinja x, Element p, Lista* L) {
if(p<0 || p>L->kursor)
return 0;
int i=L->kursor;
L->kursor++;
while(i>p) {
L->el[i] = L->el[i-1];
i--;
}
L->el[p] = x;
return 1;
}
bool DeleteL(Element p, Lista* L) {
if(p<0 || p>L->kursor)
return 0;
int i = p+1;
while(i<L->kursor) {
L->el[i-1] = L->el[i];
i++;
}
L->kursor--;
return 1;
}
Zivotinja RetrieveL(Element p, Lista* L) {
return L->el[p];
}
void DeleteAllL(Lista* L) {
L->kursor = 0;
}
void InitL(Lista* L) {
L->kursor = 0;
}
// Implementacija liste pomocu pokazivaca
#define ERROR NULL
struct tDatum {
short dan, mjesec, godina;
};
typedef tDatum Datum;
struct tZiv {
int sifra;
char vrsta[50], naziv[50];
float cijena;
tDatum datum;
};
typedef tZiv Zivotinja;
struct tEl {
tZiv el;
tEl* sljedeci;
};
typedef tEl* Element;
typedef tEl Lista;
bool operator==(Zivotinja z, Zivotinja z2) {
if(z.sifra != z2.sifra)
return false;
else if(z.cijena != z2.cijena)
return false;
else if(z.sifra != z2.sifra)
return false;
else if(z.sifra != z2.sifra)
return false;
else if(z.datum.dan!=z2.datum.dan || z.datum.mjesec!=z2.datum.mjesec ||
z.datum.godina!=z2.datum.godina)
return false;
else
return true;
}
Element FirstL(Lista* L) {
return L;
}
Element EndL(Lista* L) {
Element trenutni = L;
while(trenutni->sljedeci)
trenutni=trenutni->sljedeci;
return trenutni;
}
Element NextL(Element p, Lista* L) {
if(p->sljedeci)
return p->sljedeci;
return ERROR;
}
Element PreviousL(Element p, Lista* L) {
if(p==FirstL(L) )
return ERROR;
Element trenutni = FirstL(L);
while(trenutni->sljedeci!=p)
trenutni=trenutni->sljedeci;
return trenutni;
}
Element LocateL(Zivotinja x, Lista* L) {
Element trenutni=L;
while(trenutni->sljedeci) {
if(trenutni->sljedeci->el == x)
return trenutni;
trenutni = trenutni->sljedeci;
}
return EndL(L);
}
bool InsertL(Zivotinja x, Element p, Lista* L) {
if(!L) return 0;
Element novi = new tEl;
memcpy(novi, &x, sizeof(Zivotinja) );
novi->sljedeci = p->sljedeci;
p->sljedeci = novi;
return 1;
}
bool DeleteL(Element p, Lista* L) {
if(!L) return 0;
Element trenutni = p->sljedeci;
p->sljedeci = trenutni->sljedeci;
delete trenutni;
return 1;
}
Zivotinja RetrieveL(Element p, Lista* L) {
return p->sljedeci->el;
}
void DeleteAllL(Lista* L) {
if(!L) return;
if(!L->sljedeci) return;
Element prethodni = L->sljedeci;
Element trenutni=prethodni->sljedeci;
while(trenutni!=NULL) {
delete prethodni;
prethodni = trenutni;
trenutni = prethodni->sljedeci;
}
delete prethodni;
L->sljedeci = NULL;
}
void InitL(Lista* L) {
L->sljedeci = NULL;
}
// Glavni dio programa
#include <iostream>
//#include "l_polje.h"
#include "l_pokazivaci.h"
using namespace std;
// mog 1 - Unos
bool U(Lista* L) {
cout << endl;
cout << " Dodavanje zivotinje u listu " << endl;
cout << "#############################" << endl;
static int sifra = 100;
Zivotinja* ziv = new Zivotinja;
ziv->sifra = sifra;
sifra++;
cout << "Sifra(*auto): " << ziv->sifra << endl;
cin.ignore();
cout << "Naziv: ";
cin.getline(ziv->naziv, 50);
cout << "Vrsta: ";
cin.getline(ziv->vrsta, 50);
cout << "Cijena: ";
cin >> ziv->cijena;
cout << "Dan: ";
cin >> ziv->datum.dan;
cout << "Mjesec: ";
cin >> ziv->datum.mjesec;
cout << "Godina: ";
cin >> ziv->datum.godina;
int ok = InsertL(*ziv, EndL(L), L);
return ok;
}
// mog 3-1 - Ispis cijele liste
void I1(Lista* L) {
cout << endl;
cout << " Ispis svih zivotinja iz liste " << endl;
cout << "###############################" << endl;
Zivotinja ziv;
// prolazenje kroz cijelu listu i ispis
Element trenutni = PreviousL(EndL(L), L) ;
while(trenutni != ERROR) {
ziv = RetrieveL(trenutni, L);
cout << endl;
cout << "......................................" << endl;
cout << "Sifra: " << ziv.sifra << endl;
cout << "Naziv: " << ziv.naziv << endl;
cout << "Vrsta: " << ziv.vrsta << endl;
cout << "Cijena: " << ziv.cijena << endl;
cout << "Datum: " << ziv.datum.dan << ".";
cout << ziv.datum.mjesec << "." << ziv.datum.godina << "." << endl;
cout << endl;
trenutni = PreviousL(trenutni, L) ;
}
}
// mog 3-2 - Ispis svih zivotinja dostavljenih nakon 23.9.2012
void I2(Lista* L) {
cout << endl;
cout << " Ispis zivotinja - svih poslije 23.9.2012. " << endl;
cout << "###########################################" << endl;
Zivotinja ziv;
int br = 0;
Element trenutni=FirstL(L);
while(trenutni!=EndL(L)) {
ziv = RetrieveL(trenutni, L);
int dd = (ziv.datum.godina*10000) + (ziv.datum.mjesec*100) + ziv.datum.dan;
// ako je datum poslije (2012 09 23) - broj u if-u : ispis
if(dd>20120923){
cout << endl;
cout << "Sifra: " << ziv.sifra << endl;
cout << "Naziv: " << ziv.naziv << endl;
cout << "Vrsta: " << ziv.vrsta << endl;
cout << "Cijena: " << ziv.cijena << endl;
cout << "Datum: " << ziv.datum.dan << ".";
cout << ziv.datum.mjesec << "." << ziv.datum.godina << endl;
cout << endl;
br++;
}
trenutni = NextL(trenutni, L);
}
cout << "Broj ispisanih zivotinja: " << br << endl;
}
bool StrJednako(char* s1, char* s2, int n, int n2) {
// ako su rijeci razlicite duzine - onda nisu iste :D
if(n != n2)
return 0;
// prolazenje kroz sve znakova - ako postoji //razliciti znak - rijeci nisu iste
int i=0; //razliciti znak - rijeci nisu iste
while(i<n) {
if(s1[i] != s2[i])
return 0;
i++;
}
// ako do sad funkcija nije zavrsena - rijeci su iste (konacno iste)
return 1; //su iste (konacno iste)
}
// mog 5-1 - Brisanje prema nazivu
int B1(Lista* L) {
cout << endl;
cout << " Brisanje unosa prema nazivu " << endl;
cout << "#############################" << endl;
// unos naziva
char naziv[50];
cin.ignore();
cout << "Naziv zivotinje koja se zeli obrisati: ";
cin.getline(naziv, 50);
// pretrazivanje liste sa zivotinjama
Zivotinja ziv;
Element trenutni=FirstL(L);
while(trenutni!=EndL(L)) {
ziv = RetrieveL(trenutni, L);
// provjeri da li je naziv zivotinje jednak unesenom nazivu
if(StrJednako(naziv, ziv.naziv, strlen(naziv), strlen(ziv.naziv))) {
int ok = DeleteL(LocateL(ziv, L), L);
if(ok==-1) return 0;
else return 1;
}
trenutni = NextL(trenutni, L);
}
return 0;
}
// mog 5-2 - Brisanje prema vrsti
int B2(Lista* L) {
cout << endl;
cout << " Brisanje vrste " << endl;
cout << "################" << endl;
char vrsta[50];
cin.ignore();
cout << "Vrsta zivotinja koja se zeli obrisati: ";
cin.getline(vrsta, 50);
int br = 0;
Zivotinja ziv;
Element trenutni=FirstL(L);
while(trenutni!=EndL(L)) {
ziv = RetrieveL(trenutni, L);
if(StrJednako(vrsta,ziv.vrsta,strlen(vrsta), strlen(ziv.vrsta))) {
int ok = DeleteL(LocateL(ziv, L), L);
if(ok==1) {
br++;
continue;
}
}
trenutni=NextL(trenutni,L);
}
cout << "Ukupno izbrisano " << br << " unosa." << endl;
if(br>0)
return 1;
else
return 0;
}
bool Provjera(Zivotinja z, Zivotinja z2) {
if(z.cijena<z2.cijena)
return 1;
if(z.cijena==z2.cijena) {
int manji = (strlen(z.naziv)<strlen(z2.naziv)) ? strlen(z.naziv) :
strlen(z2.naziv);
for(int i=0; i<manji; i++)
if(z.naziv[i]>z2.naziv[i])
return 0;
else if(z.naziv[i]<z2.naziv[i])
return 1;
}
return 0;
}
void SortiranjeSpoji(Zivotinja p[], int i, int k, int j) {
int I=i, J=k+1, K=0;
Zivotinja* p2 = new Zivotinja[j-i+1];
while(I<=k && J<=j)
if(Provjera(p[I], p[J]))
p2[K++]=p[I++];
else
p2[K++]=p[J++];
if(I>k)
while(J<=j)
p2[K++]=p[J++];
else
while(I<=k)
p2[K++]=p[I++];
for(int m=i; m<=j; m++)
p[m]=p2[m-i];
delete[] p2;
}
void SortiranjeSpajanjem(Zivotinja p[], int i, int j) {
if(i<j) {
int k = (i+j) / 2;
SortiranjeSpajanjem(p, i, k);
SortiranjeSpajanjem(p, k+1, j);
SortiranjeSpoji(p, i, k, j);
}
}
void S(Lista* L) {
cout << endl;
cout << " Sortiranje liste zivotinja " << endl;
cout << "############################" << endl;
int brojac=0, i=0;
Element trenutni=FirstL(L);
while(trenutni!=EndL(L)) {
brojac++;
trenutni=NextL(trenutni, L);
}
//
Zivotinja* zivotinje = new Zivotinja[brojac];
Element nova=FirstL(L);
while( nova!=EndL(L)) {
zivotinje[i++]=RetrieveL(nova, L);
nova=NextL(nova, L);
}
SortiranjeSpajanjem(zivotinje, 0, brojac-1);
DeleteAllL(L);
for(int i=brojac-1; i>=0; i--)
InsertL(zivotinje[i], EndL(L), L);
delete[] zivotinje;
}
int main() {
Lista* L = new Lista;
InitL(L);
short od;
do {
cout << endl;
cout << "#############################" << endl;
cout << " Glavni izbornik " << endl;
cout << "#############################" << endl;
cout << " 1. Dodavanje zivotinje" << endl;
cout << " 3. Ispis" << endl;
cout << " 5. Brisanje vrste zivotinja" << endl;
cout << " 7. Sortiranje" << endl;
cout << " 9. Izlaz" << endl;
cout << "Vas izbor: ";
cin >> od;
switch(od) {
case 1: {
int ok = U(L);
if(ok==1)
cout << endl << "Unos je dodan u listu." << endl;
break;
}
case 3: {
int a;
do {
cout << "1. Ispis cijele liste" << endl;
cout << "2. samo zivotinja s datumom poslije 23.9.2012." << endl;
cin >> a;
if(a==1)
I1(L);
if(a==2)
I2(L);
} while(a!=1 && a!=2);
break;
}
case 5: {
int a;
do {
cout << "1. Brisanje 1 zivotinje prema nazivu" << endl;
cout << "2. Brisanje svih zivotinja prema vrsti" << endl;
cin >> a;
if(a==1) {
int ok = B1(L);
if(ok==1)
cout << "Brisanje je uspjesno obavljeno." << endl;
}
if(a==2) {
int ok = B2(L);
if(ok)
cout << "Brisanje je uspjesno obavljeno." << endl;
}
} while(a!=1 && a!=2);
break;
}
case 7:
S(L);
break;
case 9:
break;
default:
cout << "Pogresan unos. Ponovite unos" << endl;
}
} while(od!=9);
return 0;
}
Initial URL
Initial Description
Datoteke zaglavlja (implementacija liste pomoću polja i pokazivaÄa), te glavni dio programa
Initial Title
Drazen_Hrgar_Zadatak_1_Strukture_Podataka
Initial Tags
Initial Language
C++