template<class T>
bool List<T>::SetData(int i,T& x)
{
if(i <= 0)
return false;
LinkNode<T> *current = Locate(i);
if(current == NULL)
return false;
current->data = x;
return true;
}
template<class T>
bool List<T>::Insert(int i,T& x)
{
if(i < 0 )//可以插入在第一个结点之前,有头结点的好处代码一致
return false;
LinkNode<T> *current = Locate(i);
return false;
LinkNode<T> *newNode = new LinkNode<T>(x);
if(newNode == NULL)
return false;
newNode->prior = current; //双向链表插入的关键四步,顺序不能变,最后一句必须最后执行
newNode->next = current->next;
current->next->prior = newNode;
current->next = newNode;
return true;
}
template<class T>
LinkNode<T>* List<T>::Remove(int i,T& x)
{
if(i <= 0)
return NULL;
LinkNode<T> *current = Locate(i);//和单链表不同的是,双向链表有前指针可以指向前驱,所以定位到第i个就好
if(current ==NULL)
return NULL;
current->next->prior = current->prior;//双向链表删除操作较为简单明了
current->prior->next = current->next;//重新搭链
x = current->data;
delete current;//销毁指针资源
}
template<class T>
bool List<T>::isEmpty() const
{
return ((first->next == NULL) true : false);
}
template<class T>
void List<T>::input(T endTag)
{
LinkNode<T> *newNode,*last = first;
T value;
cin》value;
while(value != endTag)
{
newNode = new LinkNode<T>(value);
newNode->prior = last;
last->next = newNode;
last = newNode;
cin》value;
}
}
template<class T>
void List<T>::output()//输出
{
cout《"双向链表输出如下:"《endl;
LinkNode<T> *current = first->next;
int count = 0;
while(current != NULL)
{
cout《"#"《count+1《":"《current->data《endl;
current = current->next;
count++;
}
}
template<class T>
void List<T>::Sort()//最小选择 排序
{
LinkNode<T> *current1,*current2;//下面连续取后继指针把外层循环控制在倒数第二个结点
for(current1 = first->next ; current1->next != NULL ; current1 = current1->next)
{
for(current2 = current1->next ; current2 != NULL ; current2 = current2->next)
{
if(current1->data > current2->data)
{
T temp;
temp = current1->data;
current1->data = current2->data;
current2->data = temp;
}
}
}
}
template<class T>
void List<T>::operator= (List<T> &L)
{
makeEmpty();//先全部销毁指针资源
LinkNode<T> *srcptr = L.getHead() ->next; //获取头指针 用于遍历
LinkNode<T> *destptr = first; //= new LinkNode<T>;//不用于赋值初始化,只用于复制,不用建立新头结点
LinkNode<T> *newNode;
T value;
while(srcptr != NULL)//直到最后一个结点的尾指针为空结束
{
value = srcptr->data;
newNode = new LinkNode<T>(value);
newNode->prior = destptr;//往新链表的后面插入
destptr->next = newNode;
srcptr = srcptr->next;//后移
destptr = destptr->next;
}
}