双链表与单链表的区别在于双链表的结点多了一个指向前驱结点的指针。
template<class T>
class DulNode{
T data;
DulData<T> *pre,*next;
};
双链表与单链表大部分操作基本一致,可参考单链表的操作:
线性表的链式存储结构——单链表
构造
头插法
first=new DulNode<T>;
first->next=nullptr;
for(int i=0;i<n;i++){
DulNode<T> *p=new DulNode<T>;
p->data=a[i];
p->pre=first;
p->next=first->next;
first->next->pre=p;
first->next=p;
}
尾插法
first=new DulNode<T>;
first->pre=nullptr;
DulNode<T> *p=first,*s=nullptr;
for(int i=0;i<n;i++){
s=new DulNode<T>;
s->data=a[i];
s->pre=p;
p->next=s;
p=s;
}
p->next=nullptr;
插入操作
template<class T>
void Insert(int i,T x){
DulNode<T> *p=first;
int cnt=0;
//找i-1位置
while(cnt<i-1&&p!=nullptr){
p=p->next;
cnt++;
}
if(p==nullptr) throw"插入位置错误";
else{
DulNode<T> *s=new DulNode<T>;
s->data=x;
s->pre=p;
s->next=p->next;
p->next->pre=s;
p->next=s;
}
}
删除操作
template<class T>
T Delete(int i){
DulNode<T> *p=first;
int cnt=0;
while(cnt>i-1&&p!=nullptr){
p=p->next;
cnt++;
}
if(p==nullptr||p->next==nullptr){
throw "删除位置有误";
}else{
DulNode<T> *s=p->next;
T x=s->data;
p->next=s->next;
s->next->pre=p;
delete s;
return x;
}
}