C++ 双向链表 使用模板 增删操作
2014-06-24 00:10
459 查看
// Created by T on 14-6-23->
// Copyright (c) 2014年 T. All rights reserved.
//
#ifndef SoBigNumber_Linker_h
#define SoBigNumber_Linker_h
template <class T>
struct LinkerNode
{
T * Data;
LinkerNode<T> *Next;
LinkerNode<T> *Last;
LinkerNode()
{
Data =0;
Next =0;
Last =0;
}
};
template <class T>
class Linker
{
private:
LinkerNode<T> *tmp;
private:
int count;
LinkerNode<T> *Head;
LinkerNode<T> *Tail;
LinkerNode<T> *Cursor;
void addAtStart(LinkerNode<T> *node)
{
if(Head==0)
{
Head=Tail=Cursor=node;
return;
}
node->Last=Head;
node->Next=Head->Next;
Head=node;
}
void addAtEnd(LinkerNode<T> *node)
{
if(Head==0)
{
Head=Tail=Cursor=node;
}
Tail->Next=node;
node->Last=Tail;
Tail=node;
}
LinkerNode<T> *NextNode()
{
LinkerNode<T> *node;
if(Cursor!=0)
{
node=Cursor;
Cursor=Cursor->Next;
return node;
}
resetCursor();
return 0;
}
LinkerNode<T> *LastNode()
{
LinkerNode<T> *node;
if(Cursor!=0)
{
node=Cursor;
Cursor=Cursor->Last;
return node;
}
Cursor=Tail;
return 0;
}
void removeAt(LinkerNode<T>*&node)
{
if(node==0)
return;
if(node==Head)
{
node->Next->Last=0;
Head=Head->Next;
delete node;
node=0;
}
else if(node==Tail)
{
node->Last->Next=0;
node=node->Last;
delete node;
node=0;
}else{
node->Last->Next=node->Next;
node->Next->Last=node->Last;
node->Last=0;
node->Next=0;
delete node;
node=0;
}
}
public:
Linker()
{
count=0;
Head=0;
Tail=0;
Cursor=0;
}
void resetCursor()
{
Cursor=Head;
}
void addAtStart(T *data)
{
if(!data)
return;
LinkerNode<T> *node=new
LinkerNode<T>();
addAtStart(node);
}
void remove(T* data)
{
if(!data)
return ;
tmp=Head;
while(tmp!=0)
{
if(tmp->Data==data)
{
removeAt(tmp);
break;
}
tmp=tmp->Next;
}
}
T *Next()
{
tmp=NextNode();
if(tmp)
return tmp->Data;
else
return 0;
}
T *Last()
{
tmp=Last();
if(tmp)
return tmp->Data;
else
return 0;
}
};
#endif
// Copyright (c) 2014年 T. All rights reserved.
//
#ifndef SoBigNumber_Linker_h
#define SoBigNumber_Linker_h
template <class T>
struct LinkerNode
{
T * Data;
LinkerNode<T> *Next;
LinkerNode<T> *Last;
LinkerNode()
{
Data =0;
Next =0;
Last =0;
}
};
template <class T>
class Linker
{
private:
LinkerNode<T> *tmp;
private:
int count;
LinkerNode<T> *Head;
LinkerNode<T> *Tail;
LinkerNode<T> *Cursor;
void addAtStart(LinkerNode<T> *node)
{
if(Head==0)
{
Head=Tail=Cursor=node;
return;
}
node->Last=Head;
node->Next=Head->Next;
Head=node;
}
void addAtEnd(LinkerNode<T> *node)
{
if(Head==0)
{
Head=Tail=Cursor=node;
}
Tail->Next=node;
node->Last=Tail;
Tail=node;
}
LinkerNode<T> *NextNode()
{
LinkerNode<T> *node;
if(Cursor!=0)
{
node=Cursor;
Cursor=Cursor->Next;
return node;
}
resetCursor();
return 0;
}
LinkerNode<T> *LastNode()
{
LinkerNode<T> *node;
if(Cursor!=0)
{
node=Cursor;
Cursor=Cursor->Last;
return node;
}
Cursor=Tail;
return 0;
}
void removeAt(LinkerNode<T>*&node)
{
if(node==0)
return;
if(node==Head)
{
node->Next->Last=0;
Head=Head->Next;
delete node;
node=0;
}
else if(node==Tail)
{
node->Last->Next=0;
node=node->Last;
delete node;
node=0;
}else{
node->Last->Next=node->Next;
node->Next->Last=node->Last;
node->Last=0;
node->Next=0;
delete node;
node=0;
}
}
public:
Linker()
{
count=0;
Head=0;
Tail=0;
Cursor=0;
}
void resetCursor()
{
Cursor=Head;
}
void addAtStart(T *data)
{
if(!data)
return;
LinkerNode<T> *node=new
LinkerNode<T>();
addAtStart(node);
}
void remove(T* data)
{
if(!data)
return ;
tmp=Head;
while(tmp!=0)
{
if(tmp->Data==data)
{
removeAt(tmp);
break;
}
tmp=tmp->Next;
}
}
T *Next()
{
tmp=NextNode();
if(tmp)
return tmp->Data;
else
return 0;
}
T *Last()
{
tmp=Last();
if(tmp)
return tmp->Data;
else
return 0;
}
};
#endif
相关文章推荐
- 双向链表的增删改查操作
- 链表常用操作的实现-C++模板实现
- C++ 学习练手 - 双向链表的模板实现
- 【C++】模版实现双向链表的各种操作(如:逆置、去重Unique、分类(冒泡)、合并)
- c++模板实现双向链表
- 双向链表的相关操作C++实现
- 使用C++实现的双向链表
- 【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)
- 使用C++实现的双向链表
- 【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)
- C++ 标准模板库STL 双向链表 list 使用方法与应用介绍(一)
- 如何使用c语言实现双向链表的插入删除操作
- (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作
- 双向链表的基础操作(C++实现)
- C++模板-双向链表
- C++ 标准模板库STL 双向链表 list 使用方法与应用介绍(一)
- 使用C++结合文件操作和链表实现学生成绩管理系统
- C++ 双向链表的简单操作
- c++模板实现双向链表
- 【C++】模版实现双向链表的各种操作(如:逆置、去重Unique、分类(冒泡)、合并)