Szablon listy jednokierunkowej.

Odpowiedz Nowy wątek
Jakis_Tam
2013-05-15 12:36
Jakis_Tam
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;
}

Pozostało 580 znaków

2013-05-15 13:03

Rejestracja: 11 lat temu

Ostatnio: 3 lata temu

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;
}

edytowany 2x, ostatnio: rincewind, 2013-05-15 13:08

Pozostało 580 znaków

Jakis_Tam
2013-05-15 13:39
Jakis_Tam
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.

Pozostało 580 znaków

Jerryme
2016-01-02 12:56
Jerryme
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.

Dwa i pół lata czekaliśmy na twą wskazówkę ... - _13th_Dragon 2016-01-02 13:00

Pozostało 580 znaków

Odpowiedz

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