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

Moja pierwsza implementacja listy jednokierunkowej

Konkurs Mistrz Programowania
+2 głosów
466 wizyt
pytanie zadane 17 stycznia 2025 w C i C++ przez polandonion Dyskutant (7,700 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 2025 przez adrian17 Mentor (354,880 p.)
wybrane 17 stycznia 2025 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 2025 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ź 935 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez Dyali56 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 932 wizyt
0 głosów
0 odpowiedzi 1,130 wizyt

93,655 zapytań

142,575 odpowiedzi

323,097 komentarzy

63,171 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

Kursy INF.02 i INF.03
...