Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<time.h>
- #include<string.h>
- #define MAX 15
- #define MIN 1
- //13.02.2019
- //
- //Napisati program koji iz datoteke cita popis studenata(int brojIndexa, char *ime, char *prezime, int orderNum) i sprema ih u vezanu listu.
- //Prilikom spremanja studenta u vezanu listu potrebno je studentu dodijeliti orderNum, kao slucajno generirani cijeli broj u rasponu od 1 do 15.
- //Ispisati listu.
- //A) Iz tako kreirane liste potrebno je kreirati novu vezanu listu u kojoj ce studenti biti sortirani po prezimenu.
- //(napomena: nije dozvoljeno naknadno sortiranje liste vec se sortiranje vrsi prilikom onosa elementa u listu); Ispisati listu.
- //B) Iz novo kreirane liste izbrisati sve studente s istim orderNum.
- //C) Iz posljednje liste kreirati novu listu kojoj ce redoslijed studenata biti definiran podatkom orderNum.
- //(napomena: nije dozvoljeno alocirati memoriju za najnoviju listu, vec koristiti do sada alociranu memoriju.)
- //
- //NAPOMENA: Za ocjenu 2, potrebno je zatvoriti sve otvorene datoteke, pobrisati svu dinamicki alociranu memoriju i mirnim putem prekinuti rad programa.
- typedef struct lista *Position;
- typedef struct lista
- {
- char *ime;
- char *prezime;
- int indeks;
- int order;
- Position next;
- }Lista;
- void CitajDatoteku(Position);
- Position Alociraj(int, int);
- void Generiraj(Position, char*, char* ,int, int);
- void Ispis(Position);
- void SortirajPoPrezimenu(Position, Position); //void san stavila jer mi ne triba vracat nista, sortirat ce
- void BrisiStudenteSIstimRand(Position);
- void PoOrderNum(Position, Position);
- void PoOrderNum(Position druga, Position treca)
- {
- Position poc=treca;
- Position novi;
- while(druga!=NULL)
- {
- novi=Alociraj(strlen(druga->ime), strlen(druga->prezime));
- Generiraj(novi, druga->ime, druga->prezime, druga->indeks, druga->order);
- while(treca->next!=NULL)
- {
- if(treca->next->order<novi->order)
- treca=treca->next;
- else break;
- }
- novi->next=treca->next;
- treca->next=novi;
- druga=druga->next;
- treca=poc;
- }
- }
- void BrisiStudenteSIstimRand(Position druga )
- {
- Position temp=druga;
- Position poc=druga;
- int niz[MAX]={0};
- while(druga->next!=NULL)
- {
- niz[druga->next->indeks]++;
- druga=druga->next;
- }
- druga=poc;
- while(druga->next!=NULL)
- {
- if(niz[druga->next->indeks]!=1)
- {
- temp=druga->next;
- druga->next=temp->next;
- free(temp);
- }
- else
- druga=druga->next;
- }
- }
- void SortirajPoPrezimenu(Position stara, Position nova)
- {
- Position poc=nova; //doli objasnjeno
- Position novi; //ovo ce ti tribat jer ces novi cvor stavljat
- //ovo ti je najbolje pratit petlju i crtat da skontas
- while(stara!=NULL) //znaci tribas provjerit jel prva lista(koja je ispunjena ljudima)prazna il puna
- {
- //ako stara nije prazna, udi u nju i odma stvori cvor i alociraj prostor za njega
- novi=Alociraj(strlen(stara->ime), strlen(stara->prezime)); //saljes duljinu imena i prezimena od cvora u staroj listi
- Generiraj(novi, stara->ime, stara->prezime, stara->indeks, stara->order); //sad generiras novi cvor i u njega uvalis sve iz prvog cvora u prvog listi
- while(nova->next!=NULL) //nova->next jer saljes head od druge , to ti je koda pise head->next, tj je li sljedeci element null
- {//prvi put ti nece uc u ovu drugu petlju jer je prazna, nismo jos nista stavili u nju
- if(strcmp(nova->next->prezime, novi->prezime)<0)//usporedi prvi element iz druge liste i taj novi generirani iz prve liste
- //znaci ako je el u prvoj listi slovo A(npr broj 20), a novi generirani C (npr broj 30) manje od 0(oduzmes A-B)
- nova=nova->next; // ako je rezultat manji od 0 onda samo otidi na sljedeci element u novoj listi i usporedi ga s tim novin generiranim
- else
- break; //ako nije po abecedi onda izadi iz unutrasnje while petlje
- //ugl moras izac jer ako ne napises break uc ce ti u beskonacnu petlju jer ako u ifu nije uvjet zadovoljen , element se nece povecat
- //sta znaci da nikad nes izac iz whilea (ne znan jel ovo dobro objasnjeno ne mogu bolje hahaha)
- }
- novi->next=nova->next; //ako je doslo do breaka il si dosa do kraja druge liste onda ide vamo i nadodaje novi element
- nova->next=novi;
- stara=stara->next; //povecaj jer ako si doda novi element u listu , sad usporedujes novi element s drugon liston, a njega ces dobit tako
- // da uzmes sljedeci element u staroj listi , generiras ga i onda usporedujes sa popunjenon(il prazonon) drugon liston
- nova=poc; //moras vratit sad tu drugu listu na pocetak jer npr. imas u njoj A B C i onda dodas novi element D, znaci dosa si do kraja liste
- //i na C dodajes D. i sad ce ti ostat pokazivac na C. a ti moras usporedivat novi clan prve liste i opet od pocetka drugu listu
- }
- }
- void Ispis(Position h)
- {
- while(h!=NULL) //ako lista nije prazna udi i ispisi
- {
- printf(" %d %s %s %d\n", h->indeks, h->ime, h->prezime, h->order);
- h=h->next; //kad ispises otidi na sjedeci cvor
- }
- }
- void Generiraj(Position el, char*im, char* pr,int ind, int ord)
- {
- el->indeks=ind; //dodjeljujes elementu vrijednost indeksa koja je poslana u funkciji
- strcpy(el->ime, im); // da stavis ime i przime u taj cvor moras koristit strcpy jer je string
- strcpy(el->prezime, pr);
- if(ord==0) //random broj isto tribas dodilit
- el->order=rand()%(MAX-MIN+1)+MIN; //ugl stavila san if jer u prvoj listi saljen da je 0 pa mu dodili
- else
- el->order=ord; //al zato kad iman drugu listu iz prve se salje vec dodjeljeni order pa zato tada nije 0 i ovom ce doldilit isti radnom ko u prvoj isti
- }
- Position Alociraj(int DuljinaImena, int DuljinaPrezimena)
- {
- Position el=(Position)malloc(sizeof(Lista));
- el->ime=(char*)malloc(DuljinaImena*sizeof(char)); // za ime alociras tocno kolka je njegova duljina
- el->prezime=(char*)malloc(DuljinaPrezimena*sizeof(char));
- return el; //vracas cvor za koji je alociran prostor
- }
- void CitajDatoteku(Position h) //void jer ne vraca nista
- {
- Position novi; //pokazivac na novi cvor
- int ind;
- char ime[20];
- char prezime[30];
- FILE *fp; //pokazivac na tu datoteku
- fp=fopen("student.txt","r"); //otvaras datoteku za citanje
- if(fp==NULL)
- perror("greska"); //ako datoteka nije otvorena perror ce ti ispisat zasto nije
- else
- while(fscanf(fp, " %d %s %s",&ind, ime,prezime)==3)
- {
- novi=Alociraj(strlen(ime), strlen(prezime)); //saljes duljinu imena i prezimena da alociras tocno koliko zauzimaju ime i prezime
- Generiraj(novi, ime, prezime, ind,0); //u funkciju saljes cvor za koji je alociran prostor i ono sta tribas u njega stavit
- novi->next=h->next; //kad si alocira i generira stavi da novi element pokazuje di pokauje head->next(NULL)
- h->next=novi; //a head pokazuje na taj novi element
- }
- fclose(fp); //nemoj zaboravit zatvarat datoteku , čiče radi toga navodno
- }
- int main()
- {
- srand(time(NULL));
- Lista prva;
- Lista druga;
- Lista treca;//druga lista ti triba jer u zadatku pise da napravis jos jednu novu listu u kojoj ces sortirat studente
- druga.next=NULL;
- prva.next=NULL; //prva lista prazna
- treca.next=NULL;
- CitajDatoteku(&prva); //adresa heada jer cu u toj funkciji na head dodavat novi element
- Ispis(prva.next); //za ispis saljes adresu prvog elementa, mos i head , al onda u ispisu moras pisat head->next!=NULL
- printf("----------------------\n");
- SortirajPoPrezimenu(prva.next, &druga); //moras slat od druge liste adresu heada jer ces na njega dodavat nove elemente tj. sortirat
- //od prve ti triba prvi element, jer u njoj nes nista minjat pa ti ne triba head
- Ispis(druga.next); //sad ispis, saljes prvi element druge liste jer si u njoj sortira
- printf("\n---------------------\n");
- BrisiStudenteSIstimRand(&druga);
- printf("BRISI S ISTIM RAND\n");
- Ispis(druga.next);
- printf("------------------");
- PoOrderNum(druga.next, &treca);
- printf("\nPo random broju\n");
- Ispis(treca.next);
- printf("\n----------------");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement