• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista dwukierunkowa - dodanie elementu bez podania wskaźnika na obecny obiekt

Object Storage Arubacloud
0 głosów
489 wizyt
pytanie zadane 28 listopada 2018 w C i C++ przez poldeeek Mądrala (5,980 p.)

WItam , mam pytanie czy jest możliwość dodania elementu do listy dwukierunkowej bez podawania wskaźnika na obecny element w metodzie klasy ? Chodzi mi o to żebym poruszał się po liście metodami idz_przod(), idz_tyl() po liscie i dodaj(typ), ale bez podawania wsaźnika do akutalnego obiektu... 


 

template <typename Typ> class Lista
{
public:
    Lista *next;
    Lista *prev;
    Typ zmienna;

    Lista()
    {
        next = NULL;
        prev = NULL;
        zmienna = '0';
    }

    Lista *idz_przod()
    {
        Lista *nowy;
        if(next == NULL)
        {
            cout<<"Jesteś na końcu listy."<<endl;
            nowy->next = this->next;
            nowy->prev = this->prev;
            nowy->zmienna = this->zmienna;
        }
        else
        {
            nowy = next;
        }
        return nowy;
    }

    Lista *idz_tyl()
    {
        Lista *nowy;
        if(prev == NULL)
        {
            cout<<"Jesteś na poczatku listy."<<endl;
            nowy->next = this->next;
            nowy->prev = this->prev;
            nowy->zmienna = this->zmienna;
        }
        else
        {
            nowy = prev;
        }
        return nowy;
    }

    Lista *dodaj(Typ x)
    {
        Lista *nowy;
        if((prev == NULL) && (next = NULL))
        {
            nowy->next = NULL;
            nowy->prev = NULL;
            nowy->zmienna = x;
        }
        else if(prev == NULL)
        {
            nowy->next = this->Lista;
            nowy->prev = NULL;
            nowy->zmienna = x;
        }
        else if(next == NULL)
        {
            nowy->next = NULL;
            nowy->prev = this->Lista;
            nowy->zmienna = x;
        }
        else
        {
            nowy->next = this->next;
            nowy->prev = this->Lista;
            nowy->zmienna = x;
        }
        return nowy;
    }

 

1
komentarz 28 listopada 2018 przez j23 Mędrzec (194,920 p.)

Może zacznij od zdefiniowania klasy Node, która będzie reprezentować element listy. Teraz bajzel jest...

komentarz 28 listopada 2018 przez poldeeek Mądrala (5,980 p.)
Czyli mam zrobić oddzielną klase załóżmy element, która będzie elementem listy i w klasie Lista stworzyć wskaźnik na klase element ?
1
komentarz 28 listopada 2018 przez j23 Mędrzec (194,920 p.)

Tak to widzę:

template <typename T> 
class Lista
{
	struct Node
	{
		T    	val;
		Node*	prev = nullptr;
		Node*   next = nullptr;
	};

	Node *head = nullptr;
	Node *tail = nullptr;

public:
	void dodaj(const T &v)
	{
		Node *n = new Node{ v, nullptr, nullptr };

		if(tail == nullptr) { head = tail = n; }
		else 
		{
			n->prev = tail;
			tail->next = n;
			tail = n;
		}
	}

}; 

 

komentarz 28 listopada 2018 przez poldeeek Mądrala (5,980 p.)
Czyli jeśli bym chciał zrobić listę gdzie mogę sie poruszać o jedną pozycję do przodu i w tył i wstawić element zaraz za tym, na którym akutalnie jestem to musiałbym stworzyć jeszcze jeden elemnt Node *akutalny i w nim po prostu przechowywać pozycję w liście tak ?
1
komentarz 28 listopada 2018 przez j23 Mędrzec (194,920 p.)
Możesz tak zrobić, choć nie jest to jakoś szczególnie praktyczne rozwiązanie.
komentarz 28 listopada 2018 przez poldeeek Mądrala (5,980 p.)
Mam jeszcze pytanie, w konstruktorze przy tworzeniu szablonu jaką powinno się przypisywać wartość do tej zmiennej, która ma być dowolnego typu, ponieważ dla wartości NULL przy późniejszym porównaniu dostaję takie komunikaty

In instantiation of 'void Lista<Typ>::dodaj(Typ) [with Typ = int]':
required from here
warning: NULL used in arithmetic [-Wpointer-arith]
1
komentarz 28 listopada 2018 przez j23 Mędrzec (194,920 p.)

Wartość Typ().

komentarz 29 listopada 2018 przez poldeeek Mądrala (5,980 p.)

Czy poprawny jest taki kod ? Bo program sie wysypuje kiedy po utworzeniu Listy próbuje chociażby wyświetlić zmienną, któregoś z Node'ów... Odwołuje się w taki sposób

    Lista <int> nowa;
    cout<<nowa.poczatek->zmienna;

le wypisuje mi liczby typu : -2095090496, nawet jeśli w konstruktorze przypiszę do typu liczbę np. 5

template <typename Typ> class Lista
{
public:
    class Node
    {
    public:
        Node *prev;
        Node *next;
        Typ zmienna;

        Node()
        {
            prev = NULL;
            next = NULL;
            zmienna = Typ();
        }
    };

    Node *poczatek;
    Node *koniec;
    Node *pozycja;

 

komentarz 29 listopada 2018 przez j23 Mędrzec (194,920 p.)

Może najpierw dodaj coś do tej listy. Odwołujesz się do pierwszego elementu listy, którego po prostu nie ma.


        Node()
        {
            prev = NULL;
            next = NULL;
            zmienna = Typ();
        }

Popraw to na:

    Node()
        :prev()
        ,next()
        ,zmienna()
    { }

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 240 wizyt
0 głosów
1 odpowiedź 336 wizyt
0 głosów
1 odpowiedź 178 wizyt

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...