Am 13.12.2022 um 20:19 schrieb Andreas Wagner:
> Am 13.12.2022 um 18:28 schrieb Stefan Reuther:
>> Ich würde versuchen, die Verwaltungsdaten in den Blöcken selbst zu
>> speichern. Ein allokierter Block besteht aus Header+Payload, ein
>> freigegebener Block besteht aus Header+Knoten1+Knoten2, wobei Knoten1/2
>> die Knoten in der ersten und zweiten Map sind. Die Basisoperationen sind
>> dann nicht store() und remove(), sondern insertNode() und unlinkNode(),
>> die einfach nur den Knoten ein- oder ausketten und dabei keine neuen
>> Knoten anlegen.
>
> Meinst Du bei "Header+Knoten1+Knoten2", dass jeweils Speicherpositionen
> von Knoten 1 und 2 angegeben werden? Mir stellt sich die Frage, wonach
> der Baum sortiert sein soll, der mit dem Header organisiert ist. Größe
> und Position haben ja jeweils schon eine Map.
>
> Mir ist auch noch keine Idee gekommen, wie man den Knoten auswählt, der
> bei insertNode() wiederverwendet werden soll.
Wenn wir das mal mit RAM statt Datei durchspielen, meinte ich verstanden
zu haben, dass dir sowas vorschwebt:
struct Node {
struct Node* left;
struct Node* right;
int payload;
};
void store(struct Node* root, int payload)
{
struct Node* new_node = malloc(sizeof(struct Node));
new_node->payload = payload;
// hier den Knoten einketten, also z.B.
new_node->left = root->left;
root->left = new_node;
// (AVL-tree-insert bekomm ich aus dem Kopf jetzt nicht hin)
}
// und zum Freigeben von Speicher dann
store(addrlist_root, address);
store(sizelist_root, size);
Ich meine, pack die Metadaten direkt in die Speicherblöcke, so dass
keine separate Allokation notwendig ist:
struct FreeBlock {
// ...hier Headerinformationen, falls du welche brauchst
struct Node in_addrlist;
struct Node in_sizelist;
};
void insertNode(struct Node* root, struct Node* node)
{
// hier nur das Einketten
node->left = root->left;
root->left = node;
}
// und zum Freigeben von Speicher dann
struct FreeBlock* p = (struct FreeBlock*) address;
p->in_addrlist.payload = address;
insertNode(addrlist_root, &p->in_addrlist);
p->in_sizelist.payload = size;
insertNode(sizelist_root, &p->in_sizelist);
VG,
Stefan