?? p386.cpp
字號(hào):
#include "P384.cpp"
void PageRemove ( const TwoChars & key, const paddr p )
//從p所指的頁(yè)塊中刪去關(guān)鍵碼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); //伙伴頁(yè)塊的二進(jìn)制 地址
paddr p = Directory[index]; //index頁(yè)塊和伙伴頁(yè)塊指針
paddr s = Directory[buddyid];
if ( (buddyid>=0) && ((p->Count + s->Count) <= PageSize )) {
//看該頁(yè)塊與其伙伴的總關(guān)鍵碼個(gè)數(shù)是否超出一頁(yè)限制, 未超出, 合并頁(yè)塊
for ( int i=0; i<s->Count; i++ ) { //將伙伴中內(nèi)容全部移到index頁(yè)塊
p->Names[p->Count] = s->Names[i];
p->Count++;
}
delete s; p->PgDepth--; //釋放伙伴頁(yè)塊, index頁(yè)塊深度減1
Directory[buddyid] = p;
unsigned int DirSize = Power2(DicDepth); //計(jì)算目錄項(xiàng)數(shù)
unsigned int NewDirSize = DirSize / 2; //如果緊縮,新的目錄項(xiàng)數(shù)
for ( i=0; i<NewDirSize; i++ ) //判斷是否要緊縮目錄
if ( Directory[i] != Directory[NewDirSize+i] ) return;
//不需緊縮目錄, 結(jié)束處理返回
paddr *NewDir = Directory;
DicDepth--; //目錄深度減1
Directory = new paddr[NewDirSize]; //創(chuàng)建新目錄
for ( i=0; i<NewDirSize; i++ ) Directory[i] = NewDir[i];
delete [ ] NewDir;
if (index<NewDirSize) combine ( index ); else combine(buddyid); //遞歸, 看是否繼續(xù)合并
}
}
void Remove ( const TwoChars & key ) { //搜索并刪去關(guān)鍵碼key
unsigned int id = makeAddress ( key, DicDepth ); //尋找關(guān)鍵碼key所在頁(yè)塊的二進(jìn)制地址
paddr p = Directory [id]; //搜索key所在頁(yè)塊
if ( p ) { //找到, p是指向該頁(yè)塊的指針
PageRemove ( key, p ); //從p所指頁(yè)塊中刪去關(guān)鍵碼key
combine ( id ); //判斷是否合并頁(yè)塊與緊縮目錄
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -