📄 p386.cpp
字号:
#include "P384.cpp"
void PageRemove ( const TwoChars & key, const paddr p )
//从p所指的页块中删去关键码key。这是顺序表的删除算法, 可参看第2章。
{
for (int i=0;i<p->Count;i++)
if (p->Names[i]==key)
{
p->Count--;
p->Names[i]=p->Names[p->Count];
return;
}
}
void combine ( unsigned int index ) {
if ( DicDepth == 0 ) return;
int buddyid= buddy (index); //伙伴页块的二进制 地址
paddr p = Directory[index]; //index页块和伙伴页块指针
paddr s = Directory[buddyid];
if ( (buddyid>=0) && ((p->Count + s->Count) <= PageSize )) {
//看该页块与其伙伴的总关键码个数是否超出一页限制, 未超出, 合并页块
for ( int i=0; i<s->Count; i++ ) { //将伙伴中内容全部移到index页块
p->Names[p->Count] = s->Names[i];
p->Count++;
}
delete s; p->PgDepth--; //释放伙伴页块, index页块深度减1
Directory[buddyid] = p;
unsigned int DirSize = Power2(DicDepth); //计算目录项数
unsigned int NewDirSize = DirSize / 2; //如果紧缩,新的目录项数
for ( i=0; i<NewDirSize; i++ ) //判断是否要紧缩目录
if ( Directory[i] != Directory[NewDirSize+i] ) return;
//不需紧缩目录, 结束处理返回
paddr *NewDir = Directory;
DicDepth--; //目录深度减1
Directory = new paddr[NewDirSize]; //创建新目录
for ( i=0; i<NewDirSize; i++ ) Directory[i] = NewDir[i];
delete [ ] NewDir;
if (index<NewDirSize) combine ( index ); else combine(buddyid); //递归, 看是否继续合并
}
}
void Remove ( const TwoChars & key ) { //搜索并删去关键码key
unsigned int id = makeAddress ( key, DicDepth ); //寻找关键码key所在页块的二进制地址
paddr p = Directory [id]; //搜索key所在页块
if ( p ) { //找到, p是指向该页块的指针
PageRemove ( key, p ); //从p所指页块中删去关键码key
combine ( id ); //判断是否合并页块与紧缩目录
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -