今天刚学了模板, 用模板写了个单链表, 不知道还有什么改进的地方,望大神们给点建议。
template<typename T>
class CLink
{
public:
CLink()
{
mpHead = new CNode();
}
~CLink()
{
while(!empty())
{
if(mpHead->mpNext == NULL)
{
delete mpHead;
mpHead = NULL;
}
removeHead();
}
}
bool empty() const
{
return mpHead == NULL;
}
void insertHead(const T &val)
{
CNode *ptr = new CNode(val);
ptr->mpNext = mpHead->mpNext;
mpHead->mpNext = ptr;
}
void insertTail(const T &val)
{
CNode *ptr = mpHead;
while(ptr->mpNext != NULL)
{
ptr = ptr->mpNext;
}
CNode *p = new CNode(val);
ptr->mpNext = p;
}
void insertByPos(const T &val, int pos)
{
if(pos == -1) insertHead(val);
else
{
CNode *ptr = mpHead;
while(ptr->mpNext != NULL && --pos)
{
ptr = ptr->mpNext;
}
if(ptr->mpNext == NULL)
{
insertTail(val);
}
else
{
CNode<T> *p = new CNode(val);
p->mpNext = ptr->mpNext;
ptr->mpNext = p;
}
}
}
void removeHead()
{
if(empty()) return ;
CNode *ptr = mpHead->mpNext;
mpHead->mpNext = ptr->mpNext;
delete ptr;
ptr = NULL;
}
void removeTail()
{
if(empty()) return ;
CNode *ptr = mpHead->mpNext;
CNode *p = mpHead;
while(ptr->mpNext != NULL)
{
p = ptr;
ptr = ptr->mpNext;
}
delete ptr;
ptr = NULL;
p->mpNext = NULL;
}
void removeByPos(int pos)
{
if(empty()) return ;
if(pos == 0) removeHead();
else
{
CNode *ptr = mpHead->mpNext;
CNode *p = mpHead;
while(--pos && ptr->mpNext != NULL)
{
p = ptr;
ptr = ptr->mpNext;
}
if(ptr->mpNext == NULL)
{
removeTail();
}
else
{
p->mpNext = ptr->mpNext;
delete ptr;
ptr = NULL;
}
}
}
private:
struct CNode
{
public:
CNode(const T &val, CNode<T> *p = NULL): mData(val),mpNext(p){}
CNode(CNode<T> *ptr = NULL):mpNext(ptr){}
T mData;
CNode *mpNext;
};
CNode *mpHead;
};