链表

· · 个人记录

使用前,请根据自己需要更改基本数据类型:

#define L_T int

以上实现了一个以 \text{int} 为基本数据类型的链表定义。

操作

#define L_T int
struct List{
    int tot,size;
    int nc[N];
    struct Line{
        int head,next;
        L_T val;
    }a[N],e;
    L_T INF;
    List(){
        tot=size=0;
        for(int i=1;i<N;i++)
            nc[i]=i;
        e.head=e.next=0;
        e.val=0;
        INF=0x3f3f3f3f;
    }
    int build(int p,L_T val){
        int np=nc[++tot];
        size++;
        a[np]=e;
        a[np].head=p;
        a[np].next=a[p].next;
        a[a[p].next].head=np;
        a[p].next=np;
        a[np].val=val;
        return np;
    }
    L_T del(int p){
        size--;
        nc[tot--]=p;
        a[a[p].head].next=a[p].next;
        a[a[p].next].head=a[p].head;
        return a[p].val;
    }
    int insert(int p,L_T val){
        if(p>size)
            return 0;
        int np=0;
        for(int i=0;i<p;i++)
            np=a[np].next;
        return build(np,val);
    }
    int push_front(L_T val){
        return build(0,val);
    }
    int push_back(L_T val){
        return build(a[0].head,val);
    }
    L_T remove(int p){
        if(p>size)
            return INF;
        int np=0;
        for(int i=0;i<p;i++)
            np=a[np].next;
        return del(np);
    }
    L_T pop_front(){
        if(!size)
            return INF;
        return del(a[0].next);
    }
    L_T pop_back(){
        if(!size)
            return INF;
        return del(a[0].head);
    }
    L_T get_val(int p){
        if(size<p)
            return INF;
        int np=0;
        for(int i=0;i<p;i++)
            np=a[np].next;
        return a[np].val;
    }
    L_T get_front(){
        if(!size)
            return INF;
        return a[a[0].next].val;
    }
    L_T get_back(){
        if(!size)
            return INF;
        return a[a[0].head].val;
    }
    void write(int l,int r){
        l=max(l,1);
        r=min(r,size);
        int p=0;
        for(int i=0;i<r;i++){
            p=a[p].next;
            if(i>=l-1)
                printf("%d ",a[p].val);
        }
        printf("\n");
    }
};