首先,我们知道使用结构体来构造单链表需要:头结点,数据域,指针域
三要素
定义一个头结点cur=0;
数据域数组:e[ ];
指针域数组:en[ ];
通常需要一个cur记录插入了第几个数
储存当前用到了哪个位置/插入了几个数:cur
结尾处指向NULL
用cur=0即为空
插入
void add_k(int k, int x) //将x插到第k个插入的元素后面
{
e[cur]=x; //将x值存入head之后的结点
ne[cur]=ne[k]; //将x结点指向k结点的下一个结点
ne[k]=cur; //将k结点的下一个结点指向x结点
cur++; //cur变到下一个位置
}
删除
void del_k(int k) //将第k个插入的数删除
{
en[k]=en[en[k]]; //掠过k的下一个结点
}
完整的插入和删除函数代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
// e[i] 表示节点i的值
// ne[i] 表示节点i的next指针是多少
// cur 存储当前已经用到了哪个点
int cur=1,e[N],ne[N];
//注意:头结点为cur=0
void add_k(int k, int x) //将x插到第k个插入的元素后面
{
e[cur]=x; //将x值存入head之后的结点
ne[cur]=ne[k]; //将x结点指向k结点的下一个结点
ne[k]=cur; //将k结点的下一个结点指向x结点
cur++; //cur变到下一个位置
}
void del_k(int k) //删除第k个插入的元素后面的数
{
ne[k] = ne[ne[k]]; //k的下一个结点,指向k下一个结点的下一个结点。
//即掠过k的下一个结点
}
int main()
{
int m;
cin >> m;
while (m--) { //m组测试用例
char op;
int k,x;
cin >> op;
if (op == 'H') { //特殊判断,H的时候头结点cur=0
cin >> x;
add_k(0,x);
}
else if (op == 'I') { // 执行insert操作
cin >> k >> x;
add_k(k,x);
} else {
cin >> k;
del_k(k);
}
}
for (int j = ne[0]; j ; j = ne[j]) cout << e[j] << ' ';
cout << endl;
return 0;
}