Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- class Lista_oczekujaca{
- public:
- struct wezel_oczekujacy{
- string nazwa;
- int przesuniecie;
- int nowe_przesuniecie;
- };
- int ile;
- int roz_tab; // rozmiar tablicy
- int akt ; // aktualny numer tablicy liczony od 0
- // int skok; // oznacza o ile mamy sie przesunać
- wezel_oczekujacy * w2; // wezel oczekujacy ktory bedzie inicjalizowany tylko dla oczekujacych wartosci
- Lista_oczekujaca(int p); // p - ilosc slow potrzebnych na dodanie
- ~Lista_oczekujaca();
- void dodaj_oczekujacy(string nazwa, int przesuniecie, int nowe_przesuniecie); // dodaje element na koniec
- void usun_oczekujacy(); // usuwa element o indeksie akt i inkrementuje akt
- bool empty(); // sprawdza czy pusty
- void wyswietl_oczekujacy();
- void wyswietl();
- };
- Lista_oczekujaca :: Lista_oczekujaca (int p){
- ile = 0;
- roz_tab = p;
- akt = 0;
- w2 = new wezel_oczekujacy[p];
- }
- Lista_oczekujaca ::~ Lista_oczekujaca (){
- delete [] w2;
- }
- void Lista_oczekujaca :: dodaj_oczekujacy(string nazwa, int przesuniecie, int nowe_przesuniecie){
- w2[ile].nazwa = nazwa;
- w2[ile].przesuniecie = przesuniecie;
- w2[ile].nowe_przesuniecie = nowe_przesuniecie;
- ile++;
- }
- void Lista_oczekujaca :: usun_oczekujacy(){
- for(int i = akt ; i <ile-1; i ++){
- w2[i].nazwa = w2[i+1].nazwa;
- w2[i].przesuniecie = w2[i+1].przesuniecie;
- w2[i].nowe_przesuniecie = w2[i+1].nowe_przesuniecie;
- }
- ile--;
- }
- bool Lista_oczekujaca :: empty (){
- if (ile ==0)
- return true ;
- else
- return false ;
- }
- void Lista_oczekujaca :: wyswietl_oczekujacy(){
- cout<< w2[akt].nazwa;
- }
- //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- class Lista{
- public:
- struct wezel{
- string nazwa;
- int przesuniecie;
- };
- int tmp; // zluzy jako wartosc tymczasowa dla elementu przesun ktory bedziemy usuwac
- int reszta; // sluzy jako
- int ile; // oznacza ile elementow jest aktualnie w tablicy
- int roz_tab; // rozmiar tablicy
- int akt; // aktualny numer tablicy liczony od 0
- wezel * w1; // wskaznik na wezel ktory bedziemy inicjalizowac w konstruktorze
- // int skok; // oznacza o ile mamy sie przesunać
- Lista(int n, int s); // n - ilosc elementow, s - element od ktorego zaczynamy
- ~Lista();
- void dodaj(string nazwa, int przesuniecie); // dodaje element na koniec
- void usun(int tmp_akt); // usuwa element o indeksie akt
- bool empty(); // sprawdza czy pusty
- void wyswietl();
- void pokaz_liste();
- void przesun();
- int aktualny() { return akt;}
- void wstaw_w_luke(string nazwa, int przesuniecie, int nowe_przesuniecie);
- void licz_akt_poz();
- };
- Lista :: Lista (int n, int s){
- tmp =0;
- reszta = 0;
- ile=0;
- roz_tab = n;
- akt = s;
- w1 = new wezel[n];
- }
- Lista ::~ Lista (){
- delete [] w1;
- }
- void Lista :: dodaj(string nazwa, int przesuniecie){
- if(ile == roz_tab-1){
- roz_tab += 10;
- wezel * tab_pom = new wezel[roz_tab];
- for(int i=0; i<ile; i++){
- tab_pom[i].nazwa = w1[i].nazwa;
- tab_pom[i].przesuniecie = w1[i].przesuniecie;
- }
- delete [] w1;
- w1 = tab_pom;
- }
- w1[ile].nazwa = nazwa;
- w1[ile].przesuniecie = przesuniecie;
- ile++;
- }
- void Lista :: usun(int tmp_akt){
- tmp = w1[tmp_akt].przesuniecie;
- for(int i = tmp_akt ; i <ile; i++){
- w1[i].nazwa = w1[i+1].nazwa;
- w1[i].przesuniecie = w1[i+1].przesuniecie;
- }
- ile--;
- }
- bool Lista :: empty (){
- if (ile == 0)
- return true ;
- else
- return false ;
- }
- void Lista :: wyswietl(){
- cout<< w1[akt].nazwa << " ";
- }
- void Lista :: pokaz_liste(){
- for(int i=0; i< ile; i++){
- cout << w1[i].nazwa << w1[i].przesuniecie << endl;
- }
- }
- void Lista :: przesun(){
- // ile ++;
- // na poczatek trzeba przesunac cala liste do przodu by zrobic miejsce
- if(ile == roz_tab){
- roz_tab += 10;
- wezel * tab_pom = new wezel[roz_tab - akt +1];
- for(int i=0; i<akt; i++){
- tab_pom[i].nazwa = w1[i].nazwa;
- tab_pom[i].przesuniecie = w1[i].przesuniecie;
- }
- for(int i=akt; i<ile+1; i++){
- tab_pom[i+1].nazwa = w1[i].nazwa;
- tab_pom[i+1].przesuniecie = w1[i].przesuniecie;
- }
- delete [] w1;
- w1 = tab_pom;
- }else{
- for(int i = ile;i > akt ;i--){
- w1[i].nazwa = w1[i-1].nazwa;
- w1[i].przesuniecie = w1[i-1].przesuniecie;
- }
- }
- }
- void Lista :: wstaw_w_luke(string nazwa, int przesuniecie, int nowe_przesuniecie){
- cout << "akt : " << akt << endl;
- cout.flush();
- w1[akt].nazwa = nazwa;
- w1[akt].przesuniecie = przesuniecie;
- // cout<< endl<<w1[akt].nazwa<< " " << w1[akt].przesuniecie << endl;
- // akt++; // przesuwa sie by znowu wyladowac na elemencie ktory zmienialismy
- w1[akt].przesuniecie = nowe_przesuniecie;
- }
- void Lista :: licz_akt_poz(){
- if(ile == 1)
- akt = 0;
- else if(w1[akt].przesuniecie< 0){
- reszta = (-w1[akt].przesuniecie)%ile;
- if(reszta > akt)
- akt += (ile-reszta);
- else
- akt -= reszta;
- }else{
- int liczba = (w1[akt].przesuniecie + akt)%ile;
- if(liczba == 0)
- akt = ile;
- else
- akt = liczba;
- }
- }
- //#############################################################
- int main()
- {
- ios_base::sync_with_stdio(false);
- int n,s,p;
- string nazwa;
- int przesuniecie;
- int nowe_przesuniecie;
- cin >> n >> s;
- Lista l1(n,s);
- for(int i=0; i<n; i++){
- cin >> nazwa >> przesuniecie;
- l1.dodaj(nazwa, przesuniecie);
- }
- cin >> p;
- static Lista_oczekujaca l2(p);
- for(int i=0; i<p; i++){
- cin >> nazwa >> przesuniecie >> nowe_przesuniecie;
- l2.dodaj_oczekujacy(nazwa,przesuniecie, nowe_przesuniecie);
- }
- int tmp_akt = 0;
- while(!l1.empty()){
- tmp_akt = l1.aktualny();
- if(l1.w1[tmp_akt].przesuniecie == 0){
- l1.przesun();
- // cout << endl << l2.w2[0].nazwa << " " << l2.w2[0].przesuniecie << " " << l2.w2[0].nowe_przesuniecie << endl;
- l1.wstaw_w_luke(l2.w2[0].nazwa,l2.w2[0].przesuniecie,l2.w2[0].nowe_przesuniecie);
- l2.usun_oczekujacy();
- l1.licz_akt_poz();
- }
- l1.wyswietl();
- cout.flush();
- l1.licz_akt_poz();
- l1.usun(tmp_akt);
- // cout << "@@@@@@@@@@" << endl;
- // l1.pokaz_liste();
- // cout << "@@@@@@@@@@" << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement