双向链表实现简单的list
双向链表结构:
定义一个如下结构体
struct Node
{
Object data;
Node *next;
Node *prev;
};
下面为list的具体实现:
#include <iostream>
using namespace std; template <typename Object>
class List
{
private:
//链表结点的定义
struct Node
{
Object data;
Node *next;
Node *prev; Node(const Object &d = Object(), Node *p = nullptr, Node *n = nullptr)
:data(d), next(n), prev(p){}
};
private:
int theSize;
Node *head;
Node *tail; void init()
{
theSize = ;
head = new Node;
tail = new Node;
head->next = tail;
tail->prev = head;
}
public:
class const_iterator
{
public:
const_iterator() :current(nullptr)
{} const Object &operator* () const
{
return retrieve();
} const_iterator &operator++ ()
{
current = current->next;
return *this;
} const_iterator operator++(int)
{
const_iterator old = *this;
++(*this);
return old;
} bool operator== (const const_iterator &rhs) const
{
return current == rhs.current;
} bool operator!= (const const_iterator &rhs) const
{
return !(*this == rhs);
}
protected:
Node* current;
Object &retrieve() const
{
return current->data;
}
const_iterator(Node *p) :current(p){} friend class List<Object>;
}; class iterator :public const_iterator
{
public:
iterator(){}
Object & operator* ()
{
return retrieve();
} const Object & operator* () const
{
return const_iterator::operator*();
} iterator &operator++ ()
{
current = current->next;
return *this;
} iterator &operator++ (int)
{
iterator old = *this;
++(*this);
return old;
}
protected:
iterator(Node *p) :const_iterator(p)
{} friend class List<Object>;
};
public:
List()
{
init();
} //拷贝构造函数
List(const List &rhs)
{
init();
*this = rhs;
} ~List()
{
clear();
delete head;
delete tail;
} //重载操作符=
const List &operator=(const List &rhs)
{
if (this == &rhs)
return *this;
clear();
for (const_iterator itr = rhs.begin(); itr != rhs.end(); ++itr)
{
push_back(*itr);
}
return *this;
} iterator begin()
{
return iterator(head->next);
} const_iterator begin() const
{
return const_iterator(head->next);
} iterator end()
{
return iterator(tail);
} const_iterator end() const
{
return const_iterator(tail);
} int size() const
{
return theSize;
} bool empty() const
{
return size() == ;
} void clear()
{
while (!empty())
{
pop_front();
}
} Object &front()
{
return *begin();
} const Object &front() const
{
return *begin();
} Object &back()
{
return *--end();
} const Object &back() const
{
return *--end();
} void push_front(const Object &x)
{
insert(begin(), x);
} void push_back(const Object &x)
{
insert(end(), x);
} void pop_front()
{
erase(begin());
} void pop_back()
{
erase(--end());
} iterator insert(iterator itr, const Object &x)
{
Node *p = itr.current;
theSize++;
Node *newNode = new Node(x, p->prev, p);
p->prev = p->prev->next = newNode;
return iterator(newNode);
} iterator erase(iterator itr)
{
Node* p = itr.current;
iterator retVal(p->next);
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
theSize--;
return retVal;
} iterator erase(iterator start, iterator end)
{
for (iterator itr = start; itr != end;)
{
itr = erase(itr);
}
return end;
}
}; int main()
{
List<int> test;
test.push_back();
test.push_back();
test.push_back();
test.push_front();
for (List<int>::iterator itr = test.begin(); itr != test.end();itr++)
{
cout << *itr << ' ';
}
return ;
}
测试结果:
双向链表实现简单的list的更多相关文章
- 双向链表的简单Java实现-sunziren
写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 在上次分享完单向链表的简单编 ...
- JAVA单向/双向链表的实现
一.JAVA单向链表的操作(增加节点.查找节点.删除节点) class Link { // 链表类 class Node { // 保存每一个节点,此处为了方便直接定义成内部类 private Str ...
- JAVA实现单双向链表的增、删、改、查
单向链表 package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { public static vo ...
- redis 5.0.7 源码阅读——双向链表
redis中双向链表相关的文件为:adlist.h与adlist.c 一.数据结构 redis里定义的双向链表,与普通双向链表大致相同 单个节点: typedef struct listNode { ...
- 深度分析:Redis 的数据结构及其使用场景分析,原来这么简单?
Redis基础数据结构有哪些? 一.String(字符串) 在任何一种编程语言里,字符串String都是最基础的数据结构, 那你有想过Redis中存储一个字符串都进行了哪些操作嘛? 在Redis中St ...
- java之数据结构
数据结构有什么用? 现实世界的存储,我们使用的工具和建模.每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做 ...
- 一口气说出Redis 5种数据结构及对应使用场景,面试要加分的
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...
- Redis 5种数据结构及对应使用场景
本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 也当过面试官,面试过不少应聘者,因为是我自己招人自己用,所以我不会看应聘者造火箭的 ...
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也是有很多相似的地方的,听名字可以猜到,每个节点都包含两个指针,一个指针指向上一个节点,一个指针指向下一个节点.这 ...
随机推荐
- How to get the source code of the chromium of the specified revision
I'd like to get the source code of the chromium 34.0.1847.9. gclient config http://src.chromium.org/ ...
- 介绍linux下Source Insight强大代码编辑器sublime_text_3
背景 1 一. 运行环境 1 二.安装环境配置 1 三.创建快捷方式 1 四.配置全局环境 2 五.操作界面 3 背景 在windows操作系统系统下,文本代码编辑器众多,各路英雄豪杰争相写了许多强大 ...
- phpStorm打开提示 failed to create JVM 的解决的方法
phpStorm 软件打开执行提示 failed to create JVM的解决的方法. 改动文件 D:\Program Files (x86)\JetBrains\PhpStorm 7.1.3\b ...
- ExtJS学习-----------Ext.Array,ExtJS对javascript中的Array的扩展
关于ExtJS对javascript中的Array的扩展.能够參考其帮助文档,文档下载地址:http://download.csdn.net/detail/z1137730824/7748893 因为 ...
- Linux查看硬盘使用时间等信息
查看硬盘信息的很多命令,都需要root权限,如果普通用户无法看到信息,请切换至root: 1.查看硬盘使用时间等信息 硬盘使用时间很重要,硬盘理论寿命是3万小时以上 $ sudo smartctl - ...
- RFC2889转发性能測试用例设计和自己主动化脚本实现
一.203_TC_FrameRate-1.tcl set chassisAddr 10.132.238.190 set islot 1 set portList {9 10} ;#端口的排列顺序是po ...
- adm下载器
netdisk;5.2.7;PC;PC-Windows;6.2.9200;WindowsBaiduYunGuanJia
- 自写jquery网页回到顶部效果,渐隐图标,引用js文件就可以
唔.进来开发需求,当网页内容草鸡多的时候,用户就须要有个button高速回到顶部,而不是自己去滚滑轮~ 原本以为比較难的说,由于上头要求所实用js来实现,哪个页面引用,哪个页面显示. 于是乎,本屌丝就 ...
- 【Java】运用JDBC实现一个注册、登录系统的编写
数据库的建立 首先,建立一个数据库,存储注册成功的账户信息. 其SQL的DDL语句如下: CREATE TABLE `jdbctest` ( `id` int(10) NOT NULL auto_in ...
- MySQL 全角转换为半角
序言: 用户注冊时候,录入了全角手机号码,所以导致短信系统依据手机字段发送短信失败.如今问题来了,怎样把全角手机号码变成半角手机号码? 1.手机号码全角转换成半角先查询出来全角半角都存在 ...