Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdio.h"
- #include "stdlib.h"
- #include "string.h"
- typedef struct Dane_osoby Osoby;
- typedef struct Lista_osob Lista;
- Lista *stworz_element();
- void dodaj_na_poczatek(Lista**);
- void dodaj_na_koniec(Lista**);
- void wyswietlanie_listy(Lista*);
- void wybor(Lista*);
- char *string();
- void odczyt_z_pliku(Lista **start);
- void usun_liste(Lista **start);
- void usun_nazwisko(Lista **start);
- void sortowanie_po_nazwisku(Lista **start);
- struct Dane_osoby
- {
- char *imie, *nazwisko, *PESEL;
- int wiek;
- };
- struct Lista_osob
- {
- Osoby dane;
- Lista *poprzedni, *nastepny;
- };
- Lista *stworz_element()
- {
- Lista *element = (Lista*)malloc(sizeof(Lista)); // Alokacja pamięci na pojedyńczy element.
- element->poprzedni = NULL, element->nastepny = NULL;
- printf("Podaj imie: ");
- element->dane.imie = string();
- printf("Podaj nazwisko: ");
- element->dane.nazwisko = string();
- printf("Podaj numer PESEL: ");
- element->dane.PESEL = string();
- printf("Podaj wiek: ");
- scanf("%d", &(element->dane.wiek));
- getchar();
- return element;
- }
- void dodaj_na_poczatek(Lista **start)
- {
- Lista *tymczasowa = stworz_element(); // "tymczasowa" przechowuje stworzony element tzn. imie, nazwisko, PESEL, wiek oraz wskaźnik na element poprzedni i następny (NULL).
- if (*start != NULL) // Jeżeli istniejąca już lista nie jest pusta.
- {
- (*start)->poprzedni = tymczasowa; // Pierwszy element istniejącej listy wskazuje na element stworzony.
- tymczasowa->nastepny = *start; // Stworzony element wskazuje na początek istniejącej już listy.
- }
- *start = tymczasowa; // Listą "główną" staje się lista która posiada nowo stworzony element który znajduje się na początku listy (poprzedni = NULL, następny = istniejąca już lista/NULL).
- }
- void dodaj_na_koniec(Lista **start)
- {
- Lista *tymczasowa, *pomocnicza;
- tymczasowa = stworz_element(); // "tymczasowa" przechowuje nowo stworzony element listy.
- if (*start != NULL) // Jeżeli istniejąca lista nie jest pusta.
- {
- pomocnicza = *start;
- while (pomocnicza->nastepny != NULL) pomocnicza = pomocnicza->nastepny; // Dopóki wskaźnik na następny element pomocniczej (która wskazuje na istniejącą już liste) nie jest pusty.
- tymczasowa->poprzedni = pomocnicza; // Nowo stworzony element wskazuje na istniejącą już listę (poprzedni).
- pomocnicza->nastepny = tymczasowa; // Istniejąca już lista wskazuje na nowo stworzony element.
- return; // "Wychodzi" z funkcji. Istniejącą lista zostaje w swojej pierwotnej kolejności, jej ostatni element wskazuje na nowo stworzony element.
- }
- *start = tymczasowa; // Jeżeli istniejąca lista była pusta (nie było jej...), listą główną staje się stworzony element.
- }
- void wyswietlanie_listy(Lista *start)
- {
- Lista *tymczasowa = start;
- while (tymczasowa != NULL) // Dopóki tymczasowa (która wskazuje na liste już istniejącą) nie jest pusta.
- {
- printf("Imie: %s\n", tymczasowa->dane.imie);
- printf("Naziwsko: %s\n", tymczasowa->dane.nazwisko);
- printf("Wiek: %d\n", tymczasowa->dane.wiek);
- printf("Numer PESEL: %s\n", tymczasowa->dane.PESEL);
- printf("______________________________________________________________________________\n"); // Oddzielenie kolejnych osób.
- tymczasowa = tymczasowa->nastepny; // Przesunięcię na kolejną osobe, jezeli nie ma (czyli tymczasowa->następny wskazuje na NULL) wychodzi z pętli.
- }
- }
- void wyswietlanie_elementu(Lista *element) // Wyświetla pojedyńczy element (używana przy wyszukiwaniu osób o podanym nazwisku).
- {
- if (element != NULL)
- {
- printf("Imie: %s\n", element->dane.imie);
- printf("Naziwsko: %s\n", element->dane.nazwisko);
- printf("Wiek: %d\n", element->dane.wiek);
- printf("Numer PESEL: %s\n", element->dane.PESEL);
- printf("______________________________________________________________________________\n"); // Oddziela kolejne osoby.
- }
- }
- Lista *wyszukiwanie_po_nazwisku(Lista *start, char *nazwisko)
- {
- Lista *pomocnicza = start;
- while (pomocnicza != NULL && (strcmp(nazwisko, pomocnicza->dane.nazwisko) != 0)) pomocnicza = pomocnicza->nastepny;
- /*
- ^ Dopóki pomocnicza (wskazująca na istniejącą liste) nie jest pusta i funkcja porównująca nazwisko które ma być wyszukane z nazwiskiem z listy jest różne od 0
- to pomocnicza zostaje przesunięta na kolejną osobę.
- strcmp(napis1, napis2) zwraca 0 gdy napis1 jest taki sam jak napis2.
- */
- return pomocnicza;
- }
- void wyszukiwanie_wszystkich_o_nazwisku(Lista *start)
- {
- Lista *nazwiska = start;
- char *nazwisko;
- printf("Podaj jakie nazwisko chcesz wyszukac: ");
- nazwisko = string();
- system("cls");
- while (nazwiska != NULL) // Dopóki lista "nazwiska" (która wskazuje na początku na listę główną) nie jest pusta.
- {
- nazwiska = wyszukiwanie_po_nazwisku(nazwiska, nazwisko); // Wyszukuje pojedyńczy element który przechowuje szukane nazwisko.
- wyswietlanie_elementu(nazwiska); // Wyświetla pojedyńczy element.
- if (nazwiska != NULL) nazwiska = nazwiska->nastepny; // Jeżeli lista "nazwiska" nie jest pusta pętla się powtarza, wyszukuje nazwisko zaczynając od elementu który już wyświetliło.
- }
- nazwisko = NULL;
- free(nazwisko);
- }
- char* string()
- {
- char *napis, znak;
- znak = '\n';
- int i, j;
- i = 0;
- j = 1;
- napis = (char*)malloc(sizeof(char)); // Alokuje pamięć na pojedyńczy znak.
- do
- {
- znak = getchar(); // Pobiera pojedyńczy znak.
- napis = (char*)realloc(napis, j * sizeof(char)); // Zmienia rozmiar alokowanej pamięci dla napisu na j-znaków.
- napis[i] = znak; // Kolejne elementy tablicy znaków przyjmują kolejne zczytane z klawiatury znaki.
- i++; j++;
- } while (znak != '\n'); // Jeżeli zczytamy znak nowej lini (użytkownik wciśnie ENTER) kończymy pętle.
- napis[i-1] = '\0'; // Dodajemy znak kończący na koniec tablicy ([i-1] ponieważ przy ostatnim przejściu pętli i zostało zwiększone o 1).
- return napis; // Zwraca tablice znaków "napis".
- }
- void zapis_do_pliku(Lista *start)
- {
- printf("Podaj nazwe pliku: ");
- char *nazwa_pliku = string();
- FILE *zapis = fopen(nazwa_pliku, "w"); // Tworzy lub otwiera plik o podanej wcześniej nazwie do zapisu.
- if (zapis == NULL) // Jeżeli nie udało się otworzyć/stworzyć pliku.
- {
- printf("Blad przy tworzeniu/otwieraniu pliku!\n");
- return;
- }
- Lista *tymczasowa = start;
- while (tymczasowa != NULL) // Dopóki tymczasowa (wskazująca na listę główną) nie jest pusta.
- {
- fprintf(zapis, "%s", tymczasowa->dane.imie);
- fprintf(zapis, " %s", tymczasowa->dane.nazwisko);
- fprintf(zapis, " %d", tymczasowa->dane.wiek);
- fprintf(zapis, " %s\n", tymczasowa->dane.PESEL);
- // ^ Zapisuje kolejne dane do pliku.
- tymczasowa = tymczasowa->nastepny; // Przesunięcie tymczasowej na następny element.
- }
- fclose(zapis); // Zamyka plik.
- nazwa_pliku = NULL;
- free(nazwa_pliku); // Czyści pamięć po dynamicznie alokowanej nazwie pliku.
- printf("Lista zapisana do pliku!\n");
- }
- void odczyt_z_pliku(Lista **start)
- {
- Lista *pomocnicza;
- char bufor[100]; // Bufor pomocniczy.
- printf("Podaj nazwe pliku: ");
- char *nazwa_pliku = string();
- FILE *odczyt = fopen(nazwa_pliku, "r"); // Otwiera plik o podanej wcześniej nazwie do odczytu.
- if (odczyt == NULL) // Jeżeli nie udało się otworzyć pliku.
- {
- printf("Blad przy tworzeniu/otwieraniu pliku!");
- return;
- }
- while (fscanf(odczyt, "%s", bufor) != EOF) // Dopóki nie osiągnie końca pliku.
- {
- Lista *element = (Lista*)malloc(sizeof(Lista)); // Alokuje pamięć na pojedyńczy element.
- element->poprzedni, element->nastepny = NULL;
- element->dane.imie = (char*)malloc(sizeof(char) * strlen(bufor));
- strcpy(element->dane.imie, bufor);
- fscanf(odczyt, "%s", bufor);
- element->dane.nazwisko = (char*)malloc(sizeof(char) * strlen(bufor));
- strcpy(element->dane.nazwisko, bufor);
- fscanf(odczyt, "%d", &(element->dane.wiek));
- fscanf(odczyt, "%s", bufor);
- element->dane.PESEL = (char*)malloc(sizeof(char) * strlen(bufor));
- strcpy(element->dane.PESEL, bufor);
- // strlen(napis) funkcja zwraca rozmiar tablicy znaków.
- // strcpy(napis1, napis2) funkcja kopiuje znak po znaku aż do znaku kończącego '\0'.
- if (*start != NULL) // Jeżeli lista główna nie jest pusta.
- {
- pomocnicza = *start;
- while (pomocnicza->nastepny != NULL) pomocnicza = pomocnicza->nastepny; // Przesuwa liste pomocniczą (wskazującą na listę główną) aż osiagnie jej koniec.
- element->poprzedni = pomocnicza; // Nowo stworzony element (z danymi z pliku) znajduje się na końcu listy głównej i wskazuje na nią.
- pomocnicza->nastepny = element; // Lista główna wskazuje na nowo stworzony element.
- }
- else
- {
- *start = element; // Jeżeli lista główna była pusta.
- (*start)->poprzedni = NULL, (*start)->nastepny = NULL;
- }
- }
- fclose(odczyt); // Zamyka plik.
- nazwa_pliku = NULL;
- free(nazwa_pliku); // Czyści pamięć po dynamicznie alokowanej nazwie pliku.
- printf("Lista zostala wczytana z pliku.\n");
- }
- void usun_liste(Lista **start)
- {
- Lista *do_usuniecia;
- while (*start != NULL) // Dopóki lista główna nie jest pusta.
- {
- do_usuniecia = *start;
- *start = (*start)->nastepny; // Przesunięcie listy głównej na następny element.
- if (do_usuniecia->dane.imie)
- {
- do_usuniecia->dane.imie = NULL;
- free(do_usuniecia->dane.imie);
- }
- if (do_usuniecia->dane.nazwisko)
- {
- do_usuniecia->dane.nazwisko = NULL;
- free(do_usuniecia->dane.nazwisko);
- }
- if (do_usuniecia->dane.PESEL)
- {
- do_usuniecia->dane.PESEL = NULL;
- free(do_usuniecia->dane.PESEL);
- }
- // ^ Usuwa kolejne dane (czyści pamięć).
- free(do_usuniecia); // Usuwa cały element (czyści pamięć).
- }
- }
- void usun_nazwisko(Lista **start)
- {
- Lista *pomocnicza;
- Lista *nazwiska;
- char *nazwisko;
- printf("Podaj osobe z jakim nazwiskiem chcesz usunac z listy: ");
- nazwisko = string();
- system("cls");
- nazwiska = wyszukiwanie_po_nazwisku(*start, nazwisko); // "nazwiska" będzie przechowywać element listy z osobą o danym nazwisku.
- if (nazwiska == NULL) // Jeżeli nie ma szukanej osoby na liście.
- {
- printf("Brak osob o podanym nazwisku!\n");
- system("pause");
- system("cls");
- }
- else
- {
- if (nazwiska == *start) // Jeżeli na liście jest tylko jedna osoba (i posiada wyszukiwane nazwisko).
- {
- *start = (*start)->nastepny;
- if (nazwiska->dane.imie)
- {
- nazwiska->dane.imie = NULL;
- free(nazwiska->dane.imie);
- }
- if (nazwiska->dane.nazwisko)
- {
- nazwiska->dane.nazwisko = NULL;
- free(nazwiska->dane.nazwisko);
- }
- if (nazwiska->dane.PESEL)
- {
- nazwiska->dane.PESEL = NULL;
- free(nazwiska->dane.PESEL);
- }
- // ^ Usuwa dane szukanej osoby (czyści pamięć).
- free(nazwiska); // Usuwa element z listy (czyści pamięć).
- }
- else
- {
- pomocnicza = *start;
- while ((strcmp(pomocnicza->nastepny->dane.nazwisko, nazwiska->dane.nazwisko) != 0)) pomocnicza = pomocnicza->nastepny; // Dopóki nie znajdzie na liście pomocniczej nazwiska.
- if (nazwiska->nastepny != NULL) pomocnicza->nastepny->poprzedni = nazwiska->poprzedni;
- // ^ Jeżeli element z osobą o szukanym nazwisku nie był ostatni to następny element listy pomocniczej jako wskaźnik na element poprzedni przechowuje wskaźnik na poprzedni element
- // listy która zaczyna się od elementu z wyszukanym nazwiskiem.
- pomocnicza->nastepny = nazwiska->nastepny;
- if (nazwiska->dane.imie)
- {
- nazwiska->dane.imie = NULL;
- free(nazwiska->dane.imie);
- }
- if (nazwiska->dane.nazwisko)
- {
- nazwiska->dane.nazwisko = NULL;
- free(nazwiska->dane.nazwisko);
- }
- if (nazwiska->dane.PESEL)
- {
- nazwiska->dane.PESEL = NULL;
- free(nazwiska->dane.PESEL);
- }
- // ^ Usuwa dane szukanej osoby (czyści pamięć).
- free(nazwiska); // Usuwa element z listy (czyści pamięć).
- }
- }
- printf("Osoba usunieta.\n");
- system("pause");
- system("cls");
- }
- void sortowanie_po_nazwisku(Lista **start)
- {
- Lista *tymczasowa, *pomocnicza;
- Lista *nowa = NULL;
- while (*start != NULL)
- {
- tymczasowa = (Lista*)malloc(sizeof(Lista));
- tymczasowa->dane.imie = (char*)malloc(sizeof(char)* strlen((*start)->dane.imie) + 1);
- strcpy(tymczasowa->dane.imie, (*start)->dane.imie);
- tymczasowa->dane.nazwisko = (char*)malloc(sizeof(char)* strlen((*start)->dane.nazwisko) + 1);
- strcpy(tymczasowa->dane.nazwisko, (*start)->dane.nazwisko);
- tymczasowa->dane.PESEL = (char*)malloc(sizeof(char)* strlen((*start)->dane.PESEL) + 1);
- strcpy(tymczasowa->dane.PESEL, (*start)->dane.PESEL);
- tymczasowa->dane.wiek = (*start)->dane.wiek;
- tymczasowa->nastepny = NULL;
- tymczasowa->poprzedni = NULL;
- if (nowa == NULL)
- nowa = tymczasowa;
- else if (strcmp(nowa->dane.nazwisko, tymczasowa->dane.nazwisko) > 0)
- {
- tymczasowa->nastepny = nowa;
- nowa->poprzedni = tymczasowa;
- nowa = tymczasowa;
- }
- else
- {
- pomocnicza = nowa;
- while (pomocnicza->nastepny != NULL && strcmp(pomocnicza->nastepny->dane.nazwisko, tymczasowa->dane.nazwisko) < 0)
- pomocnicza = pomocnicza->nastepny;
- tymczasowa->poprzedni = pomocnicza;
- tymczasowa->nastepny = pomocnicza->nastepny;
- if (pomocnicza->nastepny != NULL)
- pomocnicza->nastepny->poprzedni = tymczasowa;
- pomocnicza->nastepny = tymczasowa;
- }
- pomocnicza = *start;
- *start = (*start)->nastepny;
- if (pomocnicza->dane.imie)
- {
- pomocnicza->dane.imie = NULL;
- free(pomocnicza->dane.imie);
- }
- if (pomocnicza->dane.nazwisko)
- {
- pomocnicza->dane.nazwisko = NULL;
- free(pomocnicza->dane.nazwisko);
- }
- if (pomocnicza->dane.PESEL)
- {
- pomocnicza->dane.PESEL = NULL;
- free(pomocnicza->dane.PESEL);
- }
- free(pomocnicza);
- // ^ Usuwanie i czyszczenie pamięci po liście pomocniczej.
- }
- *start = nowa;
- }
- void wybor(Lista *start)
- {
- char wb, tn;
- do
- {
- printf("1. Dodaj nowy element na poczatek listy.\n");
- printf("2. Dodaj nowy element na koniec listy.\n");
- printf("3. Wyswietl liste.\n");
- printf("4. Wyszukaj wszystkich o nazwisku.\n");
- printf("5. Zapis do pliku tekstowego.\n");
- printf("6. Pobierz dane z pliku tekstowego.\n");
- printf("7. Usun osobe o danym nazwisku.\n");
- printf("8. Posortuj liste alfabetycznie po nazwisku.\n");
- printf("9. Wyczysc liste.\n");
- printf("0. Wyjdz\n");
- wb = getchar();
- getchar();
- switch (wb)
- {
- case '0':
- printf("Koncze dzialanie programu...\n");
- break;
- case '1':
- printf("Dodaje element na poczatek listy...\n");
- dodaj_na_poczatek(&start);
- system("cls");
- break;
- case '2':
- printf("Dodaje element na koniec listy...\n");
- dodaj_na_koniec(&start);
- system("cls");
- break;
- case '3':
- printf("Wyswietlam liste...\n");
- wyswietlanie_listy(start);
- getchar();
- system("cls");
- break;
- case '4' :
- wyszukiwanie_wszystkich_o_nazwisku(start);
- getchar();
- system("cls");
- break;
- case '5' :
- zapis_do_pliku(start);
- system("pause");
- system("cls");
- break;
- case '6' :
- printf("Czy wyczyscic liste przed dodadniem?[T/t]");
- tn = getchar();
- if (tn == 't' || tn == 'T') usun_liste(&start);
- getchar();
- odczyt_z_pliku(&start);
- system("pause");
- system("cls");
- break;
- case '7' :
- usun_nazwisko(&start);
- break;
- case '8' :
- sortowanie_po_nazwisku(&start);
- printf("Lista zostala posortowana.\n");
- system("pause");
- system("cls");
- break;
- case '9' :
- usun_liste(&start);
- printf("Lista zostala wyczyszczona.\n");
- system("pause");
- system("cls");
- break;
- default:
- printf("Zly wybor!\n");
- getchar();
- system("cls");
- break;
- }
- } while (wb != '0');
- }
- int main()
- {
- Lista *start = NULL;
- wybor(start);
- usun_liste(&start);
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment