除了构造和析构以外的所有用到模板名称的地方都加上类型参数
类模板的选择性实例化
用到哪个函数实例化哪个函数
链表
#include <iostream>
template<typename T>//1、定义一个类型 2、声明类型
class CLink;
template<typename T>
class Node
{
public:
Node(T val=T()):mdata(val),pnext(NULL){}
private:
T mdata;
Node<T>* pnext;
template<typename T>
friend class CLink;//一对一
};
template<typename T>
class CLink
{
public:
CLink();
~CLink();
void InsertHead(T val);
void InsertTail(T val);
void InsertPos(int pos, T val);
void DeletePos(int pos);
void Show();
private:
//Node<T>* FindfrontNode(T val);
Node<T>* phead;
};
template<typename T>
CLink<T>::CLink()
{
phead=new Node<T>();
}
template<typename T>
CLink<T>::~CLink()
{
Node<T>* pCur=phead;
Node<T>* pNext=pCur;
while(pCur!=NULL)
{
pNext=pCur->pnext;
delete pCur;
pCur=pNext;
}
phead=NULL;
}
template<typename T>
void CLink<T>::InsertHead(T val)
{
Node<T>* pnewnode=new Node<T>(val);
pnewnode->pnext=phead->pnext;
phead->pnext=pnewnode;
}
template<typename T>
void CLink<T>::InsertTail(T val)
{
Node<T>* pnewnode=new Node<T>(val);
Node<T>* qNode;
for(qNode=phead;qNode->pnext!=NULL;qNode=qNode->pnext);
pnewnode->mdata=val;
pnewnode->pnext=qNode->pnext;
qNode->pnext=pnewnode;
}
template<typename T>
void CLink<T>::InsertPos(int pos, T val)
{
Node<T>* pnewnode=new Node<T>(val);
Node<T>* qNode=phead;
int i=0;
while(qNode->pnext!=NULL)
{
qNode=qNode->pnext;
i++;
if(pos==i)
{
pnewnode->mdata=val;
pnewnode->pnext=qNode->pnext;
qNode->pnext=pnewnode;
break;
}
}
}
template<typename T>
void CLink<T>::DeletePos(int pos)
{
int i=0;
Node<T>* qNode=phead;
while(qNode->pnext!=NULL)
{
qNode=qNode->pnext;
i++;
if(i==pos)
{
Node<T>* pNode=qNode->pnext;
if(pNode==NULL)
{
break;
}
qNode->pnext=pNode->pnext;
delete pNode;
}
}
}
template<typename T>
void CLink<T>::Show()
{
Node<T>* pCur=phead->pnext;
while(pCur!=NULL)
{
std::cout<<pCur->mdata<<" ";
pCur=pCur->pnext;
}
std::cout<<std::endl;
}
int main()
{
CLink<int> cl;
for(int i=0;i<10;i++)
{
cl.InsertTail(i+1);
}
cl.InsertPos(1,12);
cl.DeletePos(11);
cl.Show();
return 0;
}
栈
#include <iostream>
/*
类模板
类模板的选择性实例化
用到哪个函数实例化哪个函数
*/
const int SIZE=10;
template<typename T>
class Stack
{
public:
Stack();
~Stack();
void Push(T val);
void pop();
T myTop();
bool empty();
private:
bool full();
T arr[SIZE];
int top;
};
template<typename T>
Stack<T>::Stack():top(0){}
template<typename T>
Stack<T>::~Stack()
{
top=0;
}
template<typename T>
void Stack<T>::Push(T val)
{
if(full())
{
throw std::exception("stack is full!");
}
arr[top++]=val;
}
template<typename T>
void Stack<T>::pop()
{
if(empty())
{
throw std::exception("stack is empty!");
}
top--;
}
template<typename T>
T Stack<T>::myTop()
{
if(empty())
{
throw std::exception("stack is empty!");
}
return arr[top-1];
}
template<typename T>
bool Stack<T>::empty()
{
return top==0;
}
template<typename T>
bool Stack<T>::full()
{
return top==SIZE;
}
int main()
{
Stack<int> st;
for(int i=0;i<10;i++)
{
st.Push(i+1);
}
int rt=0;
for(int i=0;i<10;i++)
{
rt=st.myTop();
std::cout<<rt<<" ";
st.pop();
}
std::cout<<std::endl;
}