/* * data_delete - アイテムの削除 */ BOOL data_delete(DATA_INFO **root, DATA_INFO *del_di, const BOOL free_item) { DATA_INFO *di; if (root == NULL || *root == NULL || del_di == NULL) { return FALSE; } if (*root == del_di) { *root = del_di->next; del_di->next = NULL; if (free_item == TRUE) { data_free(del_di); } return TRUE; } for (di = *root; di != NULL; di = di->next) { if (di->next == del_di) { // 削除 di->next = del_di->next; del_di->next = NULL; if (free_item == TRUE) { data_free(del_di); } return TRUE; } if (di->child != NULL && data_delete(&di->child, del_di, free_item) == TRUE) { return TRUE; } } return FALSE; }
void test_data() { struct Data* d = data_generate(10); data_set(0, 1, d); data_set(2, 1, d); data_set(4, 1, d); data_set(9,1,d); data_show(d); data_delete(4,d); data_show(d); data_set(3,1,d); data_show(d); data_free(d); }
/* * data_adjust - アイテムの整理 */ void data_adjust(DATA_INFO **root) { DATA_INFO *di = *root; DATA_INFO *wk_di; while (di != NULL) { if (di->type == TYPE_ITEM && di->child == NULL) { wk_di = di->next; // 削除 data_delete(root, di, TRUE); di = wk_di; } else { if (di->type == TYPE_FOLDER) { data_adjust(&di->child); } di = di->next; } } }