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

Linked list (lista łączona) - poprawna struktura w c++

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,977 wizyt
pytanie zadane 1 września 2018 w C i C++ przez Adam Jakś Dyskutant (8,940 p.)

Cześć!

Na studiach wymagane jest od nas zrobienie listy łączonej, oraz wykonywanie na niej operacji. Ponieważ duża waga jest przywiązywana do detali technicznych - chciałbym prosić o parę słów na temat podanej przez mnie struktury (szkieletu) listy tego typu. Czy wszystkie konstruktory, destruktory, zmienne początkowe etc. są napisane poprawnie i są dobrą bazą wyjścia do dodawania customowych metod i wykonywania dalszych operacji?

Plik nagłówkowy "lista.h"

#ifndef LISTA_H_INCLUDED
#define LISTA_H_INCLUDED

struct List {
    private:
        struct Node {
            int data;
            Node *next;
            Node(int _data, Node *_next = NULL) {
                data = _data;
                next = _next;
            }
        };
        Node *head, *tail;
        int counter;
    public:
        List();
        ~List();
        //customowe funkcje
};

#endif // LISTA_H_INCLUDED

Plik źródłowy "lista.cpp"

#include "lista.h"

List::List() {
    head = NULL;
    tail = NULL;
    counter = 0;
}

List::~List() {
    while(head != NULL) {
        Node *killer = head;
        head = head -> next;
        delete killer;
    }
    tail = NULL;
    counter = 0;
}

Listę wykorzystywać będę oczywiście w "main.cpp", np.

#include <iostream>
#include "lista.h"
using namespace std;

int main()
{
    List l1;
}

Dzięki!

1 odpowiedź

0 głosów
odpowiedź 2 września 2018 przez RafalS VIP (122,820 p.)
wybrane 2 września 2018 przez Adam Jakś
 
Najlepsza

Kod jest w miare ok, ale wydaje mi się, że w dziwny sposób podchodzisz do zadania :P. Nie rozumiem czemu destruktor miałby być szkieletem rozwiązania :D. Wg mnie lepiej byłoby najpierw naśmiecić, a jak już zobaczysz gdzie i jak zostalo naśmiecone to potem te śmieci zbierać. Nie na odwrót :D

Drobne poprawki, gdybym miał się bardzo czepiać:

Struct i class różnią się od siebie tylko domyślnym modyfikatorem dostępu i domyślnym typem dziedziczenia, ale w środowisku programistycznym utarło się, że struct jest wykorzystywany tam gdzie chcemy mieć taki pojemnik na dane bez żadnych metod. class List, struct Node.

List::List() {
    head = NULL;
    tail = NULL;
    counter = 0;
}

coś takiego nie jest warte definiowania konstruktora skoro o wiele czytelniej od C++11 można napisać tak:

class List {
private:
	Node * head = nullptr;
	Node* tail = nullptr;
	int counter = 0;
};
            Node(int _data, Node *_next = NULL) {
                data = _data;
                next = _next;
            }

W takim przypadku banalnego konstruktora czytelniej jest użyć listy inicjalizacyjnej i oczywiście definicje rzucić do pliku .cpp

List::Node::Node(int _data, Node *_next = NULL) : data(_data), next(_next) {}

Lista inicjalizacyjna implikuje proste przypisanie parametrów do składowych. Gdy widzisz kod w ciele konsturktora spodziewasz się logiki.

Generalnie nie powinno się zaczynać nazw identyfikatorów od podkreślenia, żeby uniknać kolizji z kompilatorem/bibliotekami. W przypadku inicjalizacji składowych parametrami o tych samych nazwach możesz do składowych dodawać jakiś prefix lub sufix. Osoboście spotkałem się z m_skladowa lub skladowa_. Wybierz jedną i trzymaj się tej konwencji.

Podobne pytania

0 głosów
0 odpowiedzi 2,360 wizyt
pytanie zadane 5 stycznia 2019 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 815 wizyt

93,441 zapytań

142,434 odpowiedzi

322,681 komentarzy

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

...