Sprawdź się
Zapisz metody zwrocGlowa() i zwrocOgon, które zwrócą wartości zapisane odpowiednio w pierwszym i ostatnim elemencie listy niecyklicznej jednokierunkowej bez ich usuwania. Jeżeli lista jest pusta, metody powinny zwrócić minimalną wartość całkowitą.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 3, 5, 8.
Poprawny wynik działania programu:
Głowa: 3
Ogon: 8Wykorzystaj wskaźnik glowa oraz pętlę przechodzącą listę do końca.
#include <iostream>
#include <climits>
using namespace std;
typedef struct Wezel {
int liczba;
Wezel *nastepny;
Wezel(int liczba) {
this->liczba = liczba;
this->nastepny = nullptr;
}
} Wezel;
class Lista {
public:
Wezel* glowa;
Lista(): glowa(nullptr) {}
void dodaj(int);
int zwrocGlowa();
int zwrocOgon();
};
void Lista::dodaj(int liczba) {
Wezel* nowy = new Wezel(liczba);
if (glowa == nullptr) {
glowa = nowy;
return;
}
Wezel* pomocniczy = glowa;
while (pomocniczy->nastepny != nullptr) {
pomocniczy = pomocniczy->nastepny;
}
pomocniczy->nastepny = nowy;
}
int Lista::zwrocGlowa() {
if (glowa != nullptr)
return glowa->liczba;
return INT_MIN;
}
int Lista::zwrocOgon() {
if (glowa == nullptr) return INT_MIN;
Wezel *pomocniczy = glowa;
while (pomocniczy->nastepny != nullptr) {
pomocniczy = pomocniczy->nastepny;
}
return pomocniczy->liczba;
}
int main() {
Lista lista;
lista.dodaj(3);
lista.dodaj(5);
lista.dodaj(8);
cout << "Głowa: " << lista.zwrocGlowa() << endl;
cout << "Ogon: " << lista.zwrocOgon() << endl;
return 0;
}Zapisz metodę podajRozmiar(), która zwróci liczbę elementów zapisanych w liście niecyklicznej jednokierunkowej.
Działanie programu przetestuj dla listy jednokierunkowej, do której dodasz kolejno wartości 1, 2, 3.
Poprawny wynik działania programu:
Rozmiar: 3Wykorzystaj wskaźnik pomocniczy oraz pętlę przechodzącą listę do końca.
#include <iostream>
using namespace std;
typedef struct Wezel {
int liczba;
Wezel *nastepny;
Wezel(int liczba) {
this->liczba = liczba;
this->nastepny = nullptr;
}
} Wezel;
class Lista {
public:
Wezel* glowa;
Lista(): glowa(nullptr) {}
void dodaj(int);
int podajRozmiar();
};
void Lista::dodaj(int liczba) {
Wezel* nowy = new Wezel(liczba);
if (glowa == nullptr) {
glowa = nowy;
return;
}
Wezel* pomocniczy = glowa;
while (pomocniczy->nastepny != nullptr) {
pomocniczy = pomocniczy->nastepny;
}
pomocniczy->nastepny = nowy;
}
int Lista::podajRozmiar() {
Wezel *pomocniczy = glowa;
int rozmiar = 0;
if (glowa == nullptr) return 0;
while (pomocniczy != nullptr) {
pomocniczy = pomocniczy->nastepny;
rozmiar++;
}
return rozmiar;
}
int main() {
Lista lista;
lista.dodaj(1);
lista.dodaj(2);
lista.dodaj(3);
cout << "Rozmiar: " << lista.podajRozmiar() << endl;
return 0;
}Zapisz metodę usunOstatni(), która usuwać będzie ostatni element listy niecyklicznej jednokierunkowej i zwróci zapisaną w nim wartość lub minimalną wartość całkowitą, jeżeli lista będzie pusta.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 1, 2, 3, a następnie usuniesz dwa ostatnio dodane elementy.
Poprawny wynik działania programu:
Lista: 1Wykorzystaj dwa wskaźniki pomocnicze oraz pętlę przechodzącą listę do końca.
#include <iostream>
#include <climits>
using namespace std;
typedef struct Wezel {
int liczba;
Wezel *nastepny;
Wezel(int liczba) {
this->liczba = liczba;
this->nastepny = nullptr;
}
} Wezel;
class Lista {
public:
Wezel* glowa;
Lista(): glowa(nullptr) {}
void dodaj(int);
void wypisz();
int usunOstatni();
};
void Lista::dodaj(int liczba) {
Wezel* nowy = new Wezel(liczba);
if (glowa == nullptr) {
glowa = nowy;
return;
}
Wezel* pomocniczy = glowa;
while (pomocniczy->nastepny != nullptr) {
pomocniczy = pomocniczy->nastepny;
}
pomocniczy->nastepny = nowy;
}
void Lista::wypisz() {
cout << "Lista: ";
Wezel* pomocniczy = glowa;
while (pomocniczy != nullptr) {
cout << pomocniczy->liczba << " ";
pomocniczy = pomocniczy->nastepny;
}
cout << endl;
}
int Lista::usunOstatni() {
Wezel *pomocniczy1 = glowa, *pomocniczy2 = nullptr;
int liczba = INT_MIN;
if (glowa == nullptr) return liczba;
if (pomocniczy1->nastepny == nullptr) {
liczba = pomocniczy1->liczba;
glowa = nullptr;
delete pomocniczy1;
return liczba;
}
while (pomocniczy1->nastepny != nullptr) {
pomocniczy2 = pomocniczy1;
pomocniczy1 = pomocniczy1->nastepny;
}
pomocniczy2->nastepny = nullptr;
liczba = pomocniczy1->liczba;
delete(pomocniczy1);
return liczba;
}
int main() {
Lista lista;
lista.dodaj(1);
lista.dodaj(2);
lista.dodaj(3);
lista.usunOstatni();
lista.usunOstatni();
lista.wypisz();
return 0;
}Zapisz metodę odwroc(), która odwróci kolejność elementów listy niecyklicznej jednokierunkowej.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 3, 5, 8.
Poprawny wynik działania programu:
Lista: 8 5 3Wykorzystaj trzy wskaźniki pomocnicze oraz pętlę przechodzącą listę do końca.
#include <iostream>
using namespace std;
typedef struct Wezel {
int liczba;
Wezel *nastepny;
Wezel(int liczba) {
this->liczba = liczba;
this->nastepny = nullptr;
}
} Wezel;
class Lista {
public:
Wezel* glowa;
Lista(): glowa(nullptr) {}
void dodaj(int);
void wypisz();
void odwroc();
};
void Lista::dodaj(int liczba) {
Wezel* nowy = new Wezel(liczba);
if (glowa == nullptr) {
glowa = nowy;
return;
}
Wezel* pomocniczy = glowa;
while (pomocniczy->nastepny != nullptr) {
pomocniczy = pomocniczy->nastepny;
}
pomocniczy->nastepny = nowy;
}
void Lista::wypisz() {
if (!glowa) {
cout << "Lista jest pusta" << endl;
return;
}
cout << "Lista: ";
Wezel* pomocniczy = glowa;
while (pomocniczy != nullptr) {
cout << pomocniczy->liczba << " ";
pomocniczy = pomocniczy->nastepny;
}
cout << endl;
}
void Lista::odwroc() {
Wezel *aktualny = glowa, *poprzedni = nullptr, *nastepny = nullptr;
while (aktualny != nullptr) {
nastepny = aktualny->nastepny;
aktualny->nastepny = poprzedni;
poprzedni = aktualny;
aktualny = nastepny;
}
glowa = poprzedni;
}
int main() {
Lista lista;
lista.dodaj(3);
lista.dodaj(5);
lista.dodaj(8);
lista.odwroc();
lista.wypisz();
return 0;
}Zapisz metodę wypiszWstecz(), która wypisuje elementy listy niecyklicznej dwukierunkowej od końca.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 13, 8, 5.
Poprawny wynik działania programu:
Lista: 5 8 13Wykorzystaj wskaźniki pomocniczy i ogon.
#include <iostream>
using namespace std;
typedef struct Wezel {
int liczba;
Wezel* nastepny;
Wezel* poprzedni;
Wezel(int liczba) {
this->liczba = liczba;
this->nastepny = nullptr;
this->poprzedni = nullptr;
}
} Wezel;
class Lista {
Wezel *glowa;
Wezel *ogon;
public:
Lista(): glowa(nullptr), ogon(nullptr) {}
void dodaj(int);
void wypiszWstecz();
};
void Lista::dodaj(int liczba) {
Wezel *nowy = new Wezel(liczba);
if (!glowa) {
glowa = ogon = nowy;
return;
}
ogon->nastepny = nowy;
nowy->poprzedni = ogon;
ogon = nowy;
}
void Lista::wypiszWstecz() {
Wezel* pomocniczy = ogon;
if (!glowa) return;
cout << "Lista: ";
while (pomocniczy->poprzedni != nullptr) {
cout << pomocniczy->liczba << " ";
pomocniczy = pomocniczy->poprzedni;
}
cout << pomocniczy->liczba << endl;
}
int main() {
Lista lista;
lista.dodaj(13);
lista.dodaj(8);
lista.dodaj(5);
lista.wypiszWstecz();
return 0;
}Zapisz funkcję wypiszRekursywnie(), która wypisze elementy listy jednokierunkowej w odwrotnej kolejności, tj. od ogona do głowy. W rozwiązaniu wykorzystaj rekurencję i wywołaj napisaną funkcję w funkcji głównej.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 8, 13, 2.
Poprawny wynik działania programu:
21 13 8Do pierwszego wywołania funkcji wypiszRekursywnie() jako argument przekaż wskaźnik na pierwszy element listy. Wywołania rekurencyjne wewnątrz funkcji powinny się zakończyć, jeżeli funkcja jako argument otrzyma wskaźnik pusty.
#include <iostream>
using namespace std;
typedef struct Wezel {
int liczba;
Wezel *nastepny;
Wezel(int liczba) {
this->liczba = liczba;
this->nastepny = nullptr;
}
} Wezel;
class Lista {
public:
Wezel* glowa;
Lista(): glowa(nullptr) {}
void dodaj(int);
};
void Lista::dodaj(int liczba) {
Wezel* nowy = new Wezel(liczba);
if (!glowa) {
glowa = nowy;
return;
}
Wezel* pomocniczy = glowa;
while (pomocniczy->nastepny != nullptr) {
pomocniczy = pomocniczy->nastepny;
}
pomocniczy->nastepny = nowy;
}
void wypiszRekursywnie(Wezel* wezel) {
if (wezel != nullptr) {
wypiszRekursywnie(wezel->nastepny);
cout << wezel->liczba << " ";
}
}
int main() {
Lista lista;
lista.dodaj(8);
lista.dodaj(13);
lista.dodaj(21);
wypiszRekursywnie(lista.glowa);
return 0;
}Zapisz metodę wypiszOdWezla(Wezel* wezel), która wypisuje elementy listy cyklicznej dwukierunkowej, zaczynając od węzła wskazywanego przez podany wskaźnik wezel. Jeśli metoda otrzyma jako argument pusty wskaźnik (nullptr), wypisywanie powinno rozpocząć się od pierwszego węzła listy.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 13, 21, 34.
Poprawny wynik działania programu:
Lista: 21 34 13Wykorzystaj węzeł pomocniczy i sprawdź, czy pole nastepny nie wskazuje na węzeł, od którego zaczynasz wypisywać listę.
#include <iostream>
using namespace std;
typedef struct Wezel {
int liczba;
Wezel *nastepny;
Wezel *poprzedni;
} Wezel;
class Lista {
public:
Wezel *glowa;
Lista() { glowa = nullptr; }
void dodaj(int);
void wypiszOdWezla(Wezel*);
};
void Lista::dodaj(int liczba) {
Wezel *nowy = new Wezel;
nowy->liczba = liczba;
if (!glowa) {
glowa = nowy;
glowa->nastepny = glowa;
glowa->poprzedni = glowa;
return;
}
Wezel *pomocniczy = glowa->poprzedni;
nowy->nastepny = glowa;
nowy->poprzedni = pomocniczy;
glowa->poprzedni = nowy;
pomocniczy->nastepny = nowy;
}
void Lista::wypiszOdWezla(Wezel* wezel) {
if (!glowa) return;
cout << "Lista: ";
if (!wezel) wezel = glowa;
Wezel *pomocniczy = wezel;
while (pomocniczy->nastepny != wezel) {
cout << pomocniczy->liczba << " ";
pomocniczy = pomocniczy->nastepny;
}
cout << pomocniczy->liczba << endl;
}
int main() {
Lista lista;
lista.dodaj(13);
lista.dodaj(21);
lista.dodaj(34);
lista.wypiszOdWezla(lista.glowa->nastepny);
return 0;
}Zapisz metodę usunWezel(Wezel* wezel), która usuwa przekazany jako wskaźnik węzeł z listy cyklicznej dwukierunkowej i zwraca wartość przechowywaną w tym węźle. W przypadku, gdy argumentem metody jest pusty wskaźnik (nullptr), metoda powinna usuwać pierwszy węzeł listy. Jeśli lista jest pusta, funkcja powinna zwrócić minimalną wartość całkowitą reprezentowaną przez stałą INT_MIN.
Działanie programu przetestuj dla listy, do której dodasz kolejno wartości 13, 21, 34. Usuwanym węzłem powinien być węzeł znajdujący się bezpośrednio po głowie (jej następnik).
Poprawny wynik działania programu:
Lista: 13 34Odpowiednio ustaw wskaźniki węzłów, na które ustawione są wskaźniki węzła usuwanego.
#include <iostream>
#include <climits>
using namespace std;
typedef struct Wezel {
int liczba;
Wezel *nastepny;
Wezel *poprzedni;
} Wezel;
class Lista {
public:
Wezel *glowa;
Lista() { glowa = nullptr; }
void dodaj(int);
void wypisz();
int usunWezel(Wezel*);
};
void Lista::dodaj(int liczba) {
Wezel *nowy = new Wezel;
nowy->liczba = liczba;
if (!glowa) {
glowa = nowy;
glowa->nastepny = glowa;
glowa->poprzedni = glowa;
return;
}
Wezel *pomocniczy = glowa->poprzedni;
nowy->nastepny = glowa;
nowy->poprzedni = pomocniczy;
glowa->poprzedni = nowy;
pomocniczy->nastepny = nowy;
}
void Lista::wypisz() {
if (!glowa) return;
cout << "Lista: ";
Wezel *pomocniczy = glowa;
while (pomocniczy->nastepny != glowa) {
cout << pomocniczy->liczba << " ";
pomocniczy = pomocniczy->nastepny;
}
cout << pomocniczy->liczba << endl;
}
int Lista::usunWezel(Wezel* wezel) {
if (glowa == nullptr) return INT_MIN;
if (!wezel) wezel = glowa;
int liczba = wezel->liczba;
wezel->nastepny->poprzedni = wezel->poprzedni;
wezel->poprzedni->nastepny = wezel->nastepny;
if (wezel == glowa) {
if (glowa->nastepny != glowa) {
glowa = glowa->nastepny;
} else {
glowa = nullptr;
}
}
delete (wezel);
return liczba;
}
int main() {
Lista lista;
lista.dodaj(13);
lista.dodaj(21);
lista.dodaj(34);
lista.usunWezel(lista.glowa->nastepny);
lista.wypisz();
return 0;
}