Come realizzare una struttura ad albero in C
Domanda
Sono un principiante in C. Tuttavia, ho bisogno di un programma che risolva un problema per me. Come posso fare quanto segue?
Ho bisogno di una struttura ad albero. Questo non è un albero tradizionale poiché ogni foglia può avere varie foglie. Pertanto ogni foglia dovrebbe contenere un elenco collegato che contiene i figli della foglia. In ogni collegamento è presente un array char [] [] e alcune variabili int che indicano quanto è buona una foglia. E poi devo fare qualche ricerca prima di tutto per trovare il miglior char [] [] - array e produrlo. Se ho trovato un array adatto, posso fermare la camminata dell'albero.
Soluzione
Io, terrei la lista collegata ordinata al momento dell'inserimento, in modo da poter sempre restituire la prima voce della lista in un nodo dell'albero.
Qualcosa sulla falsariga di
struct listnode {
char** data;
int quality;
struct listnode* next;
};
struct treenode {
struct treenode* left;
struct treenode* right;
int key;
struct listnode* list;
};
struct treenode* tree_insert(struct treenode* root, int key, int quality, char** data)
{
if(root == NULL) {
root = treenode_alloc();
root->key = key;
root->list = list_insert(root->list, quality, data);
return root;
}
if(key < root->key) {
root->left = tree_insert(root->left, key, quality, data);
} else if(key > root->key) {
root->right = tree_insert(root->right, key, quality, data);
} else {
//key == root->key
root->list = list_insert(root->list, quality, data);
}
return root;
}
struct listnode* list_insert(struct listnode* head, int quality, char** data) {
struct listnode* prev = NULL;
struct listnode* ins = NULL;
struct listnode* ptr = NULL;
if(head == NULL) {
head = listnode_alloc();
head->quality = quality;
head->data = data;
return head;
}
ptr = head;
while(quality < ptr->quality) {
if(ptr->next == NULL) { //we reached end of list
ptr->next = list_insert(NULL, quality, data);
return head;
}
prev = ptr;
ptr = ptr->next;
}
//insertion into middle of list (before ptr, because ptr->quality >= quality)
ins = listnode_alloc();
ins->quality = quality;
ins->data = data;
ins->next = ptr;
if(prev) {
prev->next = ins;
}
return head;
}
Altri suggerimenti
arrayindex sono le informazioni sulla posizione, quindi più informazioni rispetto agli elementi reali sono indice, arrayelement è dati, buone parole chiave fordfulkersson , trie datamodel per chimica, b-tree per classico logica, breadthfirstsearch, concordance dbs, heapstructure o vale a dire stack (LIFO)
studia su Data Structures & amp; Algoritmi ... Wikipedia è un buon posto dove guardare.