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

Moja pierwsza implementacja listy jednokierunkowej

42 Warsaw Coding Academy
+2 głosów
149 wizyt
pytanie zadane 17 stycznia w C i C++ przez polandonion Dyskutant (7,630 p.)

Witam, niedawno zacząłem się uczyć obiektowego C++ na własną rękę i jednym z projektów, które chciałem stworzyć to moja własna implementacja listy jednokierunkowej (link). Wydaje mi się, że dobry przykład na początek, więc chciałbym się zapytać, czy jest ona poprawna, czyli taka, która nie doprowadza do tzw. wycieku pamięci. Na moje oko powinno wszystko grać, ale zawsze lepiej dmuchać na zimne. Po drugie tak sobie myślałem, czy nie dałoby rady wszystkich funkcji zamienić w metody klasy Node, tak aby nie wykonywać funkcji w taki sposób:

addToList(100);

tylko mniej więcej w taki, który jest troszkę nawet bardziej czytelniejszy:

myList.addToList(100);

, czyli w skrócie wywoływać funkcje obiektowo a nie proceduralnie. Nawet jeżeli to możliwe, to nie mam pojęcia jak tego dokonać, gdyż moja lista to przecież tylko wskaźnik na pierwszy element, a nie obiekt, a  struktura Node odpowiada za obiekty a nie za wskaźniki. Tak czy siak, dzięki z góry za przesyłane komentarze i odpowiedzi. Pozdrawiam.

2 odpowiedzi

+2 głosów
odpowiedź 17 stycznia przez adrian17 Mentor (353,220 p.)
wybrane 17 stycznia przez polandonion
 
Najlepsza

Na oko wygląda poprawnie, AddressSanitizer też nie zgłasza błędów.

(z drobnostek, to większość osób nie robi spacji dookoła -> .)

Mógłbyś też poprawić żeby każda funkcja miała dodatkowy argument z tym wskaźnikiem, wtedy funkcje by mogły operować na dowolnych listach a nie tylko na jednej globalnie.

A co do owinięcia w obiekt to jak najbardziej:

gdyż moja lista to przecież tylko wskaźnik na pierwszy element, a nie obiekt

To zrób drugą strukturę :)

struct List {
    Node *head = nullptr;

    ~Node(){ clear(); } // automatyczne sprzątanie

    void add(int n) { ... }
    void clear() { ... } // dawny deleteList
};
// ...
List l1, l2;
l1.add(5);
l2.add(8);

 

 

0 głosów
odpowiedź 17 stycznia przez reaktywny Nałogowiec (46,230 p.)
Ogólnie jest chyba OK, ale to trochę mało. Ja bym się pokusił przynajmniej o:

- metodę dodającą element w dowolnym miejscu listy (na początku, na końcu lub pomiędzy krańcowymi elementami)

- metodę kasującą n-ty element listy (podobnie j.w.)

- metodę odczytującą n-ty element listy

Jak to będziesz miał to można jeszcze zrobić np. funkcję swap() i zabrać się za sortowanie obiektów na liście

Podobne pytania

0 głosów
1 odpowiedź 763 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez Dyali56 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 809 wizyt
0 głosów
0 odpowiedzi 830 wizyt

93,389 zapytań

142,385 odpowiedzi

322,547 komentarzy

62,749 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...