1. 程式人生 > 其它 >【資料結構1-1】線性表 P1160 佇列安排

【資料結構1-1】線性表 P1160 佇列安排

用結構體陣列當作連結串列是個好辦法

題解

顯然是個簡單的連結串列,分別寫好左插入、右插入和刪除即可。

注意

寫插入程式碼的時候注意操作的順序,不然會對後續操作造成影響。

AC程式碼

#include<bits/stdc++.h>
using namespace std;

struct Node{
    int l,r;
}node[100010];

void addleft(int x,int pos){
    node[x].l=node[pos].l;
    node[x].r=pos;
    node[node[pos].l].r=x;
    node[pos].l=x;
}

void addright(int x,int pos){
    node[x].l=pos;
    node[x].r=node[pos].r;
    node[node[pos].r].l=x;
    node[pos].r=x;
}

void del(int x){
    if(node[x].l==-1) return;
    node[node[x].l].r=node[x].r;
    node[node[x].r].l=node[x].l;
    node[x].l=-1;
    node[x].r=-1;
}

int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    node[1].l=0;
    node[1].r=100001;
    node[0].r=1;
    node[100001].l=1;
    int n,m,k,p;
    cin>>n;
    for(int i=2;i<=n;i++){
        cin>>k>>p;
        if(p==0) addleft(i,k);
        else if(p==1) addright(i,k);
    }
    cin>>m;
    while(m--){
        cin>>k;
        del(k);
    }
    int i=node[0].r;
    do{
        cout<<i<<' ';
        i=node[i].r;
    }while(i!=100001);
    cout<<endl;
    return 0;
}