块状链表作为一种集成了链表和分块的数据结构,
有着非常优秀的性质
查询和删除都是$O(\sqrt )$复杂度的
需要支持的操作
1.创建一个新节点
2.插入一个新节点
3.删除一个旧节点
4.向已知节点中加入新值
5.删除已知节点中某些值
6.合并某两个相邻的节点
7.把一个节点分离成两个
我们同样需要一个"缓存区"
用于存储初始数据和交换数据
这其中某些操作可以通过其他几种操作组合得来
例如分离两个节点可以删除这个节点,
同时将这个节点中的数据缓存到缓存区
然后创建新节点将缓存区内的数据读取到新节点
所以这个代码好难写……233333
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 5555
using namespace std;
int data[N*N];
struct Block{
int s[N],len;
};
class BlockList{
struct Node{
ListNode* nxt,pre;
Block data;
};
Node* head,tail;
int len;
Block newBlock(int n){//Build and read the data from the cache to initialize the new block;
Block now.len=n;
for(int i=0;i<n;++i)
now.s[i]=data[i];
}
Node* newnode(int n){//Build and initialize a new ListNode;
Node* now=(Node*)malloc(sizeof(Node));
now->nxt=now->pre=NULL;
now->data=newBlock(n);
return now;
}
BlockList(){//Initialize the BlockList;
head=newnode(0);
tail=newnode(0);
head->nxt=tail;tail->pre=head;
}
bool LDTTA(int x){//Load the x‘th data to the cache;
if(len<x)return false;
Node* now=head;
for(int i=0;i<x;++i)
now=now->nxt;
for(int i=0;i<now->data.len;++i)
data[i]=now->data.s[i];
}
bool LDTTA(Node* root){//Load root‘ data to the cache;
if(root==NULL)return false;
for(int i=0;i<now->data.len;++i)
data[i]=now->data.s[i];
}
bool InsertANode(Node* root,int n){//Insert a new n‘size Node after the Node* root;
if(root==tail)return false;
if(root==NULL)return false;
Listnode* in=newnode(n);
Listnode* tmp=root->nxt;
in->nxt=tmp;in->pre=root;
root->nxt=in;tmp->pre=in;
len++;
return true;
}
bool Delete(Node* root){//Detele the Node root and Load the date from the root to the cache;
elem->pre->nxt=elem->nxt;
elem->nxt->pre=elem->pre;
if(elem==head)head=elem->nxt;
if(elem==tail)tail=elem->pre;
LDTTA(root);free(elem);
}
};