双向链表的实现——c++
2024-08-29 06:08:57
c++实现双向链表 :
#ifndef DOUBLE_LINK_HXX
#define DOUBLE_LINK_HXX #include <iostream>
using namespace std; template<class T>
struct DNode
{
public:
T value;
DNode *prev;
DNode *next;
public:
DNode() { }
DNode(T t, DNode *prev, DNode *next) {
this->value = t;
this->prev = prev;
this->next = next;
}
}; template<class T>
class DoubleLink
{
public:
DoubleLink();
~DoubleLink(); int size();
int is_empty(); T get(int index);
T get_first();
T get_last(); int insert(int index, T t);
int insert_first(T t);
int append_last(T t); int del(int index);
int delete_first();
int delete_last(); private:
int count;
DNode<T> *phead;
private:
DNode<T> *get_node(int index);
}; template<class T>
DoubleLink<T>::DoubleLink() : count()
{
// 创建“表头”。注意:表头没有存储数据!
phead = new DNode<T>();
phead->prev = phead->next = phead;
// 设置链表计数为0
//count = 0;
} // 析构函数
template<class T>
DoubleLink<T>::~DoubleLink()
{
// 删除所有的节点
DNode<T>* ptmp;
DNode<T>* pnode = phead->next;
while (pnode != phead)
{
ptmp = pnode;
pnode=pnode->next;
delete ptmp;
} // 删除"表头"
delete phead;
phead = NULL;
} // 返回节点数目
template<class T>
int DoubleLink<T>::size()
{
return count;
} // 返回链表是否为空
template<class T>
int DoubleLink<T>::is_empty()
{
return count==;
} // 获取第index位置的节点
template<class T>
DNode<T>* DoubleLink<T>::get_node(int index)
{
// 判断参数有效性
if (index< || index>=count)
{
cout << "get node failed! the index in out of bound!" << endl;
return NULL;
} // 正向查找
if (index <= count/)
{
int i=;
DNode<T>* pindex = phead->next;
while (i++ < index) {
pindex = pindex->next;
} return pindex;
} // 反向查找
int j=;
int rindex = count - index -;
DNode<T>* prindex = phead->prev;
while (j++ < rindex) {
prindex = prindex->prev;
} return prindex;
} // 获取第index位置的节点的值
template<class T>
T DoubleLink<T>::get(int index)
{
return get_node(index)->value;
} // 获取第1个节点的值
template<class T>
T DoubleLink<T>::get_first()
{
return get_node()->value;
} // 获取最后一个节点的值
template<class T>
T DoubleLink<T>::get_last()
{
return get_node(count-)->value;
} // 将节点插入到第index位置之前
template<class T>
int DoubleLink<T>::insert(int index, T t)
{
if (index == )
return insert_first(t); DNode<T>* pindex = get_node(index);
DNode<T>* pnode = new DNode<T>(t, pindex->prev, pindex);
pindex->prev->next = pnode;
pindex->prev = pnode;
count++; return ;
} // 将节点插入第一个节点处。
template<class T>
int DoubleLink<T>::insert_first(T t)
{
DNode<T>* pnode = new DNode<T>(t, phead, phead->next);
phead->next->prev = pnode;
phead->next = pnode;
count++; return ;
} // 将节点追加到链表的末尾
template<class T>
int DoubleLink<T>::append_last(T t)
{
DNode<T>* pnode = new DNode<T>(t, phead->prev, phead);
phead->prev->next = pnode;
phead->prev = pnode;
count++; return ;
} // 删除index位置的节点
template<class T>
int DoubleLink<T>::del(int index)
{
DNode<T>* pindex = get_node(index);
pindex->next->prev = pindex->prev;
pindex->prev->next = pindex->next;
delete pindex;
count--; return ;
} // 删除第一个节点
template<class T>
int DoubleLink<T>::delete_first()
{
return del();
} // 删除最后一个节点
template<class T>
int DoubleLink<T>::delete_last()
{
return del(count-);
} #endif
本文来自http://www.cnblogs.com/skywang12345/p/3561803.html
最新文章
- Python基础-三次用户验证登录购买商品程序
- 自己实现atoi的功能
- myeclipse 2016 激活,myeclipse 2016 激活
- 测试WWW方案(反向代理,负载均衡,HTTP加速缓存)
- BZOJ 3359: [Usaco2004 Jan]矩形( dp )
- java 图形界面 Socket编程
- linux命令学习-3-sysctl
- Android APP 内部捐赠实现(支付宝&;微信)
- XBMC源代码简析 5:视频播放器(dvdplayer)-解复用器(以ffmpeg为例)
- 180815 Python自学成才001
- [物理学与PDEs]第5章第2节 变形的描述, 应变张量 2.1 变形梯度张量
- SSIS Hekaton In-Memory OLTP 【翻译一篇外国文章】
- Asp.net(C#)年月日时分秒毫秒
- 【技巧】easyUI datagrid在隐藏时加载,显示时无法加载出界面
- 解决win系统无法安装.NET Framework 4.0 4.6 原因是HRESULT0xc8000222
- 【转】AlphaGO Zero 原理
- html5 canvas 径向渐变2
- Ajax 中正常使用jquery-easyui (转)
- 重新设置Linux文件共享密码..
- 有了malloc/free 为什么还要new/delete ?
热门文章
- cout<;<;endl 本质探索
- c++日志练习
- DB2 like两个表的字段或like一个变量
- Perl的调试模式熟悉和应用
- Metro Revealed: Building Windows 8 apps with XAML and C# 阅读笔记
- freeRadius与NetGear WNAP210的简使用
- python 求第k个最大数
- AE IRasterCursor 获取栅格图层像素值
- SceneControl+AE+鼠标滚轮缩放
- ZOJ2478 Encoding 2017-04-18 23:02 43人阅读 评论(0) 收藏