《数据结构与算法分析C++描述(第3版)》第三章List容器可编译运行版
来源:互联网 发布:ubuntu 修改apt源 编辑:程序博客网 时间:2024/05/06 10:23
作者源代码有点问题,迭代器没定义--操作符,一些接口没考虑空链表的情况,以下是我修改后的可编译运行版本。
#include <assert.h>
#define NULL 0
#define NULL 0
template <typename Object>
class List
{
private:
struct Node
{
Object data;
Node *prev;
Node *next;
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) { }
};
: data(d), prev(p), next(n) { }
};
public:
class const_iterator
{
public:
const_iterator() : theList(NULL), current(NULL)
{ }
class const_iterator
{
public:
const_iterator() : theList(NULL), current(NULL)
{ }
const Object & operator* () const
{
return retrieve();
}
{
return retrieve();
}
const_iterator & operator++ ()
{
current = current->next;
return *this;
}
{
current = current->next;
return *this;
}
const_iterator operator++ (int)
{
const_iterator old = *this;
++(*this);
return old;
}
{
const_iterator old = *this;
++(*this);
return old;
}
bool operator== (const const_iterator & rhs) const
{
rhs.assertIsValid();
if (rhs.theList != theList)
return false;// throw IteratorMismatchException();
{
rhs.assertIsValid();
if (rhs.theList != theList)
return false;// throw IteratorMismatchException();
return current == rhs.current;
}
bool operator!= (const const_iterator & rhs) const
{
return !(*this == rhs);
}
}
bool operator!= (const const_iterator & rhs) const
{
return !(*this == rhs);
}
protected:
Node *current;
const List<Object> *theList;
Node *current;
const List<Object> *theList;
Object & retrieve() const
{
return current->data;
}
{
return current->data;
}
const_iterator(const List<Object> & lst, Node *p)
: theList(&lst), current(p)
{
}
: theList(&lst), current(p)
{
}
void assertIsValid() const
{
//if (theList == NULL || current == NULL || current == theList->head)
// throw IteratorOutOfBoundsException();
assert(theList != NULL && current != NULL && current != theList->head);
}
{
//if (theList == NULL || current == NULL || current == theList->head)
// throw IteratorOutOfBoundsException();
assert(theList != NULL && current != NULL && current != theList->head);
}
friend class List<Object>;
};
};
class iterator : public const_iterator
{
public:
iterator()
{ }
Object & operator* ()
{
return retrieve();
}
const Object & operator* () const
{
return const_iterator::operator*();
}
{
return retrieve();
}
const Object & operator* () const
{
return const_iterator::operator*();
}
iterator & operator++ ()
{
current = current->next;
return *this;
}
{
current = current->next;
return *this;
}
iterator operator++ (int)
{
iterator old = *this;
++(*this);
return old;
}
{
iterator old = *this;
++(*this);
return old;
}
protected:
iterator(const List<Object> & lst, Node *p) : const_iterator(lst, p)
{ }
iterator(const List<Object> & lst, Node *p) : const_iterator(lst, p)
{ }
friend class List<Object>;
};
};
public:
List()
{
init();
}
~List()
{
clear();
delete head;
delete tail;
}
{
clear();
delete head;
delete tail;
}
List(const List & rhs)
{
init();
*this = rhs;
}
{
init();
*this = rhs;
}
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;
}
{
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(*this, head->next);
}
const_iterator begin() const
{
return const_iterator(*this, head->next);
}
iterator end()
{
return iterator(*this, tail);
}
const_iterator end() const
{
return const_iterator(*this, tail);
}
{
return iterator(*this, head->next);
}
const_iterator begin() const
{
return const_iterator(*this, head->next);
}
iterator end()
{
return iterator(*this, tail);
}
const_iterator end() const
{
return const_iterator(*this, tail);
}
int size() const
{
return theSize;
}
bool empty() const
{
return size() == 0;
}
{
return theSize;
}
bool empty() const
{
return size() == 0;
}
void clear()
{
while (!empty())
pop_front();
}
Object & front()
{
return *begin();
}
const Object & front() const
{
return *begin();
}
Object & back()
{
if (empty())
return front();
{
while (!empty())
pop_front();
}
Object & front()
{
return *begin();
}
const Object & front() const
{
return *begin();
}
Object & back()
{
if (empty())
return front();
return *iterator(*this, tail->prev);
}
const Object & back() const
{
if (empty())
return front();
}
const Object & back() const
{
if (empty())
return front();
return *const_iterator(*this, tail->prev);
}
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(iterator(*this, tail->prev));
}
}
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(iterator(*this, tail->prev));
}
iterator insert(iterator itr, const Object & x)
{
itr.assertIsValid();
if (itr.theList != this)
;// throw IteratorMismatchException();
{
itr.assertIsValid();
if (itr.theList != this)
;// throw IteratorMismatchException();
Node *p = itr.current;
theSize++;
return iterator(*this, p->prev = p->prev->next = new Node(x, p->prev, p));
}
theSize++;
return iterator(*this, p->prev = p->prev->next = new Node(x, p->prev, p));
}
// Erase item at itr.
iterator erase(iterator itr)
{
if (empty())
return end();
iterator erase(iterator itr)
{
if (empty())
return end();
itr.assertIsValid();
if (itr.theList != this)
;// throw IteratorMismatchException();
if (itr.theList != this)
;// throw IteratorMismatchException();
Node *p = itr.current;
iterator retVal(*this, p->next);
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
theSize--;
iterator retVal(*this, p->next);
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
theSize--;
return retVal;
}
}
iterator erase(iterator from, iterator to)
{
for (iterator itr = from; itr != to;)
itr = erase(itr);
{
for (iterator itr = from; itr != to;)
itr = erase(itr);
return to;
}
}
private:
int theSize;
Node *head;
Node *tail;
int theSize;
Node *head;
Node *tail;
void init()
{
theSize = 0;
head = new Node;
tail = new Node;
head->next = tail;
tail->prev = head;
}
};
{
theSize = 0;
head = new Node;
tail = new Node;
head->next = tail;
tail->prev = head;
}
};
int main()
{
List<int> list;
list.push_back(1);
list.pop_back();
return 0;
}
{
List<int> list;
list.push_back(1);
list.pop_back();
return 0;
}
0 0
- 《数据结构与算法分析C++描述(第3版)》第三章List容器可编译运行版
- 数据结构与算法分析 C++描述(第3版) 习题2.8 详尽分析
- 数据结构与算法C语言描述 第三章练习
- 《数据结构与算法分析--C++描述》(第三版)学习笔记系列一:BST的实现
- 数据结构与算法描述(第三章示例)
- 数据结构与算法分析,Java语言描述,第2版 Mark Allen Weiss 笔记
- 【备注】【C19】《数据结构与算法分析:Java语言描述(第2版)》PDF
- 谁有数据结构与算法分析——C++描述英文版或中文版的.第3版PDF
- 数据结构与算法分析C语言描述(第二版)示例代码下载
- 数据结构与算法分析-c语言描述版 mark allen weiss
- 平方探测法的证明《数据结构与算法分析(C语言描述)第二版》P119
- 数据结构与算法分析:C语言描述(原书第2版) PDF
- 《数据结构与算法分析--c语言描述》之第二章:算法分析
- 《数据结构与算法分析-C语言描述》笔记
- 《数据结构与算法分析--c语言描述》之第一章:引论
- 数据结构与算法分析-C语言描述 重点笔记
- 《数据结构与算法分析:c语言描述》读书笔记
- 数据结构与算法分析:C语言描述(pdf+源码+答案)
- nyoj--24 素数距离问题
- stm32 SWD下载
- Web开发:我希望得到的编程学习路线图
- python selenium的在线安装及离线安装
- bc #75 1002
- 《数据结构与算法分析C++描述(第3版)》第三章List容器可编译运行版
- HDU3785寻找大富翁~~真真切切的水题
- Java 基础拾遗
- 各种不会各种学
- python selenium2 环境搭建
- 新增列并添加注释
- 剑指offer 合并两个排序的链表
- selenium(1)
- CodeForces 86D Powerful array 莫队算法