双头链表相关的类对象
template <class T>
class LinkNode
{
public:
LinkNode<T> *next;
LinkNode<T> *prev;
T data;
};
template <class T>
class ListLink
{
public:
ListLink();
~ListLink();
public:
void removeLinkList();
void removeLinkNode(int pos);
T* addLinkNode(T data);
T* insertLinkNode(T data, int pos);
T* tranLinkNode(int curPos, int tranPos);
T* findLinkNodep(int pos);
T findLinkNode(int pos);
LinkNode<T>* findLinkNodeT(int pos);
public:
ListLink<T> *parent;
LinkNode<T> *head;
LinkNode<T> *tail;
T* model;
string name;
int flag;
int size;
int index;
};
链表初始化状态
template <class T>
ListLink<T>::ListLink()
{
head=new LinkNode<T>;
tail=new LinkNode<T>;
head->next=tail;
head->prev=nullptr;
tail->next=nullptr;
tail->prev=head;
parent=nullptr;
model=nullptr;
size=0;
}
template <class T>
ListLink<T>::~ListLink()
{
this->removeLinkList();
delete head;
delete tail;
}
链表插入和删除
template <class T>
T* ListLink<T>::addLinkNode(T e)
{
LinkNode<T>* node=new LinkNode<T>;
node->data=e;
LinkNode<T>* p=tail->prev;
p->next=node;
node->next=tail;
tail->prev=node;
node->prev=p;
size++;
return &node->data;
}
template <class T>
T* ListLink<T>::insertLinkNode(T e, int pos)
{
if(pos<0 || pos>size)
return nullptr;
LinkNode<T>* node=new LinkNode<T>;
node->data=e;
if(pos<=size/2)
{
LinkNode<T>* p=head;
for(int i=0;i<=pos;i++)
p=p->next;
LinkNode<T> *temp=p->prev;
temp->next=node;
node->next=p;
p->prev=node;
node->prev=temp;
size++;
}
else
{
LinkNode<T>* p=tail;
for(int i=size-1;i>=pos;i--)
p=p->prev;
LinkNode<T> *temp=p->prev;
temp->next=node;
node->next=p;
p->prev=node;
node->prev=temp;
size++;
}
return &node->data;
}
template <class T>
void ListLink<T>::removeLinkList()
{
if(size==0)
return;
LinkNode<T> *p=head->next;
while(p!=tail)
{
LinkNode<T>* temp=p;
p=p->next;
delete temp;
temp=nullptr;
}
head->next=tail;
tail->prev=head;
size=0;
}
template <class T>
void ListLink<T>::removeLinkNode(int pos)
{
if(pos<0 || pos>=size)
return;
if(pos<=size/2)
{
LinkNode<T>* p=head;
for(int i=0;i<=pos;i++)
p=p->next;
LinkNode<T> *temp=p->prev;
temp->next=p->next;
p->next->prev=temp;
if(p!=nullptr)
{
delete p;
p=nullptr;
}
size--;
}
else
{
LinkNode<T>* p=tail;
for(int i=size-1;i>=pos;i--)
p=p->prev;
LinkNode<T> *temp=p->prev;
temp->next=p->next;
p->next->prev=temp;
if(p!=nullptr)
{
delete p;
p=nullptr;
}
size--;
}
}
链表查找
template <class T>
T* ListLink<T>::findLinkNodep(int pos)
{
LinkNode<T>* node=head;
if(pos<0 || pos>=size)
return nullptr;
if(pos<=size/2)
{
node=head;
for(int i=0;i<=pos;i++)
node=node->next;
}
else
{
node=tail;
for(int i=size-1;i>=pos;i--)
node=node->prev;
}
return &node->data;
}
template <class T>
T ListLink<T>::findLinkNode(int pos)
{
LinkNode<T>* node=head;
if(pos<0 || pos>=size)
return node->data;
if(pos<=size/2)
{
node=head;
for(int i=0;i<=pos;i++)
node=node->next;
}
else
{
node=tail;
for(int i=size-1;i>=pos;i--)
node=node->prev;
}
return node->data;
}
template <class T>
LinkNode<T>* ListLink<T>::findLinkNodeT(int pos)
{
if(pos<0 || pos>=size)
return nullptr;
LinkNode<T>* node=head;
if(pos<=size/2)
{
node=head;
for(int i=0;i<=pos;i++)
node=node->next;
}
else
{
node=tail;
for(int i=size-1;i>=pos;i--)
node=node->prev;
}
return node;
}
链表移动位置
template <class T>
T* ListLink<T>::tranLinkNode(int cPos, int tPos)
{
if(!(cPos>=0 && cPos<size))
return nullptr;
if(!(tPos>=0 && tPos<size))
return nullptr;
if(tPos==cPos)
return nullptr;
LinkNode<T>* cNode=head;
for(int i=0;i<=cPos;i++)
cNode=cNode->next;
LinkNode<T>* front=cNode->prev;
LinkNode<T>* last=cNode->next;
front->next=last;
last->prev=front;
LinkNode<T>* tFront=head;
for(int i=0;i<tPos;i++)
tFront=tFront->next;
LinkNode<T>* tLast=tFront->next;
tFront->next=cNode;
tLast->prev=cNode;
cNode->prev=tFront;
cNode->next=tLast;
return &cNode->data;
}