阉割的List
实在忍不住,模仿STL写了个阉割版的List,还没加迭代器,等搞完STL源码再说吧。
#pragma once
#include <stdexcept>
namespace vlyf
{
template <typename Key>
struct Node
{
using pointer = Node*;
Key key;
Node* prev{ nullptr };
Node* next{ nullptr };
Node() = default;
Node(Key const& k) : key(k) {}
};
template <typename T>
class List
{
public:
typedef typename Node<T>::pointer linkType;
private:
linkType head{ new Node<T> };
public:
List()
{
head->prev = head;
head->next = head;
}
~List() = default;
linkType Begin() const { return head->next; }
linkType End() const { return head; }
linkType Search(T const&) const;
linkType Erase(linkType position);
void Insert(linkType position, T const& x);
void PushBack(T const& x) { Insert(End(), x); }
void PushFront(T const& x) { Insert(Begin(), x); }
void PopFront() { Erase(Begin()); }
void PopBack()
{
linkType tmp = End()->prev;
Erase(tmp);
}
void Clear();
void Remove(T const& x);
void Unique();
void Delete(T const& x);
protected:
void Transfer(linkType position, linkType first, linkType last);
};
template <typename T>
inline typename List<T>::linkType List<T>::Search(T const& k) const
{
if (!head)
throw std::out_of_range("List is empty");
linkType p = head;
while (p->key != k)
{
p = p->next;
}
return p;
}
template <typename T>
inline void List<T>::Insert(List<T>::linkType position, T const& x)
{
linkType node = new Node<T>(x);
node->next = position;
node->prev = position->prev;
position->prev->next = node;
position->prev = node;
}
template <typename T>
inline void List<T>::Delete(T const& x)
{
if (!x->prev)
x->prev->next = x->next;
else
head->next = x->next;
if (!x->next)
x->next->prev = x->prev;
delete x;
}
template <typename T>
inline typename List<T>::linkType List<T>::Erase(typename List<T>::linkType position)
{
linkType nextNode = position->next;
linkType prevNode = position->prev;
prevNode->next = nextNode;
nextNode->prev = prevNode;
delete position;
return nextNode;
}
template <typename T>
inline void List<T>::Clear()
{
linkType cur = head->next;
while (cur != head)
{
linkType tmp = cur;
cur = cur->next;
delete tmp;
}
head->next = head;
head->prev = head;
}
template <typename T>
inline void List<T>::Remove(T const& x)
{
linkType first = Begin();
linkType last = End();
while (first != last)
{
linkType tmp = first;
tmp = tmp->next;
if (x == first->key)
{
Erase(first);
}
first = tmp;
}
}
template <typename T>
inline void List<T>::Unique()
{
linkType first = Begin();
linkType last = End();
if (first == last)
return;
linkType next = first->next;
while (next != last)
{
if (next->key == first->key)
Erase(next);
else
first = next;
next = first->next;
}
}
template <typename T>
inline void List<T>::Transfer(linkType position,
linkType first,
linkType last)
{
last->prev->next = position;
first->prev->next = last;
position->prev->next = first;
linkType tmp = position->prev;
position->prev = last->prev;
last->prev = first->prev;
first->prev = tmp;
}
} // namespace vlyf
阉割的List的更多相关文章
- JQuery向导插件Step——第一个阉割版插件
如果使用过JQuery Steps的朋友一定会发现这个插件有一个缺点,就是页面在第一次进入的时候,会进行一次很明显的DOM重绘--页面会闪一下. 尤其是前端代码比较庞大的时候,效果更为明显. 为了解决 ...
- 【Access2007】解救被阉割的truncate
Access2007使用被阉割的J-SQL语句,语法跟T-SQL语句.也就是寻常最标准的SQL语句一模一样,但就是仅保留insert into,delete,select,update与没太大意义的过 ...
- 编译原理作业(第一次)-完成retinf.c(阉割版)
首先,作业要求概括如下: 根据前缀表达式文法,实现statements() 和expression() 两个函数. 并且要求使得语义分析在完成分析前缀表达式并输出中间代码的同时,也能够将前缀表达式翻译 ...
- 某某D的手伸的实在太长了,路由器也未能幸免,致被阉割的TP-Link
前段时间整了个服务器架上l2tp.server, TP-Link路由连上去后,全网走l2tp通道,而且不能配置相关的路由表 然后研究啊 找啊 查啊,确定是路由没有这功能 找客服问了一下,他一听就懂了, ...
- 阉割版BBBlack安装Debian
开门见山,直入主题 咸鱼入手3块阉割ARM板,经过快递近6天运输到手,不过价格便宜 东西下面这样的(借了咸鱼的图): 发现这块板是阉割版的国外beagleboard.org型号为BeagleBone ...
- 在ANTMINER(阉割版BeagleBone Black)运行Debain
开门见山,直入主题 咸鱼入手3块阉割ARM板,经过快递近6天运输到手,不过价格便宜 东西下面这样的(借了咸鱼的图): 发现这块板是阉割版的国外beagleboard.org型号为BeagleBone ...
- 做阉割版Salesforce难成伟大的TOB企业
https://www.lieyunwang.com/archives/446227 猎云注:当前中国市场环境下,有没有可能诞生一批SaaS级企业服务公司?东方富海合伙人陈利伟用三个方面基础性问题解答 ...
- 那些被刻意“阉割”的名人名言
"天才是百分之一的灵感,百分之九十九的汗水",这句名言大家都知道的吧!不过还有好多人不知道的是这句名言还有后半句:"但百分之一的灵感甚至比百分之九十九的汗水更重要.&qu ...
- 启用Win8(中文版/核心版)中被阉割的远程桌面服务端
Windows 8/8.1 标准版(中文版/核心版)中取消了远程桌面服务端,想通过远程连接到自己的电脑就很麻烦了,第三方远程桌面速度又不理想(如TeamViewer).通过以下方法可让系统恢复远程桌面 ...
随机推荐
- Mybatis中的缓存管理
目录 Mybatis中的缓存管理 查询缓存工作原理: 配置缓存: 默认配置: 使用二级缓存: 刷新缓存过程: 配置EHcache 产生脏数据 使用原则: Mybatis中的缓存管理 查询缓存工作原理: ...
- ES6 数组的拓展(五)
一.扩展运算符(...)将数组转化为以,分割的字符串eg: console.log(...[1,2,3,4]); //1 2 3 4 将字符串转化为数组eg: console.log([...'hel ...
- 前端Q的小小小里程碑
很多关注我的人都不太了解前端Q这个名字的由来,这篇文章就来讲讲前端Q的前世今生,顺便送大大福利(文末有惊喜),哈哈-- 恭喜!前端Q总用户数突破千啦~~ 前端Q前世 前端Q这个公众号,其实很早很早的时 ...
- 被严重误会?APS系统没有想象的那么复杂
APS的出现要从90年代了,但到现在,很多行业内的顾问或用户提到APS都马上想到的是“要求很精确”“难度很大”“脱离实际”“太理想化”“工作量太大”等等,然后把它束之高阁不睬. 在这里,给大家分析一下 ...
- Android Scrollview嵌套下listView动态加载数据,解决onScrollChanged执行多次数据重复问题
这一篇博客和上一篇讲的都是listView的动态加载,但有所不同的是,本篇的listView是嵌套在ScrollView下的,有时候在一个Activity中可能分为好几个模块,由于展示的需要(手机屏幕 ...
- Linux shell awk中printf使用
printf 是 awk 的重要格式化输出命令 printf格式化输出内容 格式: printf format,item1,item2... 要点: 1,printf输出时要指定格式f ...
- Nginx Rewrite相关功能-ngx_http_rewrite_module模块指令
Nginx Rewrite相关功能-ngx_http_rewrite_module模块指令 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- UE4 Keynote 1
[UE4 Keynote 1] 1.U3D中的Project,在UE4中叫 ContentBrowser,中文名叫“内容浏览器” 最多可以打开4个ContentBrowser,通过 “窗口” -> ...
- PAT 乙级 1036.跟奥巴马一起编程 C++/Java
题目来源 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏 ...
- flask实战-个人博客-表单
表单 下面我们来编写所有表单类,personalBlog中主要包含下面这些表单: 登录表单: 文章表单: 评论表单: 博客设置表单: 这里仅介绍登录表单.文章表单.分类表单和评论表单,其他的表单在实现 ...