Как создать дубликат узла, вернуть его и освободить оригинал? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть два разных типа структуры (показано ниже).Для структуры LetterFrequencyPair у меня есть связанный список.Я пытаюсь заставить функцию пройти по этому связанному списку, чтобы найти узел с наименьшим значением частоты, создать BinaryTreeNode для этого члена и затем удалить оригинал из связанного списка.

Поэтому я создаюновый узел, «низкий», и назначить его узлу с самой низкой частотой.то есть низкий = темп;Поскольку 'low' - это отдельный узел, а не просто указывающий на temp, разве он не должен хранить значения, которые у temp есть как свои собственные, поэтому, когда 'temp1' (temp) освобождается, у него должны сохраняться те же значения?

Структуры:

struct LetterFrequencyPair
{
    char character;
    int frequency;
    //Creating a pointer to point to the next child in the list
    struct BinaryTreeNode* next;
};

struct BinaryTreeNode
{
    //create a pointer to point to the LetterFrequencyPair
    struct LetterFrequencyPair* letter_frequency_pair;
    //create pointers to the children of the node
    struct BinaryTreeNode* leftChild;
    struct BinaryTreeNode* rightChild;
};

Функция:

struct BinaryTreeNode* ret_lowestF()
{
    int val = 1000;
    struct LetterFrequencyPair* temp;
    struct LetterFrequencyPair* temp1 = NULL;
    struct LetterFrequencyPair* prev = NULL;
    struct LetterFrequencyPair* prev_low = NULL;
    struct LetterFrequencyPair* low = malloc(sizeof(struct LetterFrequencyPair));

    struct BinaryTreeNode* lowest = malloc(sizeof(struct BinaryTreeNode));
    temp = root;
    if (temp == NULL)
    {
        printf("List is empty.\n");
    }
    else
    {
        while (temp != NULL)
        {
            printf("%c\t%d\n", temp->character, temp->frequency);

            if (val > temp->frequency)
            {
                low = temp;         
                val = temp->frequency;
                lowest->letter_frequency_pair = low;
                temp1 = temp;
                prev_low = prev;
            }

            prev = temp;
            temp = temp->next;

        }

        printf("\n\n\low f = %d\n", low->frequency);
        printf("low f = %d\n\n\n", lowest->letter_frequency_pair->frequency);

        prev_low->next = temp1->next;
        temp1->next = NULL;
        free(temp1);


        printf("\n\n\low f = %d\n", low->frequency);
        printf("low f = %d\n\n", lowest->letter_frequency_pair->frequency);


    }

    return lowest;
}

Я ожидаю, что f из 'low' будет 2. Что это до того, как temp1 будет освобожден,Однако после освобождения temp1 значение становится равным -572662307.Что я понимаю, потому что узел, которому он был назначен, больше не существует, но, поскольку 'low' выделяет память, я думал, что он будет содержать эти исходные значения там?

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