双向链表的基本操作

做了几道都需要用双向链表来模拟的题,因为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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值