STL-Lesson002-MyList
来源:互联网 发布:淘宝网舞蹈衣服图片 编辑:程序博客网 时间:2024/06/08 04:11
MyList
/*MyList.h*/#ifndef _MYLIST_H_#define _MYLIST_H_namespace PoEdu{ //template<typename T> template<typename T> class MyList { public: struct node { node *prev; node *next; T data; }; public: MyList(); MyList(size_t number, T &val); MyList(const MyList<T> &other); ~MyList(); MyList &operator=(const MyList &other) { do { if (other.head_ == head_) { break; } Clear(); if (nullptr == other.head_) { head_ = nullptr; tail_ = nullptr; size_ = 0; break; } if (1 == other.size_) { node *temp = new node; temp->data = other.head_->data; head_ = temp; head_->prev = nullptr; tail_ = temp; tail_->next = nullptr; size_ = 1; break; } node *curNode = other.head_; node *temp = new node; temp->data = curNode->data; head_ = temp; head_->prev = nullptr; tail_ = temp; while (curNode->next != nullptr) { curNode = curNode->next; temp = new node; temp->data = curNode->data; tail_->next = temp; temp->prev = tail_; tail_ = temp; } tail_->next = nullptr; size_ = other.size_; } while (false); return *this; } T *Begin(); const T *Begin() const; T *End(); const T *End() const; bool Empty() const; size_t Size() const; T &Front(); const T &Front() const; T &Back(); const T &Back() const; void Assign(size_t number, const T &val); void Push_front(const T &val); void Pop_front(); void Push_back(const T &val); void Pop_back(); void Insert(size_t pos, const T &val); void Insert(size_t pos, size_t number, const T &val);// 这个函数待会在实现 void Erase(size_t pos); void Erase(size_t first, size_t last); // 前开后闭区间 void Swap(MyList &other); void Resize(size_t number); void Resize(size_t number, T val); void Remove(const T &val); void Unique(); void Sort(bool SmallToBig = true); void Reverse(); void Clear(); private: node *FindByIndex(size_t pos) { node *curNode = nullptr; // 从后向前查找 if (pos < size_ / 2) { curNode = head_; for (size_t i = 0; i < pos; ++i) { curNode = curNode->next; } } else // 从前向后查找 { curNode = tail_; for (size_t i = size_; i > pos; --i) { curNode = curNode->prev; } } return curNode; } private: node *head_; node *tail_; size_t size_; };}#endif // !_MYLIST_H_
/*MyList.cpp*/#include <cassert>#include "MyList.h"namespace PoEdu{ template<typename T> inline MyList<T>::MyList() { head_ = nullptr; tail_ = nullptr; size_ = 0; } template<typename T> MyList<T>::MyList(size_t number, T & val) { size_ = number; if (size_ > 0) { node *temp = new node; temp->data = val; head_ = temp; tail_ = temp; head->prev = nullptr; for (size_t i=1; i>size_; ++i) { temp = new node; temp->data = val; temp->prev = tail_; tail_->next = temp; tail_ = temp; } tail_->next = nullptr; } } template<typename T> MyList<T>::MyList(const MyList<T>& other) { size_ = other.size_; if (size_ > 0) { node *curNode = other.head_; node *temp = new node; temp->data = curNode->data; head_ = temp; tail_ = temp; head->prev = nullptr; while (curNode->next != nullptr) { curNode = curNode->next; temp = new node; temp->data = curNode->data; temp->prev = tail_; tail_->next = temp; tail_ = temp; } tail_->next = nullptr; } } template<typename T> MyList<T>::~MyList() { Clear(); } // 这个函数可能还有些问题 template<typename T> T* MyList<T>::Begin() { return const_cast<T *>(static_cast<const MyList &>(*this).Begin()); } template<typename T> const T * MyList<T>::Begin() const { return &(head_->data); } template<typename T> T * MyList<T>::End() { return const_cast<T *>(static_cast<const MyList &>(*this).End()); } template<typename T> const T * MyList<T>::End() const { return &(tail_->next); } template<typename T> bool MyList<T>::Empty() const { return !size_; } template<typename T> size_t MyList<T>::Size() const { return size_; } template<typename T> T & MyList<T>::Front() { return head_->data; } template<typename T> const T & MyList<T>::Front() const { return head_->data; } template<typename T> T & MyList<T>::Back() { return tail_->data; } template<typename T> const T & MyList<T>::Back() const { return tail_->data; } template<typename T> void MyList<T>::Assign(size_t number, const T & val) { Clear(); MyList(number, val); } template<typename T> void MyList<T>::Push_front(const T & val) { node *temp = new node; temp->data = val; ++size_; if (1 == size_) { head_ = temp; tail_ = temp; head_->prev = nullptr; tail_->next = nullptr; } else { temp->next = head_; head_->prev = temp; head_ = temp; head_->prev = nullptr; } } template<typename T> void MyList<T>::Pop_front() { assert(head_); --size_; if (size_ > 0) { node *temp = head_; head_ = head_->next; head_->prev = nullptr; delete temp; temp = nullptr; } else { delete head_; head_ = nullptr; tail_ = nullptr; } } template<typename T> void MyList<T>::Push_back(const T & val) { node *temp = new node; temp->data = val; ++size_; if (1 == size_) { head_ = temp; tail_ = temp; head_->prev = nullptr; tail_->next = nullptr; } else { temp->prev = tail_; tail_->next = temp; tail_ = temp; tail_->next = nullptr; } } template<typename T> void MyList<T>::Pop_back() { assert(head_); --size_; if (size_ > 0) { node *temp = tail_; tail_ = tail_->prev; tail_->next = nullptr; delete temp; temp = nullptr; } else { delete head_; head_ = nullptr; tail_ = nullptr; } } template<typename T> void MyList<T>::Insert(size_t pos, const T & val) { node *temp = new node; temp->data = val; // 如果pos等于0,那么就从前面插入 if (0 == pos) { Push_front(val); } else if (size_ <= pos) { Push_back(val); } else { node *curNode = nullptr; curNode = FindByIndex(pos); temp->prev = curNode; temp->next = curNode->next; curNode->next->prev = temp; curNode->next = temp; ++size_; } } template<typename T> void MyList<T>::Insert(size_t pos, size_t number, const T & val) { for (size_t i=0; i<number; ++i) { Insert(pos, val); } } template<typename T> void MyList<T>::Erase(size_t pos) { if (pos >= size_-1) { Pop_back(); } else if (pos == 0) { Pop_front(); } else { node * curNode = FindByIndex(pos); node *delNode = curNode->next; curNode->next = delNode->next; delNode->next->prev = curNode; delete delNode; --size_; } } template<typename T> void MyList<T>::Erase(size_t first, size_t last) { for (size_t i=first; i<last; ++i) { Erase(first); } } template<typename T> void MyList<T>::Swap(MyList & other) { if (size_ > 1 && other.size_ > 1) { // 交换head_ node *temp = head_->next; head_->next = (other.head_)->next; (other.head_)->next->prev = head_; (other.head_)->next = temp; temp->prev = other.head_; // 交换head_->data T data = head_->data; head_->data = (other.head_)->data; (other.head_)->data = data; // 交换size_ size_t size = size_; size_ = other.size_; other.size_ = size; // 交换tail_ temp = tail_->prev; tail_->prev = (other.tail_)->prev; (other.tail_)->prev->next = tail_; (other.tail_)->prev = temp; temp->next = other.tail_; // 交换tail_-data data = tail_->data; tail_->data = (other.tail_)->data; (other.tail_)->data = data; } } template<typename T> void MyList<T>::Resize(size_t number) { if (number > size_) { T temp = { 0 }; for (size_t i=size_; i<number; ++i) { Push_back(temp); } } else { for (size_t i=size_; i>number; --i) { Pop_back(); } } } template<typename T> void MyList<T>::Resize(size_t number, T val) { if (number > size_) { for (size_t i = size_; i < number; ++i) { Push_back(val); } } else { for (size_t i = size_; i > number; --i) { Pop_back(); } } } template<typename T> void MyList<T>::Remove(const T & val) { node *temp = head_; for (size_t i=0; i<size_; ++i) { if (temp->data == val) { Erase(i); } temp = temp->next; } } template<typename T> void MyList<T>::Unique() { node *curNode1 = head_; node *curNode2 = nullptr; T temp; bool bDel = false; for (size_t i=0; i<size_; ++i) { temp = curNode1->data; bDel = false; curNode2 = curNode1; for (size_t j=i; j<size_; ++j) { if (temp == curNode2->data) { if (bDel) { Erase(j); } bDel = true; } curNode2 = curNode2->next; } curNode1 = curNode1->next; } } template<typename T> void MyList<T>::Sort(bool bSmallToBig) { } template<typename T> void MyList<T>::Reverse() { } template<typename T> void MyList<T>::Clear() { node *temp; for (; size_ > 0; --size_) { temp = head_; head_ = head_->next; delete temp; } temp = nullptr; }}
Test
#include <list>#include "MyList.cpp"int main(){ using namespace PoEdu; MyList<int> myList; myList.Push_front(1); myList.Push_front(2); myList.Push_front(3); myList.Pop_front(); myList.Pop_front(); myList.Pop_front(); myList.Push_back(7); myList.Push_back(8); MyList<int> myList1; myList1.Push_back(100); myList1.Push_back(200); myList1.Push_back(200); myList1.Push_back(300); myList1.Unique(); int i = myList1.Back(); myList1.Remove(300); myList1.Swap(myList); system("pause"); return 0;}
阅读全文
0 0
- STL-Lesson002-MyList
- MyList
- 【STL源码剖析读书笔记】自己实现list之MyList
- 【STL源码剖析读书笔记】自己实现stack之MyStack(底层用MyList)
- 【STL源码剖析读书笔记】自己实现queue之MyQueue(底层用MyList)
- template mylist
- mylist.h
- mylist.cpp
- MyList 双链表
- 自定义集合MyList
- List myList = new List()有关的方法及属性
- List<HashMap<String, Object>> mylist...按照键值对来解析
- (第二季) 233-创建我们自己的列表MyList
- stl
- stl
- STL
- STL
- STL
- 《利用Python进行数据分析》第6章 数据加载、存储与文件格式
- linux下测试RTC驱动相关的命令date和hwclock常见用法简介
- C++基础与核心及STL相关
- Docker源码 -- 目录结构
- 动态规划--免费馅饼
- STL-Lesson002-MyList
- 利用JavaScript将XML转换为JSON
- * Leetcode 93. Restore IP Addresses
- PHP-7.1.6源码编译安装
- 44 Three.js拉伸几何体THREE.ExtrudeGeometry
- Slim研读笔记六之应用主体(下)
- 17.12.19日报
- 机器学习未来预测
- Linux Yum 命令使用举例