数据结构-List
Lis的实现:
///////////////////////////////////////////////////////////////////////////////
//
// FileName : c2_list.h
// Author : Jimmy Han
// Date : N.A v1
// : 2014/07/13 12:30 v2
//
///////////////////////////////////////////////////////////////////////////////
#ifndef C2_LIST_H
#define C2_LIST_H
#include <iostream> template <class object>
class List {
private:
struct Node{
object data;
Node *prev;
Node *next;
Node(const object &d = object(), Node *p = NULL, Node *n = NULL)
: data(d), prev(p), next(n) {}
}; public:
class const_iterator {
public:
const_iterator() : current(NULL)
{} 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;
} const_iterator& operator--()
{
current = current->prev;
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;} //not used by List, but used by iterator, so protected
const_iterator( Node *p) : current(p) {} friend class List<object>;
};
class iterator : public const_iterator {
public:
iterator()
{} object& operator*()
{return this->retrieve();} object& operator*() const
{return const_iterator::operator*() ;} //return type changed, so redefine ++
iterator& operator++()
{
this->current = this->current->next;
return *this;
} const iterator operator++(int)
{
iterator old = *this;
++(*this);
return old;
} iterator& operator--()
{
this->current = this->current->prev;
return *this;
} const iterator operator--(int)
{
iterator old = *this;
--(*this);
return old;
} protected:
iterator(Node* p) : const_iterator(p) {}
friend class List<object>;
}; 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 iter=rhs.begin(); iter!=rhs.end(); ++iter)
push_back(*iter);
return *this;
} iterator begin()
{return iterator(head->next); } iterator end()
{return iterator(tail);} const_iterator begin() const
{return const_iterator(head->next); } const_iterator end() const
{return const_iterator(tail);} int size() const
{return _size;} 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());} //insert object value as x before iter
//return the position of the new inserted object
iterator insert(iterator iter, const object &x)
{
//current is private, could be access cus of friend classs
Node* p = iter.current;
_size++;
return iterator(p->prev = p->prev->next = new Node(x, p->prev, p));
} //erase the object iter point to
//return the next object of iter
iterator erase(iterator iter)
{
if (!empty())
{
/* code */
Node* p = iter.current;
iterator retVal(p->next);
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
--_size;
return retVal;
}
else
{
cout << "Empty List!!" << endl;
return iter;
}
} iterator erase(iterator start, iterator end)
{
for(iterator iter = start; iter != end; )
iter = erase(iter);
return end;
} private:
int _size;
Node *head;
Node *tail; void init()
{
//loop list?
_size = ;
head = new Node;
tail = new Node;
head->next = tail;
tail->prev = head;
} }; #endif
List的测试程序:
///////////////////////////////////////////////////////////////////////////////
//
// FileName : c2_list.cpp
// Author : Jimmy Han
// Date : N.A v1
// : 2014/07/13 12:30 v2
//
///////////////////////////////////////////////////////////////////////////////
#include "printCollection.h"
#include "c2_list.h"
using namespace std; int main()
{
//List();
List<string> slist;
//List<string>::iterator giter;
slist.erase(slist.begin());
//void push_back(const object &x)
slist.push_back("a1");
slist.push_back("a2");
slist.push_front("b1");
slist.push_front("b2");
cout << "After initilization: " << endl;
printCollection(slist);
cout << "Front is: " << slist.front() << endl; //List(const List& rhs);
List<string> slist2 = slist; //push_front(const object &x)
slist2.push_front("c1");
slist2.push_front("c2"); //pop_back()
slist2.pop_back(); //pop_front()
slist2.pop_front(); //object & front()
cout << slist2.front() << endl; //object & back()
cout << slist2.back() << endl; //iterator insert(const iterator &iter, object &x)
slist2.insert(++(slist2.begin()), "d1"); //erase(const_iterator iter)
slist2.erase((slist2.begin())++); //erase(const_iterator start, const_iterator end) //begin(), end()
for(List<string>::const_iterator iter = slist2.begin(); iter != slist2.end(); ++iter)
cout << *iter << " ";
cout << endl; printCollection(slist); return 0;
}
数据结构-List的更多相关文章
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 深入浅出Redis-redis底层数据结构(上)
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- 算法与数据结构(八) AOV网的关键路径
上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
随机推荐
- 【HTML5 】<script>元素async,defer异步加载
原文地址:HTML5′s async Script Attribute原文日期: 2010年09月22日翻译日期: 2013年08月22日 (译者注: 异步加载,可以理解为无阻塞并发处理.) (译者再 ...
- shell脚本中获取本机ip地址的方法
ipaddr='172.0.0.1' ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/ ...
- VS2013和VS2008项目的互通
VS2013和VS2008项目的互通,大家可能都查到了百度经验里面的一个帖子: http://jingyan.baidu.com/article/f54ae2fc3c3adc1e92b849de.ht ...
- DRUPAL点滴
1 admin/config/user-interface/xxx在hook_menu里定义这样一个path,就会在configuration界面看到xxx的链接 2 $news_items = db ...
- LF will be replaced by CRLF in git add
git add 出现这样的提示: LF will be replaced by CRLF in qinqiu.txt. 这个时候要: $ rm -rf .git // 删除.git $ git co ...
- drupal里面的ajax最粗浅的理解-流程
1, form里面的ajax所在地表单元素有一个事件,激发system/ajax,相应的有ajax_form_callback(), 会把被改变的元素值传到form_state[values]中, ...
- OpenCV_轮廓的查找、表达、绘制、特性及匹配
转摘网址为:http://www.cnblogs.com/slysky/archive/2011/10/14/2212227.html 虽然Canny之类的边缘检测算法可以根据像素间的差异检测出轮廓边 ...
- R统计建模与R软件
教材目录 第一章 概率统计的基本知识 第二章 R软件的使用 第三章 数据描述性分析 第四章 参数估计 第五章 假设检验 第六章 回归分析 第七章 方差分析 第八章 应用多元分析(I) 第九章 应用多元 ...
- imageview圆角的实现
介绍一种简单的.另类的实现,就是把图片在显示前处理成圆角的,但是不改变存储的图片.相当于经过了图像过滤. 需要调用的图像工具类是 package com.gaosi.util; /** * @auth ...
- QQ等级图标排名说明_QQ等级表,QQ最高等级(皇冠) qq到一星要5天
从2007年11月29日中午12:00开始,在不改变原有计算方式的情况下,加速QQ会员等级升级.QQ会员用户在原有通过每天在线2小时累积活跃天数来获取相应QQ等级增长的基础上,还可以根据QQ会员VIP ...