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.95 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. char* stristr(const char *haystack, const char *needle)
  183. {
  184. char* pptr = (char *)needle;
  185. char* poczatek = (char *)haystack;
  186. char* sptr;
  187. int slen = strlen(haystack);
  188. int plen = strlen(needle);
  189.  
  190. for (; slen >= plen; poczatek++, slen--)
  191. {
  192. while (toupper(*poczatek) != toupper(*needle))
  193. {
  194. poczatek++;
  195. slen--;
  196.  
  197. if (slen < plen)
  198. {
  199. return NULL;
  200. }
  201. }
  202.  
  203. sptr = poczatek;
  204. pptr = (char *)needle;
  205. while (toupper(*sptr) == toupper(*pptr))
  206. {
  207. sptr++;
  208. pptr++;
  209.  
  210. if ('\0' == *pptr)
  211. {
  212. return poczatek;
  213. }
  214. }
  215. }
  216.  
  217. return NULL;
  218. }
  219.  
  220. char* toLower(const char*text)
  221. {
  222. int i = 0;
  223. char *c = malloc(strlen(text) *sizeof(char));
  224. while (text[i])
  225. {
  226. c[i] = tolower(text[i]);
  227. i++;
  228. }
  229. return c;
  230. }
  231. void znajdz(Program* program) {
  232. char text[100];
  233. Element* tmp = program->Listaa->poczatek;
  234.  
  235. printf("Podaj szukany tekst: ");
  236. scanf("%s", text);
  237.  
  238. printf("\nWynik wyszukiwania: \n");
  239. while (tmp != NULL) {
  240. if (strstr(toLower(tmp->kontakt->imie), toLower(text)) != NULL || strstr(toLower(tmp->kontakt->nazwisko), toLower(text)) != NULL) {
  241. drukuj_kontakt(tmp->kontakt);
  242. }
  243. tmp = tmp->nastepny;
  244. }
  245. }
  246. void znajdz_grupe(Program* program) {
  247. char text[100];
  248. Element* tmp = program->Listaa->poczatek;
  249.  
  250. printf("Podaj szukany tekst: ");
  251. scanf("%s", text);
  252.  
  253. printf("\nWynik wyszukiwania: \n");
  254. while (tmp != NULL) {
  255. if (strstr(toLower(tmp->kontakt->grupa), toLower(text)) != NULL) {
  256. drukuj_kontakt(tmp->kontakt);
  257. }
  258. tmp = tmp->nastepny;
  259. }
  260. }
  261. void zmien_tryb_sortowania(Program* program) {
  262. int wybor;
  263. do {
  264. printf("Wybierz tryb sortowania:\n1) Po imieniu 2) Po nazwisku 3) Po grupie\n");
  265. scanf("%d", &wybor);
  266. switch (wybor) {
  267. case 1:
  268. program->sortowanie = sortuj_po_imieniu;
  269. break;
  270. case 2:
  271. program->sortowanie = sortuj_po_nazwisku;
  272. break;
  273. case 3:
  274. program->sortowanie = sortuj_po_grupie;
  275. break;
  276. default:
  277. printf("Brak takiej opcji.\n");
  278. }
  279. } while (wybor != 1 && wybor != 2 && wybor != 3);
  280. }
  281. void wczytaj_z_csv(Program* program) {
  282. char tekst[100];
  283. FILE* plik;
  284.  
  285. printf("Podaj nazwe pliku: ");
  286. scanf("%s", tekst);
  287.  
  288. plik = fopen(tekst, "r");
  289. if (!plik) {
  290. printf("Niestety nie udalo sie otworzyc pliku.\n");
  291. return;
  292. }
  293.  
  294. while (!feof(plik)) {
  295. fgets(tekst, 100, plik);
  296. if (strlen(tekst) < 5) {
  297. return;
  298. }
  299. wstaw(program, &program->Listaa->poczatek, stworz_element_z_kontakt(tekst));
  300. memset(tekst, 0, 100);
  301. }
  302.  
  303. fclose(plik);
  304. }
  305.  
  306. void zapisz_do_csv(Program* program) {
  307. char tekst[100] = { 0 };
  308. FILE* plik;
  309.  
  310. Element* tmp = program->Listaa->poczatek;
  311. printf("Podaj nazwe pliku: ");
  312. scanf("%s", tekst);
  313.  
  314. plik = fopen(tekst, "w");
  315. if (!plik) {
  316. printf("Niestety nie udalo sie otworzyc pliku.\n");
  317. return;
  318. }
  319.  
  320.  
  321. while (tmp->nastepny != NULL) {
  322. fprintf(plik, "%s;%s;%s;%s\n", tmp->kontakt->imie, tmp->kontakt->nazwisko, tmp->kontakt->numer, tmp->kontakt->grupa);
  323. tmp = tmp->nastepny;
  324. }
  325. fprintf(plik, "%s;%s;%s;%s\n", tmp->kontakt->imie, tmp->kontakt->nazwisko, tmp->kontakt->numer, tmp->kontakt->grupa);
  326. fclose(plik);
  327.  
  328. }
  329.  
  330. void zwolnij_Listae(Program* program) {
  331. Element* tmp = program->Listaa->poczatek;
  332. Element* tmp2;
  333.  
  334. while (tmp != NULL) {
  335. tmp2 = tmp->nastepny;
  336. free(tmp->kontakt);
  337. free(tmp);
  338. tmp = tmp2;
  339. }
  340. }
  341. void usun(Program* program) {
  342. char imie[100], nazwisko[100];
  343. printf("Podaj imie i nazwisko kontaktu do usuniecia: ");
  344. scanf("%s %s", imie, nazwisko);
  345. if (usun_element(program, imie, nazwisko) == 1) {
  346. printf("Pomyslnie usunieto kontakt.\n");
  347. program->Listaa->rozmiar--;
  348. }
  349. else {
  350. printf("Brak kontaktu do usuniecia.\n");
  351. }
  352. }
  353. void wstaw_z_klawiatury(Program* program) {
  354. char tekst[100] = { 0 }; //strTo
  355. char czesc[20]; //strFrom
  356.  
  357. printf("Podaj imie: ");
  358. scanf("%s", czesc);
  359. strcat(tekst, czesc);
  360. strcat(tekst, ";");
  361.  
  362. printf("Podaj nazwisko: ");
  363. scanf("%s", czesc);
  364. strcat(tekst, czesc);
  365. strcat(tekst, ";");
  366.  
  367. printf("Podaj numer: ");
  368. scanf("%s", czesc);
  369. strcat(tekst, czesc);
  370. strcat(tekst, ";");
  371.  
  372. printf("Podaj grupe: ");
  373. scanf("%s", czesc);
  374. strcat(tekst, czesc);
  375.  
  376. printf("%s\n", tekst);
  377. wstaw(program, &program->Listaa->poczatek, stworz_element_z_kontakt(tekst));
  378. };
  379. int main() {
  380. int wybor;
  381.  
  382. Program program;
  383. program.Listaa = stworz_Liste();
  384. program.sortowanie = sortuj_po_imieniu;
  385.  
  386. zmien_tryb_sortowania(&program);
  387.  
  388. do {
  389. printf("\n0) Wyjscie\n");
  390. printf("1) Wczytaj\n");
  391. printf("2) Zapisz\n");
  392. printf("3) Wyswietl\n");
  393. printf("4) Zmien sortowanie\n");
  394. printf("5) Posortuj\n");
  395. printf("6) Wstaw\n");
  396. printf("7) Wyszukaj\n");
  397. printf("8) Wyszukaj po grupie\n");
  398. printf("9) Usun element\n");
  399.  
  400. scanf("%d", &wybor);
  401.  
  402.  
  403. switch (wybor) {
  404. case 0:
  405. printf("Zegnam.\n");
  406. zwolnij_Listae(&program);
  407. break;
  408. case 1:
  409. wczytaj_z_csv(&program);
  410. break;
  411. case 2:
  412. zapisz_do_csv(&program);
  413. break;
  414. case 3:
  415. drukuj_Liste(program.Listaa);
  416. break;
  417. case 4:
  418. zmien_tryb_sortowania(&program);
  419. break;
  420. case 5:
  421. sortuj(&program);
  422. break;
  423. case 6:
  424. wstaw_z_klawiatury(&program);
  425. break;
  426. case 7:
  427. znajdz(&program);
  428. break;
  429. case 8:
  430. znajdz_grupe(&program);
  431. break;
  432. case 9:
  433. usun(&program);
  434. break;
  435. }
  436.  
  437. } while (wybor != 0);
  438. return 0;
  439. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement