#include "chainnode.h"
template<class T> class Chain
{
public:
Chain()
{
first = NULL;
last = NULL;
}
~Chain();
inline bool empty()const{ return first==NULL; }
//链表长度
int length()const;
//在链表中查找第K个元素
bool find(int k, T& x)const;
//在链表中查找指定值,并返回位置,如果不在,则返回0
int search(const T& x)const;
//删除指定位置值
Chain<T>* del(int k, T& x);
//在指定位置插入元素
Chain<T>* insert(int k, const T& x);
//删除链表所有节点(析构函数)
void erase();
//将first指针置为0,但不删除任何节点
inline void zero(){ first = NULL; }
//在链表尾部添加元素
Chain<T>* Append(const T& x);
//对链表进行逆转
void reverse();
//对链表排序
void sort();
//输出链表
template<class T> friend ostream& operator<<(ostream &os,const Chain<T>& chain);
private:
ChainNode<T>* first;
ChainNode<T>* last;
};
template<class T> Chain<T>::~Chain()
{
//直接调erase函数即可
erase();
}
template<class T> void Chain<T>::erase()
{
ChainNode<T>* ptr = first;
while (first != NULL)
{
ptr = first->next;
delete first;
first = ptr;
}
}
template<class T> ostream& operator<<(ostream &os,const Chain<T>& chain)
{
ChainNode<T>* ptr = chain.first;
while (ptr != NULL)
{
cout<<ptr->data<<" ";
ptr = ptr->next;
}
//为了可以连续使用<< <<
return os;
}
template<class T> int Chain<T>::length()const
{
int len = 0;
ChainNode<T>* ptr = first;
while (ptr != NULL)
{
len++;
ptr = ptr->next;
}
return len;
}
template<class T> bool Chain<T>::find(int k, T& x)const
{
if (k < 1)
{
return false;
}
int pos = 1;
ChainNode<T>* ptr = first;
while (pos<k && ptr!=NULL)
{
ptr = ptr->next;
pos++;
}
if (pos == k && ptr != NULL)
{
x = ptr->data;
return true;
}
return false;
}
template<class T> int Chain<T>::search(const T& x)const
{
int pos = 1;
ChainNode<T>* ptr = first;
while (ptr!=NULL && ptr->data!=x)
{
ptr = ptr->next;
pos++;
}
if (ptr!=NULL)
{
return pos;
}
return 0;
}
template<class T> Chain<T>* Chain<T>::del(int k, T& x)
{
if (k<1 || first == NULL)
{
return NULL;
}
ChainNode<T>* ptr = first;
ChainNode<T>* qtr = first;
int pos = 1;
if (k == 1)
{
first = first->next;
}
else
{
while (pos < k && ptr != NULL)
{
qtr = ptr;
ptr = ptr->next;
pos++;
}
if (ptr == NULL)
{
return NULL;
}
if (ptr == last)
{
//如果删除的元素在尾部,则重设尾部节点
last = qtr;
}
qtr->next = ptr->next;
}
x = ptr->data;
delete ptr;
return this;
}
template<class T> Chain<T>* Chain<T>::insert(int k, const T& x)
{
if (k < 0)
{
return NULL;
}
ChainNode<T>* sert = new ChainNode<T>(x);
if (k == 0)
{
sert->next = first;
first = sert;
if (first->next == NULL)
{
//只有一个节点是,first和last指向同一个节点
last = first;
}
return this;
}
ChainNode<T> *ptr = first;
int pos = 1;
while (pos<k && ptr != NULL)
{
ptr = ptr->next;
pos++;
}
if (ptr == NULL)
{
return NULL;
}
sert->next = ptr->next;
ptr->next = sert;
//当插入的元素位于最后位置时,需要修改last指向
if (sert->next == NULL)
{
last = sert;
}
return this;
}
template<class T> Chain<T>* Chain<T>::Append(const T& x)
{
ChainNode<T>* node = new ChainNode<T>(x);
if (first == NULL)
{
first = last = node;
}
else
{
last->next = node;
last = node;
}
return this;
}
template<class T> void Chain<T>::reverse()
{
if (first == NULL || first->next == NULL)
{
return;
}
ChainNode<T>* ptr = first->next;
ChainNode<T>* qtr = NULL;
ChainNode<T>* tmp = NULL;
first->next = NULL;
while (ptr != NULL)
{
qtr = ptr->next;
//如果比头节点小,这加在头节点前面
ptr->next = first;
first = ptr;
if (first->next->next == NULL)
{
last = first->next;
}
ptr = qtr;
}
}
template<class T> void Chain<T>::sort()
{
if (first == NULL || first->next == NULL)
{
return;
}
ChainNode<T>* ptr = first->next;
ChainNode<T>* qtr = NULL;
ChainNode<T>* tmp = NULL;
first->next = NULL;
while (ptr != NULL)
{
qtr = ptr->next;
//如果比头节点小,这加在头节点前面
if (ptr->data < first->data)
{
ptr->next = first;
first = ptr;
}
else
{
tmp = first;
//寻找插入环境,进行插入
while (tmp->next != NULL && tmp->next->data < ptr->data)
{
tmp = tmp->next;
}
ptr->next = tmp->next;
tmp->next = ptr;
}
ptr = qtr;
}
ptr = first;
while (ptr->next != NULL)
{
ptr = ptr->next;
}
last = ptr;
}