对比于单链表,双链表的结点发生了改变:
template<typename Datatype>
struct Node
{
Datatype data;
Node<Datatype> *last; // 上一个结点的地址
Node<Datatype> *next; // 下一个结点的地址
};
单链表的缺点就是结点只存储了后续结点的地址,没有上一个结点的地址。
也许有人问:有什么关系呢?
后者还有回头路,而前者只能一路走到底。
与单链表相比,双链表该多注意的点:
1.双链表的头结点的last指针为空,因为它前面没有结点了。
尾结点的next指针也为空。
2.对链表中的结点进行操作(删除,插入结点)时,要同时修改结点p的两边结点中的指针域。
前驱结点的next指针域,后续结点的last指针域。
插入过程:
删除等同于插入的逆过程,相关代码与单链表类似,可查看上一篇博客《速学单链表》。
#include<iostream>
#include<algorithm>
using namespace std;
template<typename Datatype>
struct Node{
Datatype data;
Node<Datatype> *last,*next;
};
template<typename Datatype>
class Slb{
private:
Node<Datatype> *first;
public:
Slb();
void insert_s();
void schu();
void print_s();
// ~Slb();
};
template<typename Datatype>
Slb<Datatype>::Slb(){
first = new Node<Datatype>;
first->next = NULL;
Datatype news;
Node<Datatype> *r;
while(cin>>news&&news!=0)
{
r = first;
Node<Datatype> *s;
s = new Node<Datatype>;
s->data = news;
int ks=1;
while(ks==1)
{
if(r->next)
if(news>r->next->data)
r = r->next;
else
ks=0;
else
ks=0;
}
s->next=r->next;
r->next=s;
s->last=r;
if(s->next)
s->next->last=s;
}
}
template<typename Datatype>
void Slb<Datatype>::print_s(){
Node<Datatype> *p;
p=first;
while(p->next)
{
p=p->next;
cout<<p->data<<" ";
}
cout<<endl;
}
template<typename Datatype>
void Slb<Datatype>::insert_s(){
Datatype news;
Node<Datatype> *r;
while(cin>>news&&news!=0)
{
r = first;
Node<Datatype> *s;
s = new Node<Datatype>;
s->data = news;
int ks=1;
while(ks==1)
{
if(r->next)
if(news>r->next->data)
r = r->next;
else
ks=0;
else
ks=0;
}
s->next=r->next;
r->next=s;
s->last=r;
if(s->next)
s->next->last=s;
}
}
template<typename Datatype>
void Slb<Datatype>::schu(){
Datatype olds;
while(cin>>olds&&olds!=0)
{
Node<Datatype> *z;
z = first;
int ge=0;
while(z->next)
{
if(z->next->data==olds)
++ge;
z = z->next;
}
while(ge>0)
{
int ks=1;
Node<Datatype> *r;
r = first->next;
while(ks==1)
{
if(olds==r->data)
ks=0;
else
{
if(r->next)
r = r->next;
else
ks=0;
}
}
r->last->next=r->next;
if(r->next)
r->next->last=r->last;
delete r;
--ge;
}
}
}
int main()
{
Slb<int> a;
a.print_s();
a.insert_s();
a.print_s();
a.schu();
a.print_s();
}
感谢各位老板坚持看到这,虽然这份博客有许多问题,漏洞,但它确实是我经过一番努力写出来的。
如果有大佬发现这份博客的错误,可以在评论区指出来,我一定会及时修改!麻烦了!!!
希望各位读者可以为这篇博客点个赞!!!它将会激励我的学习动力!!!再次感谢!
也希望我的博客对大家的学习有帮助!
再见了。