整体实现
之前只是用c语言写过简单的链表。本次想通过此来实现一个好的模板类。
CMlist.h文件
``
template <class T>
class CMlist {
struct Node {
T value;
Node* next;
Node() {
next = NULL;
memset(&value, 0, sizeof(T));
};
Node(T val) {
next = NULL;
value = val;
};
};
public:
CMlist();
CMlist(T val);
~CMlist();
void push(T value);
void pop();
bool pop(T &val);
bool isEmpty();
size_t size() { return num };
private:
void nodefree(Node* root);
private:
size_t num;
Node* m_pnode;
Node* m_ptail;
};
为了维护方便,增加了尾节点,方便插入。
CMlist.cpp文件
template<class T>
inline CMlist<T>::CMlist()
{
m_pnode = NULL;
m_ptail = m_pnode;
num = 0;
}
template<class T>
CMlist<T>::CMlist(T val)
{
m_pnode = new Node(val);
m_ptail = m_pnode;
num = 1;
}
template<class T>
inline CMlist<T>::~CMlist()
{
nodefree(m_pnode);
m_pnode = NULL;
m_ptail = NULL;
num = 0;
}
template<class T>
inline void CMlist<T>::push(T value)
{
num++;
Node* pnode = new Node(value);
if (m_pnode == NULL)
{
m_pnode = pnode;
m_ptail = pnode;
return;
}
m_ptail->next = pnode;
m_ptail = pnode;
}
template<class T>
void CMlist<T>::pop()
{
if (m_pnode == NULL)
{
return;
}
num--;
if (m_pnode->next == NULL)
{
delete m_pnode;
m_pnode = NULL;
m_ptail = NULL;
return;
}
Node* pnode = m_pnode;
m_pnode = Node->next;
delete pnode;
}
template<class T>
bool CMlist<T>::pop(T& val)
{
if (m_pnode == NULL)
{
return false;
}
num--;
if (m_pnode->next == NULL)
{
val = m_pnode->value;
delete m_pnode;
m_pnode = NULL;
m_ptail = NULL;
return true;
}
Node* pnode = m_pnode;
val = m_pnode->value;
m_pnode = m_pnode->next;
delete pnode;
return true;
}
template<class T>
bool CMlist<T>::isEmpty()
{
return m_pnode == NULL;
}
template<class T>
void CMlist<T>::nodefree(Node* root)
{
if (root == NULL)
{
return;
}
if (root->next == NULL)
{
delete root;
return;
}
nodefree(root->next);
}
维护性和扩展性思考
- 这套代码其实可以适当加入try throw进行异常抛出。
- 也可以加锁进行操作,作为消息队列使用。
- 还需要考虑模板类的拷贝问题,需要对=进行运算符重载。