'free()' tamam, sıcak sıcak...:)
bool free(char[] slice) {
auto düğüm = binarySearch(slice);
auto öncekiDüğüm = (*düğüm).önceki;
if(düğüm == null) return false;
(*düğüm).boşta_Mı = true; // düğümü boşa çıkar...
if((*öncekiDüğüm).boşta_Mı) {
auto a = (*öncekiDüğüm).konum;
auto b = a;
b += (*düğüm).dilim.length;
b += (*öncekiDüğüm).dilim.length;
(*öncekiDüğüm).dilim = memory[a..b];
(*düğüm).dilim.length = 0;
} /* Eğer önceki bölüm boşsa, bununla birleştir ve
* silinen düğümün dilim uzunluğunu 0 yap...
*/
if((*düğüm).sonraki != null) {
(*öncekiDüğüm).sonraki = (*düğüm).sonraki;
} else {
(*öncekiDüğüm).sonraki = null;
} /* Eğer sonraki bölüm varsa, önceki ile birleştir;
* yoksa tıpkı silinen düğüm gibi null yap...
*/
return true;
}
Lütfen karışık demeyin, yaptığı iş çok çok basit...
Eğer üst komşusu (dizi mantığıyla önceki bölüm) boş ise o zaman yanına gelen komşu ile bunun birleşmesinin (aslında önceki dilimi komşu kadar genişletmenin) hiç mahsuru yok. Zaten bu bölüm işaretçisi ile tamamen silineceğinden artık boş bir dilime çevrilir ve aradaki bağ kopartılır...
Bu işlev çalışıyor; yine de henüz tamamlanmış değil. Çünkü bir de üst komşusu boş olmaması durumunda alt komşusuna bakması gerekiyor. Özetle temel olarak yapacağı iş:
Boş olan komşu ile bütünleşip kendisini bağdan kopartmak. Tabi bütün bunları yapabilmek için, mecburen yapıya 2 eleman daha ekledim:
Alıntı:
>
> struct Düğüm {
> size_t konum;
> char[] dilim;
> Düğüm * önceki, sonraki;
> bool boşta_Mı; // false (boşta değil)
> }
> ```
>
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]