Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define DLUGOSC_TEKSTU 50
- typedef struct Kontakt {
- char imie[DLUGOSC_TEKSTU];
- char nazwisko[DLUGOSC_TEKSTU];
- char numer[DLUGOSC_TEKSTU];
- char grupa[DLUGOSC_TEKSTU];
- } Kontakt;
- typedef struct Element {
- struct Element* nastepny, *poprzedni;
- Kontakt* kontakt;
- } Element;
- typedef struct Lista {
- Element* poczatek, *koniec;
- int rozmiar;
- } Lista;
- typedef struct Program {
- Lista* Listaa;
- int(*sortowanie)(Element*, Element*);
- } Program;
- Lista* stworz_Liste() {
- Lista* Listaa = (Lista*)calloc(1, sizeof(Lista));
- if (Listaa == NULL) {
- printf("Nie udalo sie stworzyc Listay!\n");
- return NULL;
- }
- Listaa->koniec = NULL;
- Listaa->poczatek = NULL;
- Listaa->rozmiar = 0;
- return Listaa;
- }
- void drukuj_kontakt(Kontakt* kontakt) {
- printf("\nImie: %s\nNaziwsko: %s\nNumer: %s\nGrupa: %s\n", kontakt->imie, kontakt->nazwisko, kontakt->numer, kontakt->grupa);
- }
- Kontakt* stworz_kontakt(char* text) {
- Kontakt* kontakt = (Kontakt*)calloc(1, sizeof(Kontakt));
- if (kontakt == NULL) {
- printf("Nie udalo sie stworzyc kontaktu!\n");
- return NULL;
- }
- // rozdziela tekst po sredniku
- sscanf(text, "%[^;] ; %[^;] ; %[^;] ; %s", kontakt->imie, kontakt->nazwisko, kontakt->numer, kontakt->grupa);
- return kontakt;
- }
- Element* stworz_element_z_kontakt(char* text) {
- Element* element = (Element*)calloc(1, sizeof(Element));
- if (element == NULL) {
- printf("Nie udalo sie stworzyc elementu!\n");
- return NULL;
- }
- element->kontakt = stworz_kontakt(text);
- return element;
- }
- void drukuj_Liste(Lista* Lista) {
- printf("Liczba kontaktow: %d\n", Lista->rozmiar);
- Element* tmp = Lista->poczatek;
- while (tmp != NULL) {
- drukuj_kontakt(tmp->kontakt);
- tmp = tmp->nastepny;
- }
- }
- int usun_element(Program* program, char* imie, char* nazwisko)
- {
- Element* tmp = program->Listaa->poczatek;
- Element* tmp2;
- // jezeli usuwany jest element z poczatku
- if (strcmp(program->Listaa->poczatek->kontakt->imie, imie) == 0 && strcmp(program->Listaa->poczatek->kontakt->nazwisko, nazwisko) == 0) {
- program->Listaa->poczatek = program->Listaa->poczatek->nastepny;
- program->Listaa->poczatek->poprzedni = NULL;
- free(tmp->kontakt);
- free(tmp);
- return 1;
- }
- // jezeli usuwny element jest na koncu
- else if (strcmp(program->Listaa->poczatek->kontakt->imie, imie) == 0 && strcmp(program->Listaa->poczatek->kontakt->nazwisko, nazwisko) == 0) {
- tmp = program->Listaa->koniec;
- program->Listaa->koniec = program->Listaa->koniec->poprzedni;
- program->Listaa->koniec->nastepny = NULL;
- free(tmp->kontakt);
- free(tmp);
- return 1;
- }
- else { // jezeli usuwany element jest w srodku
- while (tmp->nastepny != NULL) {
- if (strcmp(tmp->nastepny->kontakt->imie, imie) == 0 && strcmp(tmp->nastepny->kontakt->nazwisko, nazwisko) == 0) {
- tmp2 = tmp->nastepny;
- tmp->nastepny = tmp->nastepny->nastepny;
- free(tmp2->kontakt);
- free(tmp2);
- return 1;
- }
- tmp = tmp->nastepny;
- }
- }
- return 0;
- }
- /*
- * Porownujace elementy, jezeli takie same = 0, jezeli nalezy przestawic > 1, jezeli zachowac kolejnosc < -1
- */
- int sortuj_po_imieniu(Element* a, Element* b) { return strcoll(a->kontakt->imie, b->kontakt->imie); }
- int sortuj_po_nazwisku(Element* a, Element* b) { return strcoll(a->kontakt->nazwisko, b->kontakt->nazwisko); }
- int sortuj_po_grupie(Element* a, Element* b) { return strcoll(a->kontakt->grupa, b->kontakt->grupa); }
- //zgodnie z wybranym sortowaniem
- void wstaw(Program *program, struct Element **poczatek, struct Element *nowy)
- {
- Element* aktualny;
- program->Listaa->rozmiar++;
- /* Wyjatkowy przypadek jezeli nie ma elementu */
- if (*poczatek == NULL || program->sortowanie((*poczatek), nowy) >= 0)
- {
- nowy->nastepny = *poczatek;
- *poczatek = nowy;
- }
- else
- {
- /* Szuka miejsca przed elementem do wstawienia */
- aktualny = *poczatek;
- while (aktualny->nastepny != NULL && program->sortowanie(aktualny->nastepny, nowy) < 0)
- {
- aktualny = aktualny->nastepny;
- }
- nowy->nastepny = aktualny->nastepny;
- aktualny->nastepny = nowy;
- }
- }
- void sortuj(Program *program)
- {
- Element *posortowane = NULL;
- Element *nastepny = NULL;
- Element *poczatek = program->Listaa->poczatek;
- // Przejdz przez Liste i wstaw kazdy element do posortowe
- Element *aktualny = poczatek;
- while (aktualny != NULL)
- {
- nastepny = aktualny->nastepny;
- // Wstaw aktualny do posortowane
- wstaw(program, &posortowane, aktualny);
- program->Listaa->rozmiar--;
- // Zaktualizuj aktualny
- aktualny = nastepny;
- }
- // Zaktualizuj poczatek zeby wskazywal na posortowane
- poczatek = posortowane;
- }
- char* stristr(const char *haystack, const char *needle)
- {
- char* pptr = (char *)needle;
- char* poczatek = (char *)haystack;
- char* sptr;
- int slen = strlen(haystack);
- int plen = strlen(needle);
- for (; slen >= plen; poczatek++, slen--)
- {
- while (toupper(*poczatek) != toupper(*needle))
- {
- poczatek++;
- slen--;
- if (slen < plen)
- {
- return NULL;
- }
- }
- sptr = poczatek;
- pptr = (char *)needle;
- while (toupper(*sptr) == toupper(*pptr))
- {
- sptr++;
- pptr++;
- if ('\0' == *pptr)
- {
- return poczatek;
- }
- }
- }
- return NULL;
- }
- char* toLower(const char*text)
- {
- int i = 0;
- char *c = malloc(strlen(text) *sizeof(char));
- while (text[i])
- {
- c[i] = tolower(text[i]);
- i++;
- }
- return c;
- }
- void znajdz(Program* program) {
- char text[100];
- Element* tmp = program->Listaa->poczatek;
- printf("Podaj szukany tekst: ");
- scanf("%s", text);
- printf("\nWynik wyszukiwania: \n");
- while (tmp != NULL) {
- if (strstr(toLower(tmp->kontakt->imie), toLower(text)) != NULL || strstr(toLower(tmp->kontakt->nazwisko), toLower(text)) != NULL) {
- drukuj_kontakt(tmp->kontakt);
- }
- tmp = tmp->nastepny;
- }
- }
- void znajdz_grupe(Program* program) {
- char text[100];
- Element* tmp = program->Listaa->poczatek;
- printf("Podaj szukany tekst: ");
- scanf("%s", text);
- printf("\nWynik wyszukiwania: \n");
- while (tmp != NULL) {
- if (strstr(toLower(tmp->kontakt->grupa), toLower(text)) != NULL) {
- drukuj_kontakt(tmp->kontakt);
- }
- tmp = tmp->nastepny;
- }
- }
- void zmien_tryb_sortowania(Program* program) {
- int wybor;
- do {
- printf("Wybierz tryb sortowania:\n1) Po imieniu 2) Po nazwisku 3) Po grupie\n");
- scanf("%d", &wybor);
- switch (wybor) {
- case 1:
- program->sortowanie = sortuj_po_imieniu;
- break;
- case 2:
- program->sortowanie = sortuj_po_nazwisku;
- break;
- case 3:
- program->sortowanie = sortuj_po_grupie;
- break;
- default:
- printf("Brak takiej opcji.\n");
- }
- } while (wybor != 1 && wybor != 2 && wybor != 3);
- }
- void wczytaj_z_csv(Program* program) {
- char tekst[100];
- FILE* plik;
- printf("Podaj nazwe pliku: ");
- scanf("%s", tekst);
- plik = fopen(tekst, "r");
- if (!plik) {
- printf("Niestety nie udalo sie otworzyc pliku.\n");
- return;
- }
- while (!feof(plik)) {
- fgets(tekst, 100, plik);
- if (strlen(tekst) < 5) {
- return;
- }
- wstaw(program, &program->Listaa->poczatek, stworz_element_z_kontakt(tekst));
- memset(tekst, 0, 100);
- }
- fclose(plik);
- }
- void zapisz_do_csv(Program* program) {
- char tekst[100] = { 0 };
- FILE* plik;
- Element* tmp = program->Listaa->poczatek;
- printf("Podaj nazwe pliku: ");
- scanf("%s", tekst);
- plik = fopen(tekst, "w");
- if (!plik) {
- printf("Niestety nie udalo sie otworzyc pliku.\n");
- return;
- }
- while (tmp->nastepny != NULL) {
- fprintf(plik, "%s;%s;%s;%s\n", tmp->kontakt->imie, tmp->kontakt->nazwisko, tmp->kontakt->numer, tmp->kontakt->grupa);
- tmp = tmp->nastepny;
- }
- fprintf(plik, "%s;%s;%s;%s\n", tmp->kontakt->imie, tmp->kontakt->nazwisko, tmp->kontakt->numer, tmp->kontakt->grupa);
- fclose(plik);
- }
- void zwolnij_Listae(Program* program) {
- Element* tmp = program->Listaa->poczatek;
- Element* tmp2;
- while (tmp != NULL) {
- tmp2 = tmp->nastepny;
- free(tmp->kontakt);
- free(tmp);
- tmp = tmp2;
- }
- }
- void usun(Program* program) {
- char imie[100], nazwisko[100];
- printf("Podaj imie i nazwisko kontaktu do usuniecia: ");
- scanf("%s %s", imie, nazwisko);
- if (usun_element(program, imie, nazwisko) == 1) {
- printf("Pomyslnie usunieto kontakt.\n");
- program->Listaa->rozmiar--;
- }
- else {
- printf("Brak kontaktu do usuniecia.\n");
- }
- }
- void wstaw_z_klawiatury(Program* program) {
- char tekst[100] = { 0 }; //strTo
- char czesc[20]; //strFrom
- printf("Podaj imie: ");
- scanf("%s", czesc);
- strcat(tekst, czesc);
- strcat(tekst, ";");
- printf("Podaj nazwisko: ");
- scanf("%s", czesc);
- strcat(tekst, czesc);
- strcat(tekst, ";");
- printf("Podaj numer: ");
- scanf("%s", czesc);
- strcat(tekst, czesc);
- strcat(tekst, ";");
- printf("Podaj grupe: ");
- scanf("%s", czesc);
- strcat(tekst, czesc);
- printf("%s\n", tekst);
- wstaw(program, &program->Listaa->poczatek, stworz_element_z_kontakt(tekst));
- };
- int main() {
- int wybor;
- Program program;
- program.Listaa = stworz_Liste();
- program.sortowanie = sortuj_po_imieniu;
- zmien_tryb_sortowania(&program);
- do {
- printf("\n0) Wyjscie\n");
- printf("1) Wczytaj\n");
- printf("2) Zapisz\n");
- printf("3) Wyswietl\n");
- printf("4) Zmien sortowanie\n");
- printf("5) Posortuj\n");
- printf("6) Wstaw\n");
- printf("7) Wyszukaj\n");
- printf("8) Wyszukaj po grupie\n");
- printf("9) Usun element\n");
- scanf("%d", &wybor);
- switch (wybor) {
- case 0:
- printf("Zegnam.\n");
- zwolnij_Listae(&program);
- break;
- case 1:
- wczytaj_z_csv(&program);
- break;
- case 2:
- zapisz_do_csv(&program);
- break;
- case 3:
- drukuj_Liste(program.Listaa);
- break;
- case 4:
- zmien_tryb_sortowania(&program);
- break;
- case 5:
- sortuj(&program);
- break;
- case 6:
- wstaw_z_klawiatury(&program);
- break;
- case 7:
- znajdz(&program);
- break;
- case 8:
- znajdz_grupe(&program);
- break;
- case 9:
- usun(&program);
- break;
- }
- } while (wybor != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement