Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.39 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #define DLUGOSC_TEKSTU 50
  8.  
  9. typedef struct Kontakt {
  10. char imie[DLUGOSC_TEKSTU];
  11. char nazwisko[DLUGOSC_TEKSTU];
  12. char numer[DLUGOSC_TEKSTU];
  13. char grupa[DLUGOSC_TEKSTU];
  14. } Kontakt;
  15.  
  16. typedef struct Element {
  17. struct Element* nastepny, *poprzedni;
  18. Kontakt* kontakt;
  19. } Element;
  20.  
  21.  
  22. typedef struct Lista {
  23. Element* poczatek, *koniec;
  24. int rozmiar;
  25. } Lista;
  26.  
  27. typedef struct Program {
  28. Lista* Listaa;
  29. int(*sortowanie)(Element*, Element*);
  30. } Program;
  31.  
  32. Lista* stworz_Liste() {
  33. Lista* Listaa = (Lista*)calloc(1, sizeof(Lista));
  34.  
  35. if (Listaa == NULL) {
  36. printf("Nie udalo sie stworzyc Listay!\n");
  37. return NULL;
  38. }
  39.  
  40. Listaa->koniec = NULL;
  41. Listaa->poczatek = NULL;
  42. Listaa->rozmiar = 0;
  43. return Listaa;
  44.  
  45. }
  46.  
  47. void drukuj_kontakt(Kontakt* kontakt) {
  48. printf("\nImie: %s\nNaziwsko: %s\nNumer: %s\nGrupa: %s\n", kontakt->imie, kontakt->nazwisko, kontakt->numer, kontakt->grupa);
  49. }
  50.  
  51.  
  52. Kontakt* stworz_kontakt(char* text) {
  53. Kontakt* kontakt = (Kontakt*)calloc(1, sizeof(Kontakt));
  54.  
  55. if (kontakt == NULL) {
  56. printf("Nie udalo sie stworzyc kontaktu!\n");
  57. return NULL;
  58. }
  59.  
  60. // rozdziela tekst po sredniku
  61. sscanf(text, "%[^;] ; %[^;] ; %[^;] ; %s", kontakt->imie, kontakt->nazwisko, kontakt->numer, kontakt->grupa);
  62.  
  63. return kontakt;
  64. }
  65.  
  66. Element* stworz_element_z_kontakt(char* text) {
  67. Element* element = (Element*)calloc(1, sizeof(Element));
  68. if (element == NULL) {
  69. printf("Nie udalo sie stworzyc elementu!\n");
  70. return NULL;
  71. }
  72. element->kontakt = stworz_kontakt(text);
  73.  
  74. return element;
  75. }
  76.  
  77. void drukuj_Liste(Lista* Lista) {
  78. printf("Liczba kontaktow: %d\n", Lista->rozmiar);
  79.  
  80. Element* tmp = Lista->poczatek;
  81. while (tmp != NULL) {
  82. drukuj_kontakt(tmp->kontakt);
  83. tmp = tmp->nastepny;
  84. }
  85. }
  86.  
  87. int usun_element(Program* program, char* imie, char* nazwisko)
  88. {
  89. Element* tmp = program->Listaa->poczatek;
  90. Element* tmp2;
  91.  
  92. // jezeli usuwany jest element z poczatku
  93. if (strcmp(program->Listaa->poczatek->kontakt->imie, imie) == 0 && strcmp(program->Listaa->poczatek->kontakt->nazwisko, nazwisko) == 0) {
  94. program->Listaa->poczatek = program->Listaa->poczatek->nastepny;
  95. program->Listaa->poczatek->poprzedni = NULL;
  96. free(tmp->kontakt);
  97. free(tmp);
  98. return 1;
  99. }
  100. // jezeli usuwny element jest na koncu
  101. else if (strcmp(program->Listaa->poczatek->kontakt->imie, imie) == 0 && strcmp(program->Listaa->poczatek->kontakt->nazwisko, nazwisko) == 0) {
  102. tmp = program->Listaa->koniec;
  103. program->Listaa->koniec = program->Listaa->koniec->poprzedni;
  104. program->Listaa->koniec->nastepny = NULL;
  105. free(tmp->kontakt);
  106. free(tmp);
  107. return 1;
  108. }
  109. else { // jezeli usuwany element jest w srodku
  110. while (tmp->nastepny != NULL) {
  111. if (strcmp(tmp->nastepny->kontakt->imie, imie) == 0 && strcmp(tmp->nastepny->kontakt->nazwisko, nazwisko) == 0) {
  112. tmp2 = tmp->nastepny;
  113. tmp->nastepny = tmp->nastepny->nastepny;
  114.  
  115. free(tmp2->kontakt);
  116. free(tmp2);
  117. return 1;
  118. }
  119. tmp = tmp->nastepny;
  120. }
  121. }
  122. return 0;
  123. }
  124. /*
  125. * Porownujace elementy, jezeli takie same = 0, jezeli nalezy przestawic > 1, jezeli zachowac kolejnosc < -1
  126. */
  127. int sortuj_po_imieniu(Element* a, Element* b) { return strcoll(a->kontakt->imie, b->kontakt->imie); }
  128. int sortuj_po_nazwisku(Element* a, Element* b) { return strcoll(a->kontakt->nazwisko, b->kontakt->nazwisko); }
  129. int sortuj_po_grupie(Element* a, Element* b) { return strcoll(a->kontakt->grupa, b->kontakt->grupa); }
  130.  
  131.  
  132. //zgodnie z wybranym sortowaniem
  133. void wstaw(Program *program, struct Element **poczatek, struct Element *nowy)
  134. {
  135. Element* aktualny;
  136. program->Listaa->rozmiar++;
  137. /* Wyjatkowy przypadek jezeli nie ma elementu */
  138. if (*poczatek == NULL || program->sortowanie((*poczatek), nowy) >= 0)
  139. {
  140. nowy->nastepny = *poczatek;
  141. *poczatek = nowy;
  142. }
  143. else
  144. {
  145. /* Szuka miejsca przed elementem do wstawienia */
  146. aktualny = *poczatek;
  147. while (aktualny->nastepny != NULL && program->sortowanie(aktualny->nastepny, nowy) < 0)
  148. {
  149. aktualny = aktualny->nastepny;
  150. }
  151. nowy->nastepny = aktualny->nastepny;
  152. aktualny->nastepny = nowy;
  153. }
  154. }
  155.  
  156.  
  157. void sortuj(Program *program)
  158. {
  159. Element *posortowane = NULL;
  160. Element *nastepny = NULL;
  161. Element *poczatek = program->Listaa->poczatek;
  162.  
  163. // Przejdz przez Liste i wstaw kazdy element do posortowe
  164.  
  165. Element *aktualny = poczatek;
  166. while (aktualny != NULL)
  167. {
  168. nastepny = aktualny->nastepny;
  169.  
  170. // Wstaw aktualny do posortowane
  171. wstaw(program, &posortowane, aktualny);
  172. program->Listaa->rozmiar--;
  173. // Zaktualizuj aktualny
  174. aktualny = nastepny;
  175. }
  176.  
  177. // Zaktualizuj poczatek zeby wskazywal na posortowane
  178. poczatek = posortowane;
  179. }
  180.  
  181.  
  182.  
  183.  
  184. char* toLower(const char*text)
  185. {
  186. int i = 0;
  187. char *c = malloc(strlen(text)*sizeof(char));
  188. strcpy(c, text);
  189. for (int i = 0; text[i]; i++) {
  190. c[i] = tolower(text[i]);
  191. }
  192. return c;
  193. }
  194. void znajdz(Program* program) {
  195. char text[100];
  196. Element* tmp = program->Listaa->poczatek;
  197.  
  198. printf("Podaj szukany tekst: ");
  199. scanf("%s", text);
  200.  
  201. printf("\nWynik wyszukiwania: \n");
  202. while (tmp != NULL) {
  203. if (strstr(toLower(tmp->kontakt->imie), toLower(text)) != NULL || strstr(toLower(tmp->kontakt->nazwisko), toLower(text)) != NULL) {
  204. drukuj_kontakt(tmp->kontakt);
  205. }
  206. tmp = tmp->nastepny;
  207. }
  208. }
  209. void znajdz_grupe(Program* program) {
  210. char text[100];
  211. Element* tmp = program->Listaa->poczatek;
  212.  
  213. printf("Podaj szukany tekst: ");
  214. scanf("%s", text);
  215.  
  216. printf("\nWynik wyszukiwania: \n");
  217. while (tmp != NULL) {
  218. if (strstr(toLower(tmp->kontakt->grupa), toLower(text)) != NULL) {
  219. drukuj_kontakt(tmp->kontakt);
  220. }
  221. tmp = tmp->nastepny;
  222. }
  223. }
  224. void zmien_tryb_sortowania(Program* program) {
  225. int wybor;
  226. do {
  227. printf("Wybierz tryb sortowania:\n1) Po imieniu 2) Po nazwisku 3) Po grupie\n");
  228. scanf("%d", &wybor);
  229. switch (wybor) {
  230. case 1:
  231. program->sortowanie = sortuj_po_imieniu;
  232. break;
  233. case 2:
  234. program->sortowanie = sortuj_po_nazwisku;
  235. break;
  236. case 3:
  237. program->sortowanie = sortuj_po_grupie;
  238. break;
  239. default:
  240. printf("Brak takiej opcji.\n");
  241. }
  242. } while (wybor != 1 && wybor != 2 && wybor != 3);
  243. }
  244. void wczytaj_z_csv(Program* program) {
  245. char tekst[100];
  246. FILE* plik;
  247.  
  248. printf("Podaj nazwe pliku: ");
  249. scanf("%s", tekst);
  250.  
  251. plik = fopen(tekst, "r");
  252. if (!plik) {
  253. printf("Niestety nie udalo sie otworzyc pliku.\n");
  254. return;
  255. }
  256.  
  257. while (!feof(plik)) {
  258. fgets(tekst, 100, plik);
  259. if (strlen(tekst) < 5) {
  260. return;
  261. }
  262. wstaw(program, &program->Listaa->poczatek, stworz_element_z_kontakt(tekst));
  263. memset(tekst, 0, 100);
  264. }
  265.  
  266. fclose(plik);
  267. }
  268.  
  269. void zapisz_do_csv(Program* program) {
  270. char tekst[100] = { 0 };
  271. FILE* plik;
  272.  
  273. Element* tmp = program->Listaa->poczatek;
  274. printf("Podaj nazwe pliku: ");
  275. scanf("%s", tekst);
  276.  
  277. plik = fopen(tekst, "w");
  278. if (!plik) {
  279. printf("Niestety nie udalo sie otworzyc pliku.\n");
  280. return;
  281. }
  282.  
  283.  
  284. while (tmp->nastepny != NULL) {
  285. fprintf(plik, "%s;%s;%s;%s\n", tmp->kontakt->imie, tmp->kontakt->nazwisko, tmp->kontakt->numer, tmp->kontakt->grupa);
  286. tmp = tmp->nastepny;
  287. }
  288. fprintf(plik, "%s;%s;%s;%s\n", tmp->kontakt->imie, tmp->kontakt->nazwisko, tmp->kontakt->numer, tmp->kontakt->grupa);
  289. fclose(plik);
  290.  
  291. }
  292.  
  293. void zwolnij_Listae(Program* program) {
  294. Element* tmp = program->Listaa->poczatek;
  295. Element* tmp2;
  296.  
  297. while (tmp != NULL) {
  298. tmp2 = tmp->nastepny;
  299. free(tmp->kontakt);
  300. free(tmp);
  301. tmp = tmp2;
  302. }
  303. }
  304. void usun(Program* program) {
  305. char imie[100], nazwisko[100];
  306. printf("Podaj imie i nazwisko kontaktu do usuniecia: ");
  307. scanf("%s %s", imie, nazwisko);
  308. if (usun_element(program, imie, nazwisko) == 1) {
  309. printf("Pomyslnie usunieto kontakt.\n");
  310. program->Listaa->rozmiar--;
  311. }
  312. else {
  313. printf("Brak kontaktu do usuniecia.\n");
  314. }
  315. }
  316. void wstaw_z_klawiatury(Program* program) {
  317. char tekst[100] = { 0 }; //strTo
  318. char czesc[20]; //strFrom
  319.  
  320. printf("Podaj imie: ");
  321. scanf("%s", czesc);
  322. strcat(tekst, czesc);
  323. strcat(tekst, ";");
  324.  
  325. printf("Podaj nazwisko: ");
  326. scanf("%s", czesc);
  327. strcat(tekst, czesc);
  328. strcat(tekst, ";");
  329.  
  330. printf("Podaj numer: ");
  331. scanf("%s", czesc);
  332. strcat(tekst, czesc);
  333. strcat(tekst, ";");
  334.  
  335. printf("Podaj grupe: ");
  336. scanf("%s", czesc);
  337. strcat(tekst, czesc);
  338.  
  339. printf("%s\n", tekst);
  340. wstaw(program, &program->Listaa->poczatek, stworz_element_z_kontakt(tekst));
  341. };
  342. int main() {
  343. int wybor;
  344.  
  345. Program program;
  346. program.Listaa = stworz_Liste();
  347. program.sortowanie = sortuj_po_imieniu;
  348.  
  349. zmien_tryb_sortowania(&program);
  350.  
  351. do {
  352. printf("\n0) Wyjscie\n");
  353. printf("1) Wczytaj\n");
  354. printf("2) Zapisz\n");
  355. printf("3) Wyswietl\n");
  356. printf("4) Zmien sortowanie\n");
  357. printf("5) Posortuj\n");
  358. printf("6) Wstaw\n");
  359. printf("7) Wyszukaj\n");
  360. printf("8) Wyszukaj po grupie\n");
  361. printf("9) Usun element\n");
  362.  
  363. scanf("%d", &wybor);
  364.  
  365.  
  366. switch (wybor) {
  367. case 0:
  368. printf("Zegnam.\n");
  369. zwolnij_Listae(&program);
  370. break;
  371. case 1:
  372. wczytaj_z_csv(&program);
  373. break;
  374. case 2:
  375. zapisz_do_csv(&program);
  376. break;
  377. case 3:
  378. drukuj_Liste(program.Listaa);
  379. break;
  380. case 4:
  381. zmien_tryb_sortowania(&program);
  382. break;
  383. case 5:
  384. sortuj(&program);
  385. break;
  386. case 6:
  387. wstaw_z_klawiatury(&program);
  388. break;
  389. case 7:
  390. znajdz(&program);
  391. break;
  392. case 8:
  393. znajdz_grupe(&program);
  394. break;
  395. case 9:
  396. usun(&program);
  397. break;
  398. }
  399.  
  400. } while (wybor != 0);
  401. return 0;
  402. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement