您的位置:首页 > 编程语言 > C语言/C++

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: