做了几道都需要用双向链表来模拟的题,因为STL中的链表感觉有点复杂,不太容易用,所以每次需要用的时候都要自己手写一遍。贴一贴代码,下次需要就可以用。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
struct block
{
int v;
block *next,*former;
block() { next=NULL; former=NULL; };
};
//以下仅包括双向链表的基本操作
struct list
{
block *fro=NULL,*back=NULL;
int size;
void init()
{
if(fro==NULL) return;
while(back!=fro)
{
block *temp=back->former;
delete back;
back=temp;
}
delete fro;
fro=back=NULL;
size=0;
}
void push_fro(block b) //首部入表
{
if(fro==NULL)
{
fro=(block *)malloc(sizeof(block));
fro->v=b.v;
back=fro;
return;
}
block *temp=fro;
fro=(block *)malloc(sizeof(block));
fro->v=b.v;
fro->next=temp; fro->former=NULL;
temp->former=fro;
++size;
}
void push_back(block b) //尾部入表
{
if(fro==NULL)
{
fro=(block *)malloc(sizeof(block));
fro->v=b.v;
back=fro;
return;
}
block *temp=back;
back=(block *)malloc(sizeof(block));
back->v=b.v;
back->former=temp; back->next=NULL;
temp->next=back;
++size;
}
void pop_front() //弹出表头
{
if(fro==NULL) return;
block *temp=fro->next;
if(fro==back) back=NULL;
delete fro;
fro=temp;
fro->former=NULL;
--size;
}
void pop_back() //弹出表尾
{
if(fro==NULL) return;
block *temp=back->former;
if(fro==back) fro=NULL;
delete back;
back=temp;
back->next=NULL;
--size;
}
void remove(block *p) //移去表中某个元素
{
if(p==fro&&p==back)
fro=back=NULL;
else if(p==fro)
fro=fro->next,fro->former=NULL;
else if(p==back)
back=back->former,back->next=NULL;
else
{
block *fm=p->former,*nt=p->next;
fm->next=nt;
nt->former=fm;
}
delete p;
--size;
}
}lt;
void print() //打印链表,方便Debug
{
block *it=lt.fro;
while(it!=lt.back)
printf("%d ",it->v), it=it->next;
printf("%d ",it->v);
}
int main()
{
print();
return 0;
}