Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.42 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[100];
  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. //printf("%s, %s ", toLower(tmp->kontakt->imie), toLower(text));
  204. if (strstr(toLower(tmp->kontakt->imie), toLower(text)) != NULL || strstr(toLower(tmp->kontakt->nazwisko), toLower(text)) != NULL) {
  205. drukuj_kontakt(tmp->kontakt);
  206. }
  207. tmp = tmp->nastepny;
  208. }
  209. }
  210. void znajdz_grupe(Program* program) {
  211. char text[100];
  212. Element* tmp = program->Listaa->poczatek;
  213.  
  214. printf("Podaj szukany tekst: ");
  215. scanf("%s", text);
  216.  
  217. printf("\nWynik wyszukiwania: \n");
  218. while (tmp != NULL) {
  219. if (strstr(toLower(tmp->kontakt->grupa), toLower(text)) != NULL) {
  220. drukuj_kontakt(tmp->kontakt);
  221. }
  222. tmp = tmp->nastepny;
  223. }
  224. }
  225. void zmien_tryb_sortowania(Program* program) {
  226. int wybor;
  227. do {
  228. printf("Wybierz tryb sortowania:\n1) Po imieniu 2) Po nazwisku 3) Po grupie\n");
  229. scanf("%d", &wybor);
  230. switch (wybor) {
  231. case 1:
  232. program->sortowanie = sortuj_po_imieniu;
  233. break;
  234. case 2:
  235. program->sortowanie = sortuj_po_nazwisku;
  236. break;
  237. case 3:
  238. program->sortowanie = sortuj_po_grupie;
  239. break;
  240. default:
  241. printf("Brak takiej opcji.\n");
  242. }
  243. } while (wybor != 1 && wybor != 2 && wybor != 3);
  244. }
  245. void wczytaj_z_csv(Program* program) {
  246. char tekst[100];
  247. FILE* plik;
  248.  
  249. printf("Podaj nazwe pliku: ");
  250. scanf("%s", tekst);
  251.  
  252. plik = fopen(tekst, "r");
  253. if (!plik) {
  254. printf("Niestety nie udalo sie otworzyc pliku.\n");
  255. return;
  256. }
  257.  
  258. while (!feof(plik)) {
  259. fgets(tekst, 100, plik);
  260. if (strlen(tekst) < 5) {
  261. return;
  262. }
  263. wstaw(program, &program->Listaa->poczatek, stworz_element_z_kontakt(tekst));
  264. memset(tekst, 0, 100);
  265. }
  266.  
  267. fclose(plik);
  268. }
  269.  
  270. void zapisz_do_csv(Program* program) {
  271. char tekst[100] = { 0 };
  272. FILE* plik;
  273.  
  274. Element* tmp = program->Listaa->poczatek;
  275. printf("Podaj nazwe pliku: ");
  276. scanf("%s", tekst);
  277.  
  278. plik = fopen(tekst, "w");
  279. if (!plik) {
  280. printf("Niestety nie udalo sie otworzyc pliku.\n");
  281. return;
  282. }
  283.  
  284.  
  285. while (tmp->nastepny != NULL) {
  286. fprintf(plik, "%s;%s;%s;%s\n", tmp->kontakt->imie, tmp->kontakt->nazwisko, tmp->kontakt->numer, tmp->kontakt->grupa);
  287. tmp = tmp->nastepny;
  288. }
  289. fprintf(plik, "%s;%s;%s;%s\n", tmp->kontakt->imie, tmp->kontakt->nazwisko, tmp->kontakt->numer, tmp->kontakt->grupa);
  290. fclose(plik);
  291.  
  292. }
  293.  
  294. void zwolnij_Listae(Program* program) {
  295. Element* tmp = program->Listaa->poczatek;
  296. Element* tmp2;
  297.  
  298. while (tmp != NULL) {
  299. tmp2 = tmp->nastepny;
  300. free(tmp->kontakt);
  301. free(tmp);
  302. tmp = tmp2;
  303. }
  304. }
  305. void usun(Program* program) {
  306. char imie[100], nazwisko[100];
  307. printf("Podaj imie i nazwisko kontaktu do usuniecia: ");
  308. scanf("%s %s", imie, nazwisko);
  309. if (usun_element(program, imie, nazwisko) == 1) {
  310. printf("Pomyslnie usunieto kontakt.\n");
  311. program->Listaa->rozmiar--;
  312. }
  313. else {
  314. printf("Brak kontaktu do usuniecia.\n");
  315. }
  316. }
  317. void wstaw_z_klawiatury(Program* program) {
  318. char tekst[100] = { 0 }; //strTo
  319. char czesc[20]; //strFrom
  320.  
  321. printf("Podaj imie: ");
  322. scanf("%s", czesc);
  323. strcat(tekst, czesc);
  324. strcat(tekst, ";");
  325.  
  326. printf("Podaj nazwisko: ");
  327. scanf("%s", czesc);
  328. strcat(tekst, czesc);
  329. strcat(tekst, ";");
  330.  
  331. printf("Podaj numer: ");
  332. scanf("%s", czesc);
  333. strcat(tekst, czesc);
  334. strcat(tekst, ";");
  335.  
  336. printf("Podaj grupe: ");
  337. scanf("%s", czesc);
  338. strcat(tekst, czesc);
  339.  
  340. printf("%s\n", tekst);
  341. wstaw(program, &program->Listaa->poczatek, stworz_element_z_kontakt(tekst));
  342. };
  343. int main() {
  344. int wybor;
  345.  
  346. Program program;
  347. program.Listaa = stworz_Liste();
  348. program.sortowanie = sortuj_po_imieniu;
  349.  
  350. zmien_tryb_sortowania(&program);
  351.  
  352. do {
  353. printf("\n0) Wyjscie\n");
  354. printf("1) Wczytaj\n");
  355. printf("2) Zapisz\n");
  356. printf("3) Wyswietl\n");
  357. printf("4) Zmien sortowanie\n");
  358. printf("5) Posortuj\n");
  359. printf("6) Wstaw\n");
  360. printf("7) Wyszukaj\n");
  361. printf("8) Wyszukaj po grupie\n");
  362. printf("9) Usun element\n");
  363.  
  364. scanf("%d", &wybor);
  365.  
  366.  
  367. switch (wybor) {
  368. case 0:
  369. printf("Zegnam.\n");
  370. zwolnij_Listae(&program);
  371. break;
  372. case 1:
  373. wczytaj_z_csv(&program);
  374. break;
  375. case 2:
  376. zapisz_do_csv(&program);
  377. break;
  378. case 3:
  379. drukuj_Liste(program.Listaa);
  380. break;
  381. case 4:
  382. zmien_tryb_sortowania(&program);
  383. break;
  384. case 5:
  385. sortuj(&program);
  386. break;
  387. case 6:
  388. wstaw_z_klawiatury(&program);
  389. break;
  390. case 7:
  391. znajdz(&program);
  392. break;
  393. case 8:
  394. znajdz_grupe(&program);
  395. break;
  396. case 9:
  397. usun(&program);
  398. break;
  399. }
  400.  
  401. } while (wybor != 0);
  402. return 0;
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement