Как сохранить объект внутри другого объекта без изменения оригинала с помощью структуры? - PullRequest
0 голосов
/ 01 апреля 2020

Контекстуализация:

Когда структура данных выполняет запросы, она выполняет преобразования вращения в дереве. Таким образом, исходное дерево, которое было загружено, модифицируется. Поэтому, если я назначу другую встречу немедленно, консультация будет другой. Мне нужно найти способ сохранить исходную структуру данных в памяти, чтобы структура данных запроса была ее копией. Помните, что рассматриваемая структура данных является объектом. То есть, как мне скопировать объект без изменения оригинала?

Если я попробую приведенный ниже код, он не будет работать, потому что я заставляю объект получать другой объект того же класса, поэтому два изменено:

SPSTTree Taux;
SPSTTree T = operand1->SpstManager;
Taux = T;
Filter_spst(_operand2.dbl, op, Taux);

Объект принадлежит структуре

typedef struct SPSTNode *PositionSPST;
typedef struct SPSTNode *SPSTTree;
struct SPSTNode{
    ElementType Element;
    int64_t offset;
    SPSTTree lchild;
    SPSTTree rchild;

    int qtd_element = 1;

};

Итак, в заключение, я хочу передать структуру данных в запрос. Понимать эту структуру данных как индексацию данных дерево. Это дерево суммируется с объектом класса. Однако когда я выполняю запрос, данные структуры изменяются. Поэтому мне нужно сохранить исходный объект, который является загруженным деревом, для немедленного выполнения других запросов без необходимости повторной загрузки дерева.

В основном: как сохранить объект внутри другого объекта без изменения оригинала с помощью struct

1 Ответ

1 голос
/ 01 апреля 2020

Я не уверен, что хорошо понимаю ваш вопрос, но, полагаю, у вас есть SPST-дерево, и вы хотите иметь возможность сделать его копию, чтобы вы могли изменить ее, не изменяя оригинал. Для этого вам необходимо реализовать функцию рекурсивного копирования для структуры. В этой функции:

1) Скопируйте свойства структуры, которые не являются указателями, в вашем случае Element, offset и qtd_element.

2) Для всех указателей вам необходимо рекурсивно скопировать остроконечные структуры. В вашем случае у вас есть два указателя, lchild и rchild, которые указывают на соответствующие поддеревья. Так что вам нужно проверить для каждого из них, являются ли они NULL или нет. Если они не равны NULL, вызовите вашу функцию копирования в указанном дереве (функция вызывает себя рекурсивно) и свяжите результирующее (скопированное) поддерево с копией, которую вы делаете.

Пример функции (примите ее как pseudocode-i sh пример):

struct SPSTNode{
    ElementType Element;
    int64_t offset;
    SPSTTree lchild;
    SPSTTree rchild;

    int qtd_element = 1;

};
SPSTTree copyTree(SPSTTree original) {
    // Allocate here your copy using the same way you do in your code, as it is not specified in the question I will use malloc as an example
     SPSTTree copy = (SPSTTree) malloc(sizeof(SPSTNode));

     // Copy non-pointer values
     copy.Element = original.Element;
     copy.offset = original.offset;
     copy.qtd_element = original.qtd_element;

     // Recursively copy subtrees
     if (original.lchild) {
           copy.lchild = copyTree(original.lchild);
     } else {
            copy.lchild = 0;
     }
     if(original.rchild) {
           copy.rchild = copyTree(original.rchild);
     } else {
           copy.rchild = 0;
     }
}

Так как мы используем mallo c в этом примере псевдокод-i sh (я с телефона, поэтому я не пробовал, однако это должно быть довольно точным) не забудьте освободить память позже!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...