#c #arrays #tree #binary-tree #abstract-data-type
#c #массивы #дерево #двоичное дерево #абстрактный тип данных
Вопрос:
в HW меня просят реализовать двоичное дерево с использованием указателей, а затем использовать реализацию массива bt. Проблема в том, что, хотя я знаю, как сделать и то, и другое, они должны использовать один и тот же основной файл . Под этим я подразумеваю, что тот же самый код, который я использовал для реализации указателей, должен использоваться реализацией массива. Это означает, что когда я ссылаюсь на insertTree (дерево, дерево-> слева), это должно работать и для массива.я полностью потерян. Мой узел:
Typedef struct BTNode{
itemtype data;
Struct BTNode * left;
Struct BTNode * left;
}BTNode;
Ответ №1:
В «стандартном» случае новая ячейка поддерживается результатом malloc, и когда она становится бесполезной, вы освобождаете ее
Использование массива может заключаться в том, чтобы иметь массив BTNode, и вместо того, чтобы вводить новую ячейку, вы получаете бесплатную запись в массиве. Поскольку ячейки могут быть получены / освобождены априори в любом порядке, вы также можете связать свободные ячейки, поэтому, когда ячейка освобождается, она повторно вводится в список свободных, связанный с массивом
Таким образом, только вызовы malloc / free должны быть изменены, чтобы иметь возможность использовать массив или нет
Примечание :
Typedef struct BTNode{
itemtype data;
Struct BTNode * left;
Struct BTNode * left;
}BTNode;
вы имеете в виду
typedef struct BTNode{
itemtype data;
struct BTNode * left;
struct BTNode * right;
} BTNode;
Комментарии:
1. Итак, если я правильно понимаю, я просто использую Malloc для массива BTNodes . Каковы цели этого абстрактного типа? Я имею в виду, что это похоже на использование обычного абстрактного типа. В любом случае, спасибо за ответ, я обновлю сообщение для дальнейших вопросов.
2. нелегко использовать абстрактный тип в C, вероятно, лучший способ — использовать функции
BTNode * allocBTnode()
иvoid freeBTNodes(BTNode *)
и предложить 2 их определения, одно с использованием malloc / free, а второе — array, выбор между 2 определениями может быть выполнен с помощью препроцессора (#ifdef USEARRAY .. #else ... #endif
), чтобы выбрать то, которое будет использоваться во время компиляции