写了个链表类,大家批批,看看有什么值得改进的地方。
#pragma once
template<class T>
class CHebcaListIterator;
template<class T>
class CHebcaListItem
{
public:
CHebcaListItem()
{
Init();
};
CHebcaListItem(T value)
{
Init();
data = value;
};
void Init()
{
next = 0;
previous = 0;
}
T data;
CHebcaListItem * previous;
CHebcaListItem * next;
};
template<class T>
class CHebcaList
{
public:
CHebcaList(void)
{
Init();
};
CHebcaList(CHebcaList<T> &value)
{
Init();
RemoveAll();
CHebcaListIterator<T> iter = value.GetIterator();
while(itor.Next())
{
PushBack(*itor.Current());
}
};
~CHebcaList(void)
{
RemoveAll();
};
void Init()
{
m_pHead = 0;
m_pEnd = 0;
m_nSize = 0;
};
//取得迭代器,指向第一个元素前面.
CHebcaListIterator<T> GetIterator()
{
return CHebcaListIterator<T>(&m_pHead, &m_pEnd);
};
//取得迭代器,指向最后一个元素后面.
CHebcaListIterator<T> GetIteratorBack()
{
return CHebcaListIterator<T>(&m_pHead, &m_pEnd);
};
//在链表中position前面插入元素,position不能位于最后一个元素后面,
//如果需要在最后插入元素,用PushBack()
CHebcaListIterator<T> Insert(CHebcaListIterator<T> position, T value)
{
CHebcaListItem * pElement = new CHebcaListItem<T>(value);
CHebcaListIterator<T> iter = GetIterator();
if(position.m_pCurrent == 0)
{
if(m_pHead)
{
pElement->next = m_pHead;
m_pHead->previous = pElement;
m_pHead = pElement;
}
else
{
m_pHead = pElement;
m_pEnd = pElement;
}
}
else
{
if(position.m_pCurrent->previous)
{
pElement->next = position.m_pCurrent->previous->next;
pElement->previous = position.m_pCurrent->next->previous;
position.m_pCurrent->previous->next = pElement;
position.m_pCurrent->next->previous = pElement;
}
else
{
pElement->next = m_pHead;
m_pHead->previous = pElement;
m_pHead = pElement;
}
}
m_nSize ++;
iter.SetCurrent(pElement);
return iter;
};
//弹出最后一个元素
CHebcaListIterator<T> PopBack()
{
CHebcaListIterator<T> iter = GetIterator();
while(iter.HasNext())
{
iter.Next();
}
return Remove(iter);
};
//弹出第一个元素
CHebcaListIterator<T> PopFront()
{
CHebcaListIterator<T> iter = GetIterator();
iter.Next();
return Remove(iter);
};
//在最后插入一个元素
CHebcaListIterator<T> PushBack(T value)
{
CHebcaListIterator<T> iter = GetIterator();
CHebcaListItem<T> * pElement = new CHebcaListItem<T>(value);
if(m_pHead == 0)
{
m_pHead = pElement;
m_pEnd = pElement;
}
else
{
pElement->previous = m_pEnd;
m_pEnd->next = pElement;
m_pEnd = pElement;
}
m_nSize ++;
iter.SetCurrent(m_pEnd);
return iter;
};
//在前面插入一个元素
CHebcaListIterator<T> PushFront(T value)
{
CHebcaListIterator<T> iter = GetIterator();
iter.Next();
return Insert(iter, value);
};
//删除position指向的一个元素
CHebcaListIterator<T> Remove(CHebcaListIterator<T> position)
{
if(position.m_pCurrent)
{
CHebcaListItem<T> * previous = position.m_pCurrent->previous;
CHebcaListItem<T> * next = position.m_pCurrent->next;
if(previous && next)
{
previous->next = next;
next->previous = previous;
}
if(previous && !next)
{
previous->next = 0;
m_pEnd = previous;
}
if(!previous && next)
{
m_pHead = next;
next->previous = 0;
}
if(!previous && !next)
{
m_pHead = 0;
m_pEnd = 0;
}
delete position.m_pCurrent;
m_nSize --;
}
return GetIterator();
};
//删除所有的元素
void RemoveAll()
{
CHebcaListIterator<T> iter = GetIterator();
while(iter.HasNext())
{
PopFront();
iter = GetIterator();
}
};
//取得链表长度
int GetSize()
{
return m_nSize;
};
//链表是否为空
int IsEmpty()
{
return m_pHead == 0;
};
//赋值运算符重载
CHebcaList & operator =(CHebcaList<T> &value)
{
RemoveAll();
CHebcaListIterator<T> iter = value.GetIterator();
while(itor.Next())
{
PushBack(*itor.Current());
}
return *this;
};
//==运算符重载
int operator==(CHebcaList<T> & value)
{
if(GetSize() == value.GetSize())
{
CHebcaListIterator<T> itor1 = value.GetIterator();
CHebcaListIterator<T> itor2 = GetIterator();
while(itor1.Next())
{
if(*itor1.Current() != *itor2.Next())
{
return 0;
}
}
return 1;
}
else
{
return 0;
}
};
protected:
CHebcaListItem<T> * m_pHead;
CHebcaListItem<T> * m_pEnd;
int m_nSize;
};
//链表迭代器
//首元素前面等价于尾元素后面
//while(iter.Next()){...}遍历一遍后可以继续使用while(iter.Next()){...}进行遍历
template<class T>
class CHebcaListIterator
{
public:
CHebcaListIterator()
{
Init();
};
CHebcaListIterator(CHebcaListItem<T> ** header, CHebcaListItem<T> ** ender)
{
Init();
m_ppHeader = header;
m_ppEnder = ender;
};
//后面是否还有元素
int HasNext()
{
if(m_pCurrent)
{
return m_pCurrent->next != 0;
}
else
{
return *m_ppHeader != 0;
}
};
//向后移动一个元素,如果到了末尾元素后面返回0,否则返回指向当前元素的指针
T * Next()
{
if(m_pCurrent == 0)
{
m_pCurrent = *m_ppHeader;
}
else
{
m_pCurrent = m_pCurrent->next;
}
if(m_pCurrent)
{
return & m_pCurrent->data;
}
else
{
return 0;
}
};
//向前移动一个元素,如果到了首元素前面返回0,否则返回指向当前元素的指针
T * Previous()
{
if (m_pCurrent == 0)
{
if(m_ppEnder)
{
m_pCurrent = *m_ppEnder;
if(m_pCurrent)
{
return & m_pCurrent->data;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
else
{
m_pCurrent = m_pCurrent->previous;
if(m_pCurrent)
{
return & m_pCurrent->data;
}
else
{
return 0;
}
}
};
//返回指向当前元素的指针,如果当前位置为首元素前或尾元素后面,返回0
T * Current()
{
if(m_pCurrent)
{
return & m_pCurrent->data;
}
else
{
return 0;
}
};
//重置当前位置,指向首元素前或者末元素后面
void Reset()
{
m_pCurrent = 0;
};
//指定当前位置(一般不使用)
CHebcaListItem<T> * SetCurrent(CHebcaListItem<T> * current)
{
if(current)
{
m_pCurrent = *m_ppHeader;
while(m_pCurrent != current)
{
m_pCurrent = m_pCurrent->next;
}
}
else
{
m_pCurrent = current;
}
return m_pCurrent;
};
protected:
void Init()
{
m_ppHeader = 0;
m_ppEnder = 0;
m_pCurrent = 0;
};
CHebcaListItem<T> ** m_ppHeader;
CHebcaListItem<T> ** m_ppEnder;
public:
CHebcaListItem<T> * m_pCurrent;
};