Szablon listy jednokierunkowej.

0

Witam!
Chciałbym stworzyć na szablonach liste jednokierunkowa obiektów - dla uproszenia liste liczb INT (nie moge korzystać z gotowej list std::list). Mam jednak pewien problem przy dodawaniu nowych elementow do listy. Wydaje mi sie, ze dodawanie napisane jest poprawnie jednak dziala tylko dodawanie glowy do pustej list, kolejne elementy nie dodaja sie - program wykonuje sie poprawnie. Dla uproszczenia wszystkie atrybuty są publiczne.

PLIK "template.h"

 #pragma once
#include <iostream>
template<class T>
class Lista{
public:
	Lista(void);
	~Lista(void);

	class Element{
	public:
		Element(T v){
			value = v;
			next = NULL;
		}
		T value;
		Element* next;
	};

	Element* head;
	Element* current;

	void show(void);
	void newElem(T);
	void add(Element*);
};

PLIK "template.cpp"

 
template<class T> 
Lista<T>::Lista(void){
	head = NULL;
}


template<class T> 
Lista<T>::~Lista(void){
 // usuwanie elementow.
}

template<class T>
typename void Lista<T>::show(void){	
	Element* tmp = head;
	while(tmp != NULL){
		std::cout << tmp->value << std::endl;
		tmp = tmp->next;
	}
}

template<class T>
void Lista<T>::newElem(T value){
	 add(new Element(value));
}

template<class T>
void Lista<T>::add(Element* element){
	if (head == NULL){
		head = element;
	}
	else{
		current = head->next;
		while (current != NULL)
			current = current->next;
		current = element;
	}
}

PLIK main.cpp

int main(){
	Lista<int> lista;

	lista.newElem(10);
	lista.newElem(100);
	lista.show();
        
        return 0;
}
 
1

W jaki niby sposób to kompilujesz, skoro definicje metod są poza plikiem nagłówkowym? Szablony tak nie zadziałają.

Edit

current = head->next;
while (current != NULL)
    current = current->next;
current = element;

Nie ustawiasz wskaźnika next poprzednika na właśnie dodawany element:

current = head;
while (current->next != NULL)
    current = current->next;
current->next = element;

Edit 2
Dlaczego dodajesz na koniec listy? W takim wypadku wstawianie odbywa się w czasie liniowym. Dodawanie na początku listy jest stałe:

if (head == NULL)
    head = element;
else {
    element->next = head;
    head = element;
}
0

Dzieki! Pomogło przeniesienie wszystkiego do jednego pliku (chociaz program wczesniej tez sie kompilował) i poprawki ze wskaznikiem na next.
Nie dodawałem na poczatek bo nie skupiałem się na optymalizacji czasowej, tym bardziej, że lista bedzie przechowywać góra 5 elementow.

Temat do zamkniecia.

0

Można dodać zmienną wskaźnikową tail wskazującą na koniec listy. Pomimo małego rozmiaru listy będzie to bardziej czytelne i szybsze dodawanie elementów.

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