【C++】:类模板

  • 使用类模板的方式定义的双向链表



/*C++:类模板*/

#ifndef TEMPLATE_CLASS_H
#define TEMPLATE_CLASS_H

#include 

using namespace std;

template 
class DNode{
public:
    DNode(D data){
        next = NULL;
        prev = NULL;
        this->data = data;
        }

    D data;
    DNode* next;
    DNode* prev;
};

template 
class DList{
public:
    DList();
    ~DList();

    /*插入、删除*/
    void insert_next(DNode* node,D data);//在结点node后插入数据data
    void insert_prev(DNode* node,D data);//在结点node前插入数据data
    bool remove(DNode* node);//删除node结点

    /*查找*/
    DNode* Search(D data);//查找链表中数据为data的结点
    DNode* Find(int ith);//查找链表中第ith个结点

    /*链表信息*/
    int list_size(){return size;}
    DNode* head(){return pHead;}
    DNode* tail(){return pTail;}

    /*其他*/
    void display();
private:
    size_t size;
    DNode* pHead;
    DNode* pTail;
};

/*****************************************************************
Function:DList
Description:
            构造函数,主要是初始化size、实例化头结点、初始化
            头指针pHead和尾指针pTail。
*****************************************************************/
template 
DList::DList(){
    size = 0;
    pHead = new DNode(NULL);
    pTail = pHead;
}
/*****************************************************************
Function:~DList
Description:析构函数,主要是释放链表的空间。
*****************************************************************/
template 
DList::~DList(){
    while(size>0)
        remove(pHead->next);
    delete pHead;
}
/*****************************************************************
Function:insert_next
Description:在node结点后插入数据data。
*****************************************************************/
template 
void DList::insert_next(DNode* node,D data){
    if(node==NULL)
        return;
    DNode* p = new DNode(data);
    if(node->next!=NULL){//如果node不是末尾的结点
        //处理p与node->next的关系
        p->next = node->next;
        node->next->prev = p;
    }
    //处理p与node的关系
    node->next = p;
    p->prev = node;
    //如果node是pTail,那么就修改pTail
    if(node==pTail)
        pTail = node->next;
    size++;
}
/*****************************************************************
Function:insert_prev
Description:将数据data插入到结点node之前。
*****************************************************************/
template 
void DList::insert_prev(DNode* node,D data){
    //node为空或者在pHead前插入结点是不允许的
    if(node==NULL||node==pHead)
        return;
    DNode* prev = node->prev;
    insert_next(prev,data);
}

/*****************************************************************
Function:remove
Description:从链表中删除node结点。
*****************************************************************/
template 
bool DList::remove(DNode* node){
    if(node==NULL||node==pHead)
        return false;
    DNode* prev = node->prev;
    if(node==pTail){
        //如果node是末尾结点,直接修改前序结点,并且要修改pTail
        prev->next = NULL;
        pTail = prev;
    }else{
        prev->next = node->next;
        node->next->prev = prev;
    }
    delete node;
    size--;
    return true;
}
/*****************************************************************
Function:Search
Description:查找链表中数据为data的结点。
*****************************************************************/
template 
DNode* DList::Search(D data){
    DNode* p = pHead->next;
    while(p!=NULL){
        if(p->data==data)
            return p;
        p = p->next;
    }
    return NULL;
}
/*****************************************************************
Function:Find
Description:查找链表中第ith个结点。
*****************************************************************/
template 
DNode* DList::Find(int ith){
    if(ith>size||ith<1)
        return NULL;
    DNode* p = pHead;
    for(int i=0;inext;
    return p;
}

template 
void DList::display(){
    DNode* p = pHead->next;
    while(p!=NULL){
        cout<data<<" ";
        p = p->next;
    }
    cout<

 

  • 知识点


  1.  类模板中的成员函数必须同类模板在同一个文件中。在普通类的定义中,我们通常将类的声明放在头文件中,例如:List.h;而将类的实现放在源文件中,例如:List.cpp。而类模板必须定义在List.h中。

  2.  当在普通类外定义成员函数时,应该写作

DList::DList(){}

       但是在类模板中,应该写作

template 
DList::DList(){}

  3.  类模板实例化后,产生模板类。例如下面的类模板实例化过程

DList l1;

       它将模板实参int绑定到模板参数D上。此时,会产生一个新的类,这个类就是将类模板中的所有D替换为int的类。

  4.  不同类型的实例化,会产生不同的模板类,下面代码就产生了2种不同的模板类。

DList l1;
DList l2;

  5.  成员函数只有在调用时才会实例化。

  6.  可以为实例化的类模板定义别名,例如

typedef DList intDList;

  7.  类模板可以定义static成员和方法,相同的模板实参共享static成员和方法。

template 
class Node{
public:
    static int num;
    static int pow(int b,int c);
}

Node i1,i2,i3;//i1、i2和i3共享同一个num和pow()
Node j;//j和i1、i2、i3不共享num和pow()

你可能感兴趣的:(C++)