Zdrojový kód: INCLUDE\UTIL\TREE.INC, UTIL\TREE.ASM
TREE - Stromový seznam
Stromový seznam slouží k hierarchické organizaci položek do stromové struktury.
Položka stromové struktury používá 4 ukazatele:
Parent - ukazatel na rodiče položky. Je-li ukazatel NULL, nemá položka žádného rodiče a jedná se o kořen stromu.
Prev a Next - ukazatelé na předcházejícího a následujícího potomka majícího stejného rodiče, tedy ukazatelé na sourozence. Položky (sourozenci) jsou zacyklené do kruhu. Jedná-li se pouze o jednoho potomka, ukazují ukazatele Prev a Next samy na sebe.
Child - ukazatel na jednoho z potomků. Je-li ukazatel NULL, nemá položka žádného potomka.
|
Struktura TREE popisuje položku stromového seznamu. Zřetězení potomků stejného rodiče (tedy zřetězení sourozenců) je zajištěno dvojitě spojeným seznamem LIST. Ukazatel TREE_Child je adresa jednoho z potomků (NULL=není žádný potomek). Ukazatel TREE_Parent je adresa rodiče položky (NULL=není rodič, jedná se o kořen stromu).
Makro TREEHEAD je inicializovaná položka stromu - seznam sousedních potomků je prázdný (tj. ukazatele ukazují samy na sebe), ukazatel na potomka je NULL (položka nemá žádného potomka) a ukazatel na rodiče je také NULL (položka nemá žádného rodiče, je kořenem stromu).
|
Makro TREEINIT inicializuje položku stromu. Jejím parametrem je adresa nebo registr ukazující na položku stromu. Makro inicializuje seznam sourozenců na prázdný (tj. aby ukazatele ukazovaly samy na sebe) a vynuluje ukazatel na potomka a rodiče.
Makro TREEADD připojí položku stromu jako potomka k jiné položce stromu. Prvním parametrem je registr s ukazatelem na cílovou položku, ke které se má nová položka připojit. Druhým parametrem je registr s ukazatelem na nově přidávanou položku. Nová položka musí mít inicializovaný ukazatel TREE_Child - musí obsahovat buď seznam potomků nebo NULL. Ostatní ukazatele se ignorují. Třetím a čtvrtým parametrem jsou pomocné registry, které makro použije. Do registru %3 se nejdříve připraví ukazatel na potomka cílové položky. Pokud nějaký potomek existuje (tj. ukazatel je nenulový), připojí se k němu nová položka do řetězce sourozenců pomocí makra LISTADD. Následně se nastaví nová položka jako nový potomek cílové položky a ukazatel na cílovou položku se nastaví jako rodič nově přidávané položky.
Makro TREEDEL odpojí položku ze stromu. Pvním parametrem makra je registr s ukazatelem na rušenou položku. Položka nesmí být kořenem stromu (tj. ukazatel na rodiče nesmí být NULL). Druhý a třetí parametr jsou pomocné registry. Makro nejdříve odpojí rušenou položku z řetězce sourozenců (pomocí makra LISTDEL). Nastaví nového potomka rodiče a to buď na následujícího sourozence rušené položky nebo na NULL (pokud nenásleduje další sourozenec).
|
Funkce TreeInit inicializuje položku stromu. Na vstupu funkce obsahuje registr EBX ukazatel na položku stromu. Funkce inicializuje seznam sourozenců na prázdný (tj. aby ukazatele ukazovaly samy na sebe) a vynuluje ukazatel na potomka a rodiče.
Funkce TreeAdd připojí položku stromu jako potomka k jiné položce stromu. Na vstupu funkce obsahuje registr EAX ukazatel na nově přidávanou položku, registr EBX obsahuje ukazatel na cílovou položku, ke které se má nová položka připojit. Nová položka musí mít inicializovaný ukazatel TREE_Child - musí obsahovat buď seznam potomků nebo NULL. Ostatní ukazatele se ignorují.
Funkce TreeDel odpojí položku ze stromu. Na vstupu funkce obsahuje registr EAX ukazatel na rušenou položku. Položka nesmí být kořenem stromu (tj. ukazatel na rodiče nesmí být NULL).