Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.40 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <limits>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. struct student
  9. {
  10.     char Nazwisko[100];
  11.     char Imie[100];
  12.     float MatematykaOcena;
  13.     float FizykaOcena;
  14. };
  15.  
  16. struct lista_studentow
  17. {
  18.     lista_studentow *s_up;    // Wskaźnik na górny element listy (gdy elementu nie ma równe 0)
  19.     student s;        // Dane studenta
  20.     lista_studentow *s_down;// Wskaźnik na dolny element listy (gdy elementu nie ma równe 0)
  21. };
  22.  
  23. void UstawStudenta(lista_studentow &st){ // funkcja ustawiająca elementy listy
  24.     cout<<"Podaj nazwisko studenta: ";
  25.     cin>>st.s.Nazwisko;
  26.     cout<<"Podaj imie studenta: ";
  27.     cin>>st.s.Imie;
  28.     cout<<"Ocena koncowa z matematyki: ";
  29.     cin>>st.s.MatematykaOcena;
  30.     cout<<"Ocena koncowa z fizyki: ";
  31.     cin>>st.s.FizykaOcena;
  32. }
  33.  
  34. void DodajStudenta(lista_studentow **s /*pobiera wskaźnik do adresu pierwszego elementu listy dwukierunkowej*/){
  35.     lista_studentow* t = *s; // tymczasowa zmienna pomocnicza, do której przypisany zostanie adres pierwszego elementu listy
  36.     if(*s){ // jeżeli adres pierwszego elementu listy nie jest równy 0 to
  37.         lista_studentow* st = new lista_studentow; // utwórz nowy element listy
  38.         UstawStudenta(*st);    // ustaw jego wartości
  39.         while(t->s_down){    // tutaj znajdowanie ostatniego elementu listy
  40.             t = t->s_down;
  41.         }
  42.         st->s_up = t;    // przypisanie polu s_up nowego elementu listy adresu ostatniego elementu listy
  43.         st->s_down = 0;    // przypisanie polu s_down nowego elementu listy wartości zero (ponieważ stanie się on ostatnim elementem listy)
  44.         t->s_down = st;    // przypisanie staremu ostatniemu elementowi listy adresu nowego ostatniego elementu listy
  45.     }else{ // w przeciwnym przypadku, gdy lista jest pusta to
  46.         *s = new lista_studentow;    // utwórz nowy element listy
  47.         UstawStudenta(**s);        // ustaw go
  48.         (*s)->s_up = NULL;        // wyzerowanie adresu wskaźnika s_up
  49.         (*s)->s_down = NULL;        // wyzerowanie adresu wskaźnika s_down
  50.     }
  51. }
  52.  
  53.  
  54. void UsunStudenta(lista_studentow **s/*wskaźnik na adres pierwszego elementu listy*/, int index /*numer elementu usuwanego*/){
  55.     if(*s && index > -1){ // jeżeli index jest większy od zera i wskaźnik na pierwszy element listy nie jest zerowy to
  56.         lista_studentow *indx = *s;    // tworzę kopię adresu wskazania na pierwszy element  listy
  57.         for(int i = 1; i <=index; i++){ // tutaj szukam indeksu o podanym numerze
  58.             indx = indx->s_down;
  59.         }
  60.         if(!indx->s_up && !indx->s_down){ // jeżeli oba wskaźniki s_up i s_down są zerowe to
  61.             delete indx; // usuwam index
  62.             *s = 0; // przypisuję zerowy adres wskazania do listy (lista pusta)
  63.         }else if(index == 0){ // gdy index usuwanego elementu równy 0 to
  64.             *s = (*s)->s_down; // przypisanie adresu wskazania na element znajdujący się pod wskaźnikiem s_down
  65.             delete indx; // zwolnienie pamięci
  66.             indx = 0;
  67.         }else if(indx->s_up && indx->s_down){ // gdy dany element listy ma nad i pod sobą elementy listy to
  68.             indx->s_up->s_down = indx->s_down;    // przypisywanie adresu dla górnego elementu
  69.             indx->s_down->s_up = indx->s_up;    // przypisywanie adresu dla dolnego elementu
  70.             delete indx;    // zwalnianie pamięci
  71.             indx = 0;
  72.         }else if(!indx->s_down){    // gdy element listy nie ma pod sobą żadnego elementu listy to
  73.             indx->s_up->s_down = 0;    // element górny musi mieć przypisany adres zerowy
  74.             delete indx;        // zwalniam pamięć
  75.             indx = 0;
  76.         }
  77.     }
  78. }
  79.  
  80.  
  81.  
  82. void WypiszStudentow(lista_studentow *s){
  83.     if(s){
  84.         cout<<"=========================================================\n";
  85.         do{
  86.             cout<<"Podaj nazwisko studenta: "<<s->s.Nazwisko<<endl;
  87.             cout<<"Podaj imie studenta: "<<s->s.Imie<<endl;
  88.             cout<<"Ocena koncowa z matematyki: "<<s->s.MatematykaOcena<<endl;
  89.             cout<<"Ocena koncowa z fizyki: "<<s->s.FizykaOcena<<endl;
  90.             cout<<"=========================================================\n";
  91.             s = s->s_down;
  92.         }while(s);
  93.     }
  94. }
  95.  
  96. void ZwolnijPamiec(lista_studentow **s/*wskaźnik do adresu pierwszego elementu listy*/){
  97.     lista_studentow *temp; // zmienna pomocnicza
  98.     while(*s){ // dopóki s nie wskazuje na zerowy adres pamięci
  99.         temp = (*s)->s_down; // przepisywanie pamięci elementu o 1 pozycję niżej niż *s
  100.         delete (*s); // zwalnianie pamięci
  101.         *s = temp; // przypisywanie adresu poprzednio zapamiętanej
  102.     }
  103. }
  104.  
  105.  
  106. int main(){
  107.     lista_studentow *s = 0;    // wskaźnik na pierwszy element listy
  108.  
  109.     DodajStudenta(&s);    // dodawanie pierwszego studenciaka
  110.     DodajStudenta(&s);    // drugiego
  111.     DodajStudenta(&s);    // trzeciego
  112.  
  113.     WypiszStudentow(s);    // wypisywanie studenciaków
  114.  
  115.     cout<<endl<<"Usuwanie studenta"<<endl;
  116.  
  117.     UsunStudenta(&s,1);    // usuwanie studenciaka o indeksie 1
  118.  
  119.     WypiszStudentow(s);    // znów wypisywanie
  120.  
  121.     ZwolnijPamiec(&s);    // zwalnianie pamięci
  122.  
  123.     WypiszStudentow(s);    // wypisywanie (żeby sprawdzić czy zwolniło)
  124.  
  125.     if(!s) // to też oznacza zwolnienie pamięci
  126.         cout<<"Zwolniono pamiec";
  127.  
  128.     cout<<"Wcisnij enter, aby zamknac program...";
  129.     cin.get();
  130.  
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement