2015-06-14 2 views
-3

У меня есть три файла заголовка (.hpp), которые определяют узел, отдельно связанный список и итератор. Это должно вместе создать мой единственный связанный список. Вот узел.Реализация связанного списка в C++

#ifndef NODE_HPP 
#define NODE_HPP 

#include <iostream> 
#include <string> 

template <typename T> struct node { 


public: 
    explicit node(const T& value, node* next = 0): value_(value), next_(next){} 


private: 
    T value_; 
    node* next_; 

}; 

#endif //NODE_HPP 

Вот мой SLIST

#ifndef SLIST_HPP 
#define SLIST_HPP 

#include "node.hpp" 
#include "iterator.hpp" 

template <typename T> class slist{ 

public: 
    class iterator; 

    slist() :head_(0){ } 

    bool empty() const{return (head_==0);} 

    int size() const{ 
     int s=0; 
     iterator last=end(); 
     for(iterator i= begin(); i!= last; ++i; ++s); 
     return s; 
    }; 

    iterator begin() { return iterator(head_); } 
    iterator end() { return iterator(0); } 

    void insert(iterator p, const T& t); 

    void erase(iterator p){ 
     node<T>* tmp = p.node_->next_; 
     p.node_->value = p.node_->next_.value; 
     p.node_->next_=p.node_->next_->next_; 

     delete tmp; 
     return p; 
    }; 

private: 
    node<T>* head_; 

}; 

#endif //SLIST_HPP 

И вот мой итератор класс

#ifndef ITERATOR_HPP 
#define ITERATOR_HPP 

#include "slist.hpp" 
#include "node.hpp" 



class iterator{ 

public: 
    explicit iterator(node<T>* node=0) :node_(node){ } 

    T& operator*(){return node_-> value_;} 
    T* operator->(){return node_->value_;} 

    iterator& operator++(){ 
     if(node_ != 0) node_ = node_->next_; 
     return *this; 
    } 

    iterator operator++(int){ 
     iterator tmp = *this; 
     if(node_!= 0) node_ = node_->next_; 
     return tmp; 
    } 

    bool operator==(const iterator& iter) const { return (node_ == iter.node_); } 

    bool operator!=(const iterator& iter) const { return (node_ != iter.node_); } 


private: 
    node<T>* node_; 
}; 

#endif //ITERATOR_HPP 

Проблема нет ничего, кажется, разрешится. Код не компилируется, потому что slist не может читать значения из итератора, несмотря на то, что итератор определяется внутри slist. Даже сам класс итератора проявляет неловкость в методах, возвращающих объект итератора. Может кто-нибудь помочь мне понять, что здесь происходит не так.

+0

Почему простой голос без комментариев (причина)? – Jumper

+0

Вы, кажется, забыли строку 'template ...' в 'iterator.hpp'. Вы уверены, что это настоящий код? – Beta

+1

@Jumper _ «Почему голосующий голос даже без комментария (причина)?» _ Редкие недостатки без причины: _ «Вопросы, требующие помощи по отладке (« почему этот код не работает? ») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для его воспроизведения в самом вопросе. Вопросы без явного заявления о проблеме не полезны для других читателей. См.: ** [Как создать минимальный, завершенный и проверяемый пример] (http : //stackoverflow.com/help/mcve) **. "_ Сконцентрируйтесь на _minimal_. –

ответ

0

Если ваш компилятор не говорит вам, где возникают проблемы, начните простую и накапливайтесь. Какой самый простой iterator вы можете придумать? Попробуйте следующее:

template <typename T> 
class iterator{ 
}; 

Пока что так хорошо. Теперь добавьте сложность немного за раз, тестируя на каждом шагу. Теперь вы можете написать slist или добавить функциональность в iterator. Вы заметите проблему, как только вы пишете что-то вроде

for(iterator i= begin(); i!= last; ++i; ++s); 

Когда вы попали загвоздка, как это, не добавляйте больше сложности, пока вы не исправить.

Смежные вопросы