Advertisement
Guest User

Untitled

a guest
Apr 6th, 2020
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. using namespace std;
  5.  
  6. struct lista
  7. {
  8.     string imie;
  9.     string nazwisko;
  10.     string PESEL;
  11.     int wiek;
  12.  
  13. };
  14.  
  15. struct lista_osob
  16. {
  17.     lista_osob* nast;      // Wskaźnik na górny element listy (gdy elementu nie ma równe 0)
  18.     lista s;                    // Dane studenta
  19.     lista_osob* pop;       // Wskaźnik na dolny element listy (gdy elementu nie ma równe 0)
  20. };
  21.  
  22.  
  23. void Ustaw(lista_osob& st) { // funkcja ustawiająca elementy listy
  24.     cout << "=========================================================\n";
  25.     cout << "Podaj nazwisko: ";
  26.     cin >> st.s.nazwisko;
  27.     cout << "Podaj imie: ";
  28.     cin >> st.s.imie;
  29.     cout << "Podaj pesel: ";
  30.     cin >> st.s.PESEL;
  31.     cout << "Podaj wiek: ";
  32.     cin >> st.s.wiek;
  33.     cout << "=========================================================\n";
  34. }
  35.  
  36. void Dodaj(lista_osob** s /*pobiera wskaźnik do adresu pierwszego elementu listy dwukierunkowej*/) {
  37.  
  38.     lista_osob* t = *s; // tymczasowa zmienna pomocnicza, do której przypisany zostanie adres pierwszego elementu listy
  39.  
  40.     if (*s) { // jeżeli adres pierwszego elementu listy nie jest równy 0 to
  41.  
  42.         lista_osob* st = new lista_osob; // utwórz nowy element listy
  43.  
  44.         Ustaw(*st); // ustaw jego wartości
  45.  
  46.         while (t->pop) {    // tutaj znajdowanie ostatniego elementu listy
  47.  
  48.             t = t->pop;
  49.  
  50.         }
  51.  
  52.         st->nast = t;   // przypisanie polu s_up nowego elementu listy adresu ostatniego elementu listy
  53.  
  54.         st->pop = 0;    // przypisanie polu s_down nowego elementu listy wartości zero (ponieważ stanie się on ostatnim elementem listy)
  55.  
  56.         t->pop = st;    // przypisanie staremu ostatniemu elementowi listy adresu nowego ostatniego elementu listy
  57.  
  58.     }else { // w przeciwnym przypadku, gdy lista jest pusta to
  59.  
  60.         *s = new lista_osob;    // utwórz nowy element listy
  61.  
  62.         Ustaw(**s);     // ustaw go
  63.  
  64.         (*s)->nast = NULL;      // wyzerowanie adresu wskaźnika s_up
  65.  
  66.         (*s)->pop = NULL;       // wyzerowanie adresu wskaźnika s_down
  67.  
  68.     }
  69.  
  70. }
  71.  
  72.  
  73. void Usun(lista_osob** s/*wskaźnik na adres pierwszego elementu listy*/, string szukane) {
  74.  
  75.  
  76.         lista_osob* indx = *s;  // tworzę kopię adresu wskazania na pierwszy element  listy
  77.         while (true) {
  78.             if (indx->s.nazwisko == szukane) {
  79.                 break;
  80.             }
  81.             else {
  82.                 indx = indx->pop;
  83.             }
  84.         }
  85.  
  86.         if (!indx->nast && !indx->pop) { // jeżeli oba wskaźniki s_up i s_down są zerowe to
  87.  
  88.             delete indx; // usuwam index
  89.  
  90.             *s = 0; // przypisuję zerowy adres wskazania do listy (lista pusta)
  91.  
  92.         }
  93.         else if (indx->pop) { // gdy index usuwanego elementu równy 0 to
  94.             *s = (*s)->pop; // przypisanie adresu wskazania na element znajdujący się pod wskaźnikiem s_down
  95.             delete indx; // zwolnienie pamięci
  96.             indx = 0;
  97.         }
  98.         else if (indx->nast && indx->pop) { // gdy dany element listy ma nad i pod sobą elementy listy to
  99.  
  100.             indx->nast->pop = indx->pop;    // przypisywanie adresu dla górnego elementu
  101.  
  102.             indx->nast->nast = indx->nast;  // przypisywanie adresu dla dolnego elementu
  103.  
  104.             delete indx;    // zwalnianie pamięci
  105.  
  106.             indx = 0;
  107.  
  108.         }
  109.         else if (!indx->pop) {  // gdy element listy nie ma pod sobą żadnego elementu listy to
  110.  
  111.             indx->nast->pop = 0;    // element górny musi mieć przypisany adres zerowy
  112.  
  113.             delete indx;        // zwalniam pamięć
  114.  
  115.             indx = 0;
  116.  
  117.         }
  118.  
  119.     }
  120.  
  121.  
  122. void UsunNazwiska(lista_osob** s/*wskaźnik do adresu pierwszego elementu listy*/, string szukane) {
  123.     lista_osob* temp; // zmienna pomocnicza
  124.     while (*s) { // dopóki s nie wskazuje na zerowy adres pamięci
  125.         temp = (*s)->pop; // przepisywanie pamięci elementu o 1 pozycję niżej niż *s
  126.         if (temp->s.nazwisko == szukane) {
  127.             delete (*s); // zwalnianie pamięci
  128.             *s = temp; // przypisywanie adresu poprzednio zapamiętanej
  129.         }
  130.         else {
  131.             *s = temp; // przypisywanie adresu poprzednio zapamiętanej
  132.         }
  133.        
  134.     }
  135.  
  136. }
  137.  
  138.  
  139. void Wypisz(lista_osob* s) {
  140.     if (s) {
  141.         cout << "=========================================================\n";
  142.         do {
  143.             cout << "nazwisko: " << s->s.nazwisko << endl;
  144.             cout << "imie: " << s->s.imie << endl;
  145.             cout << "pesel: " << s->s.PESEL << endl;
  146.             cout << "wiek: " << s->s.wiek << endl;
  147.             cout << "=========================================================\n";
  148.             s = s->pop;
  149.         } while (s);
  150.     }
  151. }
  152.  
  153. void ZapiszDoPliku(lista_osob* s) {
  154.     fstream plik;
  155.     plik.open("Dane.txt", fstream::out);
  156.     if (s) {
  157.         plik << "=========================================================\n";
  158.         do {
  159.             plik << "nazwisko: " << s->s.nazwisko << endl;
  160.             plik << "imie: " << s->s.imie << endl;
  161.             plik << "pesel: " << s->s.PESEL << endl;
  162.             plik << "wiek: " << s->s.wiek << endl;
  163.             plik << "======================================================\n";
  164.             s = s->pop;
  165.         } while (s);
  166.     }
  167.     plik.close();
  168. }
  169.  
  170.  
  171. int main()
  172. {
  173.     char decyzja;
  174.     int wybor;
  175.     lista_osob* s = 0;
  176.     string nazwisko;
  177.     do {
  178.         cout << "Menu:" << endl;
  179.         cout << "1: Dodaj element" << endl;
  180.         cout << "2: Usun element o podanym nazwisku" << endl;
  181.         cout << "3: Usun wszystkie elementy o podanym nazwisku" << endl;
  182.         cout << "4: Wyswietl liste" << endl;
  183.         cout << "5: Edytuj wybrany element" << endl;
  184.         cout << "6: Zapisz elementy listy do pliku" << endl;
  185.         cout << "7: Wyszukaj element listy" << endl;
  186.         cout << "Wybierz: ";
  187.         cin >> wybor;
  188.         switch (wybor) {
  189.         case 1:
  190.             Dodaj(&s);
  191.             break;
  192.         case 2:
  193.             cout << "Podaj nazwisko do usuniecia: ";
  194.             cin >> nazwisko;
  195.             Usun(&s, nazwisko);
  196.             break;
  197.         case 3:
  198.             cout << "W trakcie budowy, zapraszamy później";
  199.             /*
  200.             cout << "Podaj nazwisko do usuniecia: ";
  201.             cin >> nazwisko;
  202.             UsunNazwiska(&s, nazwisko);
  203.             */
  204.             break;
  205.         case 4:
  206.             Wypisz(s);
  207.             break;
  208.         case 5:
  209.             cout << "W trakcie budowy, zapraszamy później";
  210.             break;
  211.         case 6:
  212.             ZapiszDoPliku(s);
  213.             break;
  214.         case 7:
  215.             cout << "W trakcie budowy, zapraszamy później";
  216.             break;
  217.         default:
  218.             break;
  219.         }
  220.  
  221.  
  222.  
  223.     cout << "Czy wyswietlic menu jeszcze raz? (t/n): ";
  224.     cin >> decyzja;
  225.     } while (decyzja == 't');
  226.  
  227.  
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement