板子:
int head,e[N],ne[N],idx,n;//head记录头结点位置,e[]记录值,ne[]记录下个节点,idx记录现在数组可用位置 

void init(){//初始化 
	head=-1;
	idx=0;
}
void InsertHead(int x){//在头部插入 
	e[idx]=x, ne[idx]=head,head=idx++;
}
void Delete(int k){//删除第k个节点后的一个节点 
	if(k==0) head=ne[head];
	else ne[k-1]=ne[ne[k-1]];//因为idx是从0开始所以第k个是k-1位置 
}
void Insert(int k,int x){//在第k个节点后面插入一个节点 
	e[idx]=x,ne[idx]=ne[k-1],ne[k-1]=idx++;//因为idx是从0开始所以第k个是k-1位置 
}

所有代码:
#include <bits/stdc++.h>

using namespace std;

const int N=100005;
int head,e[N],ne[N],idx,n;//head记录头结点位置,e[]记录值,ne[]记录下个节点,idx记录现在数组可用位置 
char op[3];
int k,x;

void init(){//初始化 
	head=-1;
	idx=0;
}
void InsertHead(int x){//在头部插入 
	e[idx]=x, ne[idx]=head,head=idx++;
}
void Delete(int k){//删除第k个节点后的一个节点 
	if(k==0) head=ne[head];
	else ne[k-1]=ne[ne[k-1]];//因为idx是从0开始所以第k个是k-1位置 
}
void Insert(int k,int x){//在第k个节点后面插入一个节点 
	e[idx]=x,ne[idx]=ne[k-1],ne[k-1]=idx++;//因为idx是从0开始所以第k个是k-1位置 
}

int main(int argc, char** argv) {
	cin>>n;
	init();
	for(int i=0;i<n;i++){
		scanf("%s",op);
		if(op[0]=='H') scanf("%d",&x),InsertHead(x);
		else if(op[0]=='D') {
			scanf("%d",&k);
			Delete(k);
		}else{
			scanf("%d%d",&k,&x);
			Insert(k,x);
		}
	}
	for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<" ";
	cout<<endl;
	return 0;
}