双向链表结构:

定义一个如下结构体

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的更多相关文章

  1. 双向链表的简单Java实现-sunziren

    写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 在上次分享完单向链表的简单编 ...

  2. JAVA单向/双向链表的实现

    一.JAVA单向链表的操作(增加节点.查找节点.删除节点) class Link { // 链表类 class Node { // 保存每一个节点,此处为了方便直接定义成内部类 private Str ...

  3. JAVA实现单双向链表的增、删、改、查

    单向链表 package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { public static vo ...

  4. redis 5.0.7 源码阅读——双向链表

    redis中双向链表相关的文件为:adlist.h与adlist.c 一.数据结构 redis里定义的双向链表,与普通双向链表大致相同 单个节点: typedef struct listNode { ...

  5. 深度分析:Redis 的数据结构及其使用场景分析,原来这么简单?

    Redis基础数据结构有哪些? 一.String(字符串) 在任何一种编程语言里,字符串String都是最基础的数据结构, 那你有想过Redis中存储一个字符串都进行了哪些操作嘛? 在Redis中St ...

  6. java之数据结构

    数据结构有什么用? 现实世界的存储,我们使用的工具和建模.每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做 ...

  7. 一口气说出Redis 5种数据结构及对应使用场景,面试要加分的

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...

  8. Redis 5种数据结构及对应使用场景

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 也当过面试官,面试过不少应聘者,因为是我自己招人自己用,所以我不会看应聘者造火箭的 ...

  9. (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作

    上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也是有很多相似的地方的,听名字可以猜到,每个节点都包含两个指针,一个指针指向上一个节点,一个指针指向下一个节点.这 ...

随机推荐

  1. UVA 10622 - Perfect P-th Powers(数论)

    UVA 10622 - Perfect P-th Powers 题目链接 题意:求n转化为b^p最大的p值 思路:对n分解质因子,然后取全部质因子个数的gcd就是答案,可是这题有个坑啊.就是输入的能够 ...

  2. [Android学习笔记]LinearLayout布局,剩余空间的使用

    转自:http://segmentfault.com/q/1010000000095725 如果使得一个View占用其父View的剩余空间? 答案是使用:android:layout_weight = ...

  3. 中科燕园GIS外包----机场project地理信息系统EGIS

    对于大型机场建设project,不管project建设过程中.还是project建设完毕后.进入执行和维护阶段.必然要产生和使用到大量的各式各样的信息资料,包含project项目过程管理控制类文档,p ...

  4. EJBCA 在windows上的安装

    为了做EJBCA的封装測试,在我自己电脑上装了个,可是在国内的开发上面的介绍实在是太少.有的也仅仅是些傻瓜式的安装介绍,这是介绍在Windows上安装的过程,(后面介绍下 linux 红帽上的),有些 ...

  5. POJ 3696 神TM数论

    鸣谢: http://blog.csdn.net/yhrun/article/details/6908470 http://blog.sina.com.cn/s/blog_6a46cc3f0100tv ...

  6. swift 笔记2

    swift交流群:342581988,欢迎增加. 今天真郁闷啊,把mac升级到10.10了.如今好了,曾经的程序都跑不了了.哎,不说了,让我郁闷会再. 说说条件推断吧,事实上这些基本的语法大家都知道肯 ...

  7. hdu4223(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4223 由于n范围较小,完全可暴力... #include <cstdio> #includ ...

  8. ym——Android开发编码规范(自用)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android开发编码规范 目的及指导原则 目的 统一规范 Eclipse编辑环境下J ...

  9. bash学习之环境变量

    1.查看系统存在的环境变量env 和 export env命令:查看环境变量 [CJP@CJP ~]$ env HOSTNAME=CJP SHELL=/bin/bash HISTSIZE=1000 U ...

  10. hdu4578(线段树)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题意:n个数,初始值为0,4种操作: 1.将某个区间所有值加上另一个值: 2.将区间所有值都乘上 ...