C列表实施
发布时间:2020-12-16 10:18:28 所属栏目:百科 来源:网络整理
导读:所以,我正在为编程练习构建List的实现.到目前为止我有这个: #include iostream #include algorithmusing namespace std;template class T class Link;template class T class List_iterator;template class T class List{public: typedef List_iteratorT it
所以,我正在为编程练习构建List的实现.到目前为止我有这个:
#include <iostream> #include <algorithm> using namespace std; template <class T> class Link; template <class T> class List_iterator; template <class T> class List { public: typedef List_iterator<T> iterator; List(); List(const List<T> & l); ~List(); bool empty() const; unsigned int size() const; T & back() const; T & front() const; void push_front(const T & x); void push_back(const T & x); void pop_front(); void pop_back(); iterator begin() const; iterator end() const; void insert(iterator pos,const T & x); void erase(iterator & pos); List<T> & operator=(const List<T> & l); protected: Link<T> * first_link; Link<T> * last_link; unsigned int my_size; }; template <class T> List<T>::List() { first_link = 0; last_link = 0; my_size = 0; } template <class T> List<T>::List(const List & l) { first_link = 0; last_link = 0; my_size = 0; for (Link<T> * current = l.first_link; current != 0; current = current -> next_link) push_back(current -> value); } template <class T> typename List<T>::iterator List<T>::begin() const { return iterator(first_link); } template <class T> class Link { private: Link(const T & x): value(x),next_link(0),prev_link(0) {}//pg. 204 T value; Link<T> * next_link; Link<T> * prev_link; friend class List<T>; friend class List_iterator<T>; }; template <class T> class List_iterator { public: typedef List_iterator<T> iterator; List_iterator(Link<T> * source_link): current_link(source_link) { } List_iterator(): current_link(0) { } List_iterator(List_iterator<T> * source_iterator): current_link(source_iterator.current_link) { } T & operator*(); // dereferencing operator iterator & operator=(const iterator & rhs); bool operator==(const iterator & rhs) const; bool operator!=(const iterator & rhs) const; iterator & operator++(); iterator operator++(int); iterator & operator--(); iterator operator--(int); protected: Link<T> * current_link; friend class List<T>; }; template <class T> T & List_iterator<T>::operator*() { return current_link -> value; } template <class T> List_iterator<T> & List_iterator<T>::operator++() { current_link = current_link -> next_link; return *this; } template <class T> void List<T>::push_back(const T & x) { link<T> * last_link = new link<T> (x); if (empty()) first_link = last_link; else { last_link->prev_link = last_link; last_link->prev_link = last_link; last_link = last_link; } } template <class T> typename List<T>::iterator List<T>::end() const { return iterator(last_link); } int main() { List<int> l; l.push_back(44); // list = 44 l.push_back(33); // list = 44,33 l.push_back(11); // list = 44,33,11 l.push_back(22); // list = 44,11,22 List<int> m(l); List<int>::iterator itr(m.begin()); while (itr != m.end()) { cout << *itr << endl; itr++; } }` 我的push_back()函数遇到了很多麻烦,我不太确定是什么问题.任何人都可以指出我的错误吗? 正在更新的代码: #include <iostream> #include <algorithm> using namespace std; template <class T> class Link; template <class T> class List_iterator; template <class T> class List { public: typedef List_iterator<T> iterator; List(); List(const List<T> & l); ~List(); bool empty() const; unsigned int size() const; T & back() const; T & front() const; void push_front(const T & x); void push_back(const T & x); void pop_front(); void pop_back(); iterator begin() const; iterator end() const; void insert(iterator pos,prev_link(0) {}//pg. 204 T value; Link<T> * next_link; Link<T> * prev_link; friend class List<T>; friend class List_iterator<T>; }; template <class T> class List_iterator//pg.207 { public: typedef List_iterator<T> iterator; List_iterator(Link<T> * source_link): current_link(source_link) { } List_iterator(): current_link(0) { } List_iterator(List_iterator<T> * source_iterator): current_link(source_iterator.current_link) { } T & operator*(); // dereferencing operator iterator & operator=(const iterator & rhs); bool operator==(const iterator & rhs) const; bool operator!=(const iterator & rhs) const; iterator & operator++(); iterator operator++(int); iterator & operator--(); iterator operator--(int); protected: Link<T> * current_link; friend class List<T>; }; template <class T> T & List_iterator<T>::operator*() { return current_link -> value; } template <class T> List_iterator<T> & List_iterator<T>::operator++() { current_link = current_link -> next_link; return *this; } template <class T> void List<T>::push_back(const T & x) { Link<T> * new_link = new Link<T> (x); if (first_link = 0) first_link = last_link = new_link; else { new_link->prev_link = last_link; last_link->next_link = new_link; last_link = new_link; } my_size++; } template <class T> typename List<T>::iterator List<T>::end() const { return iterator(last_link); } template <class T> List <T>::~List() { Link <T> * first = first_link; while (first != 0) { Link <T> * next = first->next_link; delete first; first = next; } } template<class T> bool List_iterator<T>::operator==(const iterator & rhs) const { return ( this->current_link == rhs.current_link ); } template <class T> bool List_iterator<T>::operator!=(const iterator & rhs) const { return !( *this == rhs ); } int main() { List<int> l; l.push_back(44); // list = 44 l.push_back(33); // list = 44,22 List<int> m(l); List<int>::iterator itr(m.begin()); while (itr != m.end()) { cout << *itr << endl; ++itr; } } 解决方法
马里奥和乔的答案都是有效的(如果可以,我会投票给他们).
问题1 假设你发布的是push_back()的ACTUAL代码,那么Link< T>有错误的情况. link<T> * last_link = new link<T> (x); …应该: Link<T> * last_link = new Link<T> (x); 这样做可以消除错误:在’>’标记之前预期的primary-expression(当用g编译时) 问题2 Mario和Joe建议的替代方法是不要隐藏你的List< T>的last_link.使用与类的数据成员名称不同的临时变量.更改: Link<T> * last_link = new Link<T> (x); …至… Link<T> * new_link = new Link<T> (x); 这将使您的代码更清晰,您将引用正确的节点. 问题3 按照上述步骤应该在push_back()中出现两个逻辑错误.我愿意帮助,但我相信你会看到它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |