Lista jednokierunkowa – gdzie są błędy?

0

Witam, mam problem z zadaną pracą domową. Polega ona na zaimplementowaniu listy jednokierunkowej. Napisałem już sporą część kodu, lecz ciągle stoję w miejscu. Obstawiam, że błąd leży w klasie list na samym początku. Proszę o poradę.

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class Node {
public:
    int data;
    Node* next = NULL;

    /*
     * Konstruktory
     */
    Node()
    {
        this->data = 0;
    }
    
    Node(int data)
    {
        this->data = data;
    }

    /*
     * Metoda wyświetlająca informacje o węźle
     */
    void print()
    {
        cout << "-¦" << endl
             << "- &node = " << this << endl
             << "- node.data = " << data << endl
             << "- node.next = " << next << endl
             << "L¦" << endl;
    }

 };

 class List {
	public:
		Node* head;
		Node* tail;
		Node* current;
				
	void addToHead( Node* node){
		head->next = node;
		head = node;
		if(!tail) {
			tail = node;
		}
	}
	void addToTail(Node* node) {
		tail->next = node;
		tail = node;
		if(!head) {
			head = node;
			current = node;
		}
	

	}
	void print(){
		Node* current = head;
		while(current!=NULL) {
			current->print();
			current = current ->next;
		}
	}
	int next() {
		int d = current->data;
		current = current->next;
		return d;
	}
	bool hasNext()
	{
		return current != NULL;
	}
	void removeFromHead()
	{
		Node* node = head->next;
		delete head;
		head = node;
	}
 };
int main()
{
	List* list = new List();
	
	Node* n1 = new Node(33);
	list->addToHead(n1);
	
	Node* n2 = new Node(128);
	list->addToHead(n2);
	
	list->addToTail( new Node(999));
	list->print();
	
	while(list->hasNext()) {
		cout<<list->next()<<endl;
	}
	delete list;
	return 0;
}
1

Hoho C++98

0

Jeśli chodzi o konstruktory, to jest fragment kodu od prowadzącego. Sam jestem zielony w C++, jakoś nie podchodzi mi ten język.

0

Klasa List nie ma w ogóle konstruktoróœ, czy to dobrze?

1

@Kardam: Błędy są właściwie wszędzie. W metodach dodawania do listy używasz niezainicjalizowanych wskaźników. Konstruktory klasy Node nie inicjalizują pola next. Pisząc metodę hasNext() zakładasz, że current został ustawiony na początek listy. Sama koncepcja też jest jakaś dziwna, że to User musi tworzyć węzły? Klasa Node powinna być szczegółem implementacyjnym klasy List nie widocznym dla użytkownika. Ona powinna zarządzać tworzeniem i usuwaniem węzłów.

W sieci znajdziesz mnóstwo opracowań dotyczących list jednokierunkowych, wystarczy dokładnie jakieś przestudiować ;).

0

Pierwsza z brzegu, w miarę czytelnie przedstawiona:
https://www.p-programowanie.pl/cpp/lista-jednokierunkowa-c/

1 użytkowników online, w tym zalogowanych: 0, gości: 1