Advertisement
Guest User

Untitled

a guest
Mar 10th, 2016
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.09 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5.  
  6. #ifndef LINKEDLIST_H_
  7. #define LINKEDLIST_H_
  8.  
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <stdio.h>
  12.  
  13. typedef struct Person
  14. {
  15. char *name;
  16. char *surname;
  17. char *dateBirth;
  18. char *email;
  19. char *phone;
  20. char *address;
  21. }Person;
  22.  
  23. typedef struct Member
  24. {
  25. Person *person;
  26. struct Member *previous;
  27. struct Member *next;
  28. }Member;
  29.  
  30. typedef struct List
  31. {
  32. Member *first;
  33. Member *last;
  34. }List;
  35.  
  36. extern List *createList();
  37. extern void deleteList(List *head);
  38. extern void addElement(List *head, Person *person);
  39. extern void deleteElement(List *head, Person *person);
  40. extern Person *searchElement(List *head, char *name, char *surname);
  41. extern void sortList(List *head);
  42. extern void quickSort(Member *first,Member *last);
  43. extern Member *partition(Member *first,Member *last);
  44. extern void swap(Member *a,Member *b);
  45. extern List *mergeSort(List *head);
  46. extern List *merge(List *left, List *right);
  47. extern Member *center(List *head);
  48. extern void printPerson(Person *person);
  49. extern void printList(List *head);
  50. extern Person *createPerson(char *name, char *surname, char *dateBirth, char *email, char *phone, char *address);
  51.  
  52. #endif
  53.  
  54. List *createList()
  55. {
  56. List *head = (List*)malloc(sizeof(List));
  57. head->first = NULL;
  58. head->last = NULL;
  59. return head;
  60. }
  61.  
  62. void deleteList(List *head)
  63. {
  64. Member *first = head->first;
  65.  
  66. if (first == NULL)return;
  67. while (first != NULL)
  68. {
  69. Member *tmp = first;
  70. first = first->next;
  71. free(tmp->person->name);
  72. free(tmp->person->surname);
  73. free(tmp->person->dateBirth);
  74. free(tmp->person->email);
  75. free(tmp->person->phone);
  76. free(tmp->person->address);
  77. free(tmp->person);
  78. free(tmp);
  79. }
  80. }
  81.  
  82. void addElement(List *head, Person *person)
  83. {
  84. Member *last = head->last;
  85. Member *newMem = (Member*)malloc(sizeof(Member));
  86. newMem->person = person;
  87. newMem->previous = newMem->next = NULL;
  88. if (last == NULL)
  89. {
  90. head->first = head->last = newMem;
  91. return;
  92. }
  93.  
  94. last->next = newMem;
  95. newMem->previous = last;
  96. head->last = newMem;
  97. }
  98.  
  99. void deleteElement(List *head, Person *person)
  100. {
  101. if (head == NULL || person == NULL)return;
  102.  
  103. Member *member = head->first;
  104. while (member != NULL && member->person != person)member = member->next;
  105.  
  106. if (member == NULL)return;
  107.  
  108. if (member == head->first)
  109. {
  110. if (member == head->last)
  111. {
  112. head->first = head->last = NULL;
  113. }
  114. else
  115. {
  116. head->first = head->first->next;
  117. head->first->previous = NULL;
  118. }
  119. }
  120. else
  121. {
  122. if (member == head->last)
  123. {
  124. head->last = head->last->previous;
  125. head->last->next = NULL;
  126. }
  127. else
  128. {
  129. member->previous->next = member->next;
  130. }
  131. }
  132. free(member->person->name);
  133. free(member->person->surname);
  134. free(member->person->dateBirth);
  135. free(member->person->email);
  136. free(member->person->phone);
  137. free(member->person->address);
  138. free(member->person);
  139. free(member);
  140. }
  141.  
  142. Person *searchElement(List *head, char *name, char *surname)
  143. {
  144. Member *tmp = head->first;
  145. while (tmp != NULL)
  146. {
  147. if (strcmp(tmp->person->name, name) == 0 && strcmp(tmp->person->surname, surname) == 0)
  148. return tmp->person;
  149. tmp=tmp->next;
  150. }
  151. return NULL;
  152. }
  153.  
  154. void sortList(List *head)
  155. {
  156. quickSort(head->first,head->last);
  157. }
  158.  
  159. void quickSort(Member *first,Member *last)
  160. {
  161. if (first!= NULL && last!=NULL && first!=last && first!=last->next)
  162. {
  163. Member *p = partition(first,last);
  164. quickSort(first, p->previous);
  165. quickSort(p->next,last);
  166. }
  167. }
  168.  
  169. Member *partition(Member *first,Member *last)
  170. {
  171. Person *pivot=last->person;
  172. Member *i=first->previous;
  173. Member *j=first;
  174. for(j;j!=last;j=j->next)
  175. {
  176. if(strcmp(j->person->surname,pivot->surname)<0)
  177. {
  178. i=(i==NULL) ? first : i->next;
  179. swap(i,j);
  180. }
  181. }
  182. i =(i==NULL)? first : i->next;
  183. swap(i,last);
  184. return i;
  185. }
  186.  
  187. void swap(Member *a,Member *b)
  188. {
  189. Person *tmp=a->person;
  190. a->person=b->person;
  191. b->person=tmp;
  192. }
  193.  
  194. List *mergeSort(List *head)
  195. {
  196. if (head->first == NULL || head->first == head->last)return head;
  197.  
  198. Member *mid = center(head);
  199.  
  200. if (mid->next != NULL)mid->next->previous = NULL;
  201. List *left = createList();
  202. List *right = createList();
  203.  
  204. right->first = mid->next;
  205. right->last = mid->next == NULL ? NULL : head->last;
  206. left->first = head->first;
  207. left->last = mid;
  208. left->last->next=NULL;
  209. left = mergeSort(left);
  210. right = mergeSort(right);
  211. return merge(left, right);
  212. }
  213.  
  214. List *merge(List *left, List *right)
  215. {
  216. if (left->first == right->first && left->last == right->last)
  217. {
  218. free(right);
  219. return left;
  220. }
  221.  
  222. Member *leftMem = left->first;
  223. Member *rightMem = right->first;
  224. Member *tmp;
  225.  
  226. if(rightMem==NULL)return left;
  227. if(leftMem==NULL)return right;
  228.  
  229. if (strcmp(leftMem->person->name, rightMem->person->name)<0)
  230. {
  231. tmp = leftMem;
  232. leftMem = leftMem->next;
  233. }
  234. else
  235. {
  236. tmp = rightMem;
  237. rightMem = rightMem->next;
  238. }
  239. left->first = tmp;
  240.  
  241. while (leftMem != NULL && rightMem != NULL)
  242. {
  243. if (strcmp(leftMem->person->name, rightMem->person->name)<0)
  244. {
  245. tmp->next = leftMem;
  246. leftMem->previous = tmp;
  247. tmp = leftMem;
  248. leftMem = leftMem->next;
  249. }
  250. else
  251. {
  252. tmp->next = rightMem;
  253. rightMem->previous = tmp;
  254. tmp = rightMem;
  255. rightMem = rightMem->next;
  256. }
  257. }
  258.  
  259. if (leftMem != NULL)
  260. {
  261. tmp->next = leftMem;
  262. leftMem->previous = tmp;
  263. }
  264. else if (rightMem != NULL)
  265. {
  266. tmp->next = rightMem;
  267. rightMem->previous = tmp;
  268. }
  269.  
  270. while (tmp->next != NULL)
  271. {
  272. tmp = tmp->next;
  273. }
  274.  
  275. left->last = tmp;
  276. free(right);
  277.  
  278. return left;
  279. }
  280.  
  281. Member *center(List *head)
  282. {
  283. Member *slower = head->first;
  284. if (slower->next == NULL)return slower;
  285. Member *faster = slower->next;
  286. while (slower != NULL && faster->next != NULL)
  287. {
  288. slower = slower->next;
  289. faster = faster->next->next;
  290.  
  291. }
  292. return slower;
  293. }
  294.  
  295. void printPerson(Person *person)
  296. {
  297. if (person == NULL)return;
  298. printf("%s %s %s %s %s %s\n", person->name, person->surname, person->dateBirth, person->email, person->phone, person->address);
  299. }
  300.  
  301. void printList(List *head)
  302. {
  303. Member *tmp = head->first;
  304. while (tmp != NULL)
  305. {
  306. printPerson(tmp->person);
  307. tmp = tmp->next;
  308. }
  309. }
  310.  
  311. Person *createPerson(char *name, char *surname, char *dateBirth, char *email, char *phone, char *address)
  312. {
  313. Person *person = (Person*)malloc(sizeof(Person));
  314.  
  315. person->name = name;
  316. person->surname = surname;
  317. person->dateBirth = dateBirth;
  318. person->email = email;
  319. person->phone = phone;
  320. person->address = address;
  321.  
  322. return person;
  323. }
  324.  
  325.  
  326. char *allocate(char *a);
  327.  
  328. int main()
  329. {
  330. srand(time(NULL));
  331. char* names[]={"Adam","Bartosz","Cyprian","Danuta","Eustachy","Frania","Gabriel","Halina"};
  332. char* surnames[]={"Kowalski","Nowak","Job","Kolasa","Perdek","Slowik","Wisniewski","Rinner"};
  333. char* birthDates[]={"01-01-1991","02-02-1992","03-03-1993","04-04-1994",
  334. "05-05-1995","06-06-1996","07-07-1997","08-08-1998"};
  335. char* emails[]={"adam.kowalski@gmail.com","bartosz.nowak@gmail.com","cyprian.job@gmail.com","danuta.kolasa@gmail.com",
  336. "eustachy.perdek@gmail.com","frania.slowik@gmail.com","gabriel.wisniewski@gmail.com","halina.rinner@gmail.com"};
  337. char* numbers[]={"111111111","222222222","333333333","444444444","555555555","666666666","777777777","888888888"};
  338. char* adresses[]={"Krakow","Warszawa","Plock","Gdynia","Rzeszow","Katowice","Wroclaw","Poznan"};
  339.  
  340. int N=8;
  341.  
  342. List* head=createList();
  343. int i=0;
  344. for(i=0;i<N;i++)
  345. {
  346. Person *person=createPerson(allocate(names[rand()%8]),allocate(surnames[rand()%8]),allocate(birthDates[rand()%8]),allocate(emails[rand()%8]),allocate(numbers[rand()%8]),allocate(adresses[rand()%8]));
  347. addElement(head,person);
  348. }
  349. printf("\n");
  350. printList(head);
  351.  
  352. sortList(head);
  353. printf("Posortowane:\n");
  354. printList(head);
  355. printf("\n");
  356. printf("Szukany element:\n");
  357. Person *searched=searchElement(head,"Eustachy","Nowak");
  358. if(searched!=NULL)printPerson(searched);
  359. printf("\n");
  360. printf("Usuniety element:\n");
  361. deleteElement(head,searched);
  362. printList(head);
  363.  
  364. deleteList(head);
  365.  
  366. return 0;
  367. }
  368.  
  369. char *allocate(char *a)
  370. {
  371.  
  372. char *b=(char*)malloc(strlen(a)+1);
  373. strcpy(b,a);
  374. return b;
  375. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement