最近開始學(xué)習(xí)STL,C 標(biāo)準(zhǔn)模板庫(kù),個(gè)人根據(jù)標(biāo)準(zhǔn)模板庫(kù)中的list 自己寫了個(gè)list模板,由于作業(yè)量較大,只實(shí)現(xiàn)了list里的基本功能,給大家分享下,如有更好的意見請(qǐng)加qq350544011,一起討論討論. 代碼如下:List.h文件:
最近創(chuàng)建了自己的討論群 希望大家能一起加入 群號(hào):45811732
#ifndef LIST#define LIST#include "stdafx.h"
/////////////////////////////鏈表類模板的聲明///////////////////////
template<typename T>
class CList
{
public:
//結(jié)點(diǎn) struct Node
{
T node;
Node* next;
};
//跌代器
class iterator
{
public: iterator()
{
};
~iterator() { };
//重載"!="
bool operator != (iterator &it)
{
if(m_val != it.m_val)
{
return true;
}
return false;
}
//重載"前++ "
iterator operator++ ()
{
m_val = m_val->next;
return *this;
}
//重載 "后++ "
iterator operator++ (int)
{
m_val = m_val->next;
return *this;
}
//重載*
T operator*()
{
return m_val->node;
}
Node *m_val;
private:
};
CList();
~CList();
//在連表尾部添加
void push_back(const T &_node);
//在連表的頭部添加
void push_front(const T &_node);
//刪除連表中的最后一個(gè)元素
void pop_back();
//刪除連表中的第一個(gè)元素
void pop_front();
//返回指向第一個(gè)元素的迭代器
typename CList<T>::iterator begin();
//返回末尾的迭代器
typename CList<T>::iterator end();
//判斷是否為空
bool empty(){ if(!m_phead){ return true; } return false; }
//清空鏈表
void clear();
protected:
private:
Node *m_phead;
};
////////////////////////////類模板的函數(shù)定義///////////////////////
template<typename T>
CList<T>::~CList()
{
//刪除鏈表里的所有結(jié)點(diǎn)
if(m_phead)
{
Node* temp = m_phead;
while(temp->next!=NULL)
{
Node* temp1 = temp;
temp = temp->next;
delete temp1;
temp1 = NULL;
}
m_phead = NULL;
}
}
template<typename T>
CList<T>::CList()
{
m_phead = NULL;
}
template<typename T>
void CList<T>::push_back(const T &_node)
{
//如果連表為空
if(empty())
{
Node* tempnode = new Node;
tempnode->node = _node;
tempnode->next = NULL;
m_phead = tempnode;
}
//如果連表不為空
else
{
Node *temp = m_phead;
while(temp->next!=NULL)
{
temp = temp->next;
}
Node* tempnode = new Node;
tempnode->node = _node;
tempnode->next = NULL;
temp->next = tempnode;
}
}
template<typename T>
void CList<T>::push_front(const T &_node)
{
if(empty())
{
Node* tempnode = new Node;
tempnode->node = _node;
tempnode->next = NULL;
m_phead = tempnode;
}
else
{
Node* tempnode = new Node;
tempnode->node = _node;
tempnode->next = m_phead->next; m_phead = tempnode;
}
}
template<typename T>void CList<T>::pop_back()
{
if(empty())
{
return ;
}
else
{
Node* temp = m_phead;
if(!temp->next)
{
delete temp;
m_phead = NULL;
}
else
{
while(temp->next->next!=NULL)
{
temp = temp->next;
}
delete temp->next;
temp->next = NULL;
}
}
}
template<typename T>void CList<T>::pop_front()
{
if(empty())
{
return;
}
else
{
Node* temp = m_phead;
m_phead = m_phead->next;
delete temp;
temp = NULL;
}
}
template<typename T>typename CList<T>::iterator CList<T>::begin()
{
iterator tempit;
tempit.m_val = m_phead;
return tempit;
}
template<typename T>typename CList<T>::iterator CList<T>::end()
{
//如何去釋放?
iterator tempit ;
Node* tempnode1 = m_phead;
while(tempnode1!=NULL)
tempnode1 = tempnode1->next;
tempit.m_val = tempnode1;
return tempit;
}
template<typename T>void CList<T>::clear()
{
//刪除鏈表里的所有結(jié)點(diǎn) if(m_phead)
{
Node* temp = m_phead;
while(temp->next!=NULL)
{
Node* temp1 = temp;
temp = temp->next;
delete temp1;
temp1 = NULL;
}
m_phead = NULL;
}
}
#endif