一个简单的List实现
来源:互联网 发布:淘宝卖家交流群 编辑:程序博客网 时间:2024/05/24 04:42
list和vector是STL库中两个最基本的容器,以下代码模拟实现一个简单的list:
#ifndef _MYLIST_#define _MYLIST_#include<iostream>using namespace std;class ListIsEmpty{};class ArgIsIll{};template<typename T>class Node{public: Node(const T& d=T()):data(d),prev(NULL),next(NULL) {} ~Node() {}private: Node(const Node& n); Node& operator=(const Node& n);public: T data; Node* prev; Node* next;};template<typename T>class List{public: List():front(NULL),tail(NULL),cur_size(0) {} ~List() { while(!this->empty()) { this->pop_front(); } } List& operator=(const List& l) { if(&l!=this) { Node<T>* cur=l.front; List newlist; while(cur!=NULL) { newlist.push_front(cur->data); } } return newlist; } Node<T>* begin() { return front; } Node<T>* end()//此处end函数与STL中稍微有点不同,STL中end返回值指向最后一个元素的下一个,这里指向最后一个元素 { return tail; } bool empty() { if(cur_size==0) return true; else return false; } size_t size() { return cur_size; } bool push_front(Node<T>* n) { if(this->empty()) { front=tail=n; } else { n->next=front; front->prev=n; n->prev=tail; tail->next=n; front=n; } cur_size++; return true; } bool pop_front()throw (ListIsEmpty) { if(this->empty()) { throw ListIsEmpty(); } else if(this->size()==1) { delete front; front=tail=NULL; } else { Node<T>* s=front; front=front->next; front->prev=tail; tail->next=front; delete s; } cur_size--; return true; } bool push_front(const T& t) { Node<T> *s=new Node<T>(t); return push_front(s); } bool push_back(Node<T>* n) { if(this->empty()) { front=tail=n; } else { tail->next=n; n->prev=tail; n->next=front; front->prev=n; tail=n; } cur_size++; return true; } bool pop_back()throw (ListIsEmpty) { if(this->empty()) { throw ListIsEmpty(); } else if(this->size()==1) { delete tail; front=tail=NULL; } else { Node<T>* s=tail; tail=tail->prev; front->prev=tail; tail->next=front; delete s; } cur_size--; return true; } bool push_back(const T& t) { Node<T> *s=new Node<T>(t); return push_back(s); } bool insert(size_t pos,Node<T>* n)throw (ArgIsIll) { if(pos>this->size()) { throw ArgIsIll(); } else if(pos==this->size()) { return push_back(n); } else if(pos==0) { return push_front(n); } else { size_t i=0; Node<T>* cur=front; for(i=0;i<pos-1;++i) { cur=cur->next; } n->next=cur->next; cur->next->prev=n; n->prev=cur; cur->next=n; cur_size++; return true; } } bool insert(size_t pos,const T& t)throw (ArgIsIll) { Node<T>* s=new Node<T>(t); return insert(pos,s); } bool erase(size_t pos) { if(pos>this->size()) { throw ArgIsIll(); } else if(pos==this->size()) { return pop_back(); } else if(pos==0) { return pop_front(); } else { size_t i=0; Node<T>* cur=front; for(i=0;i<pos-1;++i) { cur=cur->next; } cur->next->prev=cur->prev; cur->prev->next=cur->next; delete cur; cur_size--; return true; } } void print()const { Node<T>* cur=front; while(true) { cout<<cur->data<<" "; if(cur==tail) break; cur=cur->next; } cout<<endl; }private: List(const List& l);private: Node<T>* front; Node<T>* tail; size_t cur_size;};#endif
以上
如果你有任何想法或是可以改进的地方,欢迎和我交流!
完整代码及测试用例在github上:点我前往
本文首发于www.sbrave.cn
【完】
0 0
- 一个简单的List实现
- 使用list实现一个简单的Listener管理
- C语言实现一个简单的单向链表list
- 一个简单的cpp list
- List的简单C++实现
- 简单单向list的实现
- STL 简单 list 的实现
- list 迭代器的简单实现
- 一个伪泛型List的实现
- 转载的标准文档:C语言实现一个简单的单向链表list
- 一个最最简单的,用continuations实现的List中的求和 - scala
- Android中的一个简单的List应用
- 一个简单的算法关于list
- 一个简单的linked list问题
- 自己实现的简单List和Map
- list 模板类的简单实现
- c++stl库list简单的实现
- JS Map 和 List 的简单实现。
- linux u盘安装过程详解
- Piping OV7670 video to VGA output on ZYBO
- change composer's repo to china's mirror
- 【JEECG Dubbo专题】Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)
- Android设备唯一标识小记
- 一个简单的List实现
- tornado-python web框架-学习资料
- Ruby 连接MySQL数据库
- Android学习小记----监听电量的变化(不能静态注册的广播), 保持Service不被杀死的好方法
- CSS3中的animation详解
- C# Lambda表达式
- pdf文件怎么转换成word文档格式
- springMVC+hibernate+springdata+querydsl框架构建详解
- Java继承中的构造器实现