Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.85 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #include<string.h>
  5. #define MAX 15
  6. #define MIN 1
  7.  
  8. //13.02.2019
  9. //
  10. //Napisati program koji iz datoteke cita popis studenata(int brojIndexa, char *ime, char *prezime, int orderNum) i sprema ih u vezanu listu.
  11. //Prilikom spremanja studenta u vezanu listu potrebno je studentu dodijeliti orderNum, kao slucajno generirani cijeli broj u rasponu od 1 do 15.
  12. //Ispisati listu.
  13. //A) Iz tako kreirane liste potrebno je kreirati novu vezanu listu u kojoj ce studenti biti sortirani po prezimenu.
  14. //(napomena: nije dozvoljeno naknadno sortiranje liste vec se sortiranje vrsi prilikom onosa elementa u listu); Ispisati listu.
  15. //B) Iz novo kreirane liste izbrisati sve studente s istim orderNum.
  16. //C) Iz posljednje liste kreirati novu listu kojoj ce redoslijed studenata biti definiran podatkom orderNum.
  17. //(napomena: nije dozvoljeno alocirati memoriju za najnoviju listu, vec koristiti do sada alociranu memoriju.)
  18. //
  19. //NAPOMENA: Za ocjenu 2, potrebno je zatvoriti sve otvorene datoteke, pobrisati svu dinamicki alociranu memoriju i mirnim putem prekinuti rad programa.
  20.  
  21.  
  22. typedef struct lista *Position;
  23. typedef struct lista
  24. {
  25. char *ime;
  26. char *prezime;
  27. int indeks;
  28. int order;
  29. Position next;
  30.  
  31.  
  32. }Lista;
  33.  
  34. void CitajDatoteku(Position);
  35. Position Alociraj(int, int);
  36. void Generiraj(Position, char*, char* ,int, int);
  37. void Ispis(Position);
  38. void SortirajPoPrezimenu(Position, Position); //void san stavila jer mi ne triba vracat nista, sortirat ce
  39. void BrisiStudenteSIstimRand(Position);
  40. void PoOrderNum(Position, Position);
  41.  
  42.  
  43.  
  44. void PoOrderNum(Position druga, Position treca)
  45. {
  46. Position poc=treca;
  47. Position novi;
  48. while(druga!=NULL)
  49. {
  50. novi=Alociraj(strlen(druga->ime), strlen(druga->prezime));
  51. Generiraj(novi, druga->ime, druga->prezime, druga->indeks, druga->order);
  52. while(treca->next!=NULL)
  53. {
  54. if(treca->next->order<novi->order)
  55. treca=treca->next;
  56. else break;
  57. }
  58. novi->next=treca->next;
  59. treca->next=novi;
  60. druga=druga->next;
  61. treca=poc;
  62. }
  63.  
  64. }
  65.  
  66.  
  67.  
  68. void BrisiStudenteSIstimRand(Position druga )
  69. {
  70. Position temp=druga;
  71. Position poc=druga;
  72. int niz[MAX]={0};
  73. while(druga->next!=NULL)
  74. {
  75. niz[druga->next->indeks]++;
  76. druga=druga->next;
  77.  
  78.  
  79. }
  80. druga=poc;
  81.  
  82. while(druga->next!=NULL)
  83. {
  84.  
  85. if(niz[druga->next->indeks]!=1)
  86. {
  87. temp=druga->next;
  88. druga->next=temp->next;
  89. free(temp);
  90.  
  91. }
  92. else
  93. druga=druga->next;
  94.  
  95.  
  96. }
  97.  
  98.  
  99. }
  100.  
  101.  
  102.  
  103. void SortirajPoPrezimenu(Position stara, Position nova)
  104. {
  105. Position poc=nova; //doli objasnjeno
  106. Position novi; //ovo ce ti tribat jer ces novi cvor stavljat
  107. //ovo ti je najbolje pratit petlju i crtat da skontas
  108. while(stara!=NULL) //znaci tribas provjerit jel prva lista(koja je ispunjena ljudima)prazna il puna
  109. {
  110. //ako stara nije prazna, udi u nju i odma stvori cvor i alociraj prostor za njega
  111. novi=Alociraj(strlen(stara->ime), strlen(stara->prezime)); //saljes duljinu imena i prezimena od cvora u staroj listi
  112. 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
  113. while(nova->next!=NULL) //nova->next jer saljes head od druge , to ti je koda pise head->next, tj je li sljedeci element null
  114. {//prvi put ti nece uc u ovu drugu petlju jer je prazna, nismo jos nista stavili u nju
  115. if(strcmp(nova->next->prezime, novi->prezime)<0)//usporedi prvi element iz druge liste i taj novi generirani iz prve liste
  116. //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)
  117. 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
  118. else
  119. break; //ako nije po abecedi onda izadi iz unutrasnje while petlje
  120. //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
  121. //sta znaci da nikad nes izac iz whilea (ne znan jel ovo dobro objasnjeno ne mogu bolje hahaha)
  122. }
  123. novi->next=nova->next; //ako je doslo do breaka il si dosa do kraja druge liste onda ide vamo i nadodaje novi element
  124. nova->next=novi;
  125. stara=stara->next; //povecaj jer ako si doda novi element u listu , sad usporedujes novi element s drugon liston, a njega ces dobit tako
  126. // da uzmes sljedeci element u staroj listi , generiras ga i onda usporedujes sa popunjenon(il prazonon) drugon liston
  127. 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
  128. //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
  129.  
  130. }
  131.  
  132.  
  133.  
  134. }
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141. void Ispis(Position h)
  142. {
  143. while(h!=NULL) //ako lista nije prazna udi i ispisi
  144. {
  145. printf(" %d %s %s %d\n", h->indeks, h->ime, h->prezime, h->order);
  146. h=h->next; //kad ispises otidi na sjedeci cvor
  147. }
  148.  
  149. }
  150.  
  151.  
  152. void Generiraj(Position el, char*im, char* pr,int ind, int ord)
  153. {
  154.  
  155. el->indeks=ind; //dodjeljujes elementu vrijednost indeksa koja je poslana u funkciji
  156. strcpy(el->ime, im); // da stavis ime i przime u taj cvor moras koristit strcpy jer je string
  157. strcpy(el->prezime, pr);
  158.  
  159. if(ord==0) //random broj isto tribas dodilit
  160. el->order=rand()%(MAX-MIN+1)+MIN; //ugl stavila san if jer u prvoj listi saljen da je 0 pa mu dodili
  161. else
  162. 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
  163.  
  164. }
  165.  
  166. Position Alociraj(int DuljinaImena, int DuljinaPrezimena)
  167. {
  168. Position el=(Position)malloc(sizeof(Lista));
  169. el->ime=(char*)malloc(DuljinaImena*sizeof(char)); // za ime alociras tocno kolka je njegova duljina
  170. el->prezime=(char*)malloc(DuljinaPrezimena*sizeof(char));
  171.  
  172. return el; //vracas cvor za koji je alociran prostor
  173.  
  174.  
  175.  
  176. }
  177.  
  178.  
  179.  
  180.  
  181. void CitajDatoteku(Position h) //void jer ne vraca nista
  182. {
  183. Position novi; //pokazivac na novi cvor
  184. int ind;
  185. char ime[20];
  186. char prezime[30];
  187. FILE *fp; //pokazivac na tu datoteku
  188. fp=fopen("student.txt","r"); //otvaras datoteku za citanje
  189. if(fp==NULL)
  190. perror("greska"); //ako datoteka nije otvorena perror ce ti ispisat zasto nije
  191. else
  192. while(fscanf(fp, " %d %s %s",&ind, ime,prezime)==3)
  193. {
  194. novi=Alociraj(strlen(ime), strlen(prezime)); //saljes duljinu imena i prezimena da alociras tocno koliko zauzimaju ime i prezime
  195. Generiraj(novi, ime, prezime, ind,0); //u funkciju saljes cvor za koji je alociran prostor i ono sta tribas u njega stavit
  196.  
  197. novi->next=h->next; //kad si alocira i generira stavi da novi element pokazuje di pokauje head->next(NULL)
  198. h->next=novi; //a head pokazuje na taj novi element
  199. }
  200. fclose(fp); //nemoj zaboravit zatvarat datoteku , čiče radi toga navodno
  201. }
  202.  
  203.  
  204.  
  205. int main()
  206. {
  207. srand(time(NULL));
  208. Lista prva;
  209. Lista druga;
  210. Lista treca;//druga lista ti triba jer u zadatku pise da napravis jos jednu novu listu u kojoj ces sortirat studente
  211. druga.next=NULL;
  212. prva.next=NULL; //prva lista prazna
  213. treca.next=NULL;
  214. CitajDatoteku(&prva); //adresa heada jer cu u toj funkciji na head dodavat novi element
  215. Ispis(prva.next); //za ispis saljes adresu prvog elementa, mos i head , al onda u ispisu moras pisat head->next!=NULL
  216. printf("----------------------\n");
  217. SortirajPoPrezimenu(prva.next, &druga); //moras slat od druge liste adresu heada jer ces na njega dodavat nove elemente tj. sortirat
  218. //od prve ti triba prvi element, jer u njoj nes nista minjat pa ti ne triba head
  219. Ispis(druga.next); //sad ispis, saljes prvi element druge liste jer si u njoj sortira
  220. printf("\n---------------------\n");
  221. BrisiStudenteSIstimRand(&druga);
  222. printf("BRISI S ISTIM RAND\n");
  223. Ispis(druga.next);
  224. printf("------------------");
  225. PoOrderNum(druga.next, &treca);
  226. printf("\nPo random broju\n");
  227. Ispis(treca.next);
  228. printf("\n----------------");
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement