Проблема выгрузки cs50 pset5 - утечка памяти - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь решить cs50 pset5. Я использую метод попытки.

Я могу успешно вставить слово в попытки. Тем не менее, когда я выгружаю память, это не удается. Я так застрял на проблеме разгрузки на несколько дней.

Когда я пробовал функцию выгрузки, он заявил, что сообщение об ошибке: двойное освобождение или повреждение (! Prev): 0x000000000205d010 ***

Возможно, это из-за моей функции выгрузки, но я вычеркнул логику. Мне кажется, это нормально. У кого-нибудь есть идеи, где внести поправки?

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

#define LENGTH 45
#define SIZE_OF_CHILD 27

typedef struct Node {
    bool is_word;
    struct Node* child[SIZE_OF_CHILD];
} Node;


Node* root;
Node* temp;

Node* create_node(Node* node);
void test();
int cal_key(char c);
Node* insert(const char* word);
void unload(Node* node);

int main() {
    root = malloc(sizeof(Node));
    if (root == NULL) {
        exit(0);
    }

    root = create_node(root);
    temp = malloc(sizeof(Node));
        if (temp == NULL) {
        exit(0);
    }

    test();

}

// **************** function to create a node *******************
Node* create_node(Node* node) {
    node->is_word = false;
    for (int i = 0; i < SIZE_OF_CHILD; i++) {
        node->child[i] = NULL;
    }
    return node; 
}

//************* calculate the key value ************
// Assume that the input is in lower case
int cal_key(char c) {
    if (isalpha(c)) {
        if (islower(c)) {
             return c - 'a';
        }
        else {
            return c + 32 -'a';
        }
    }
    else {
        return SIZE_OF_CHILD - 1;
    }
}

//*************** function to insert an item in the the node ***********
Node* insert(const char* word) {
    int str_len = strlen(word);
    temp = root;
    int key;
    for (int i = 0; i < str_len; i++) {
        key = cal_key(word[i]);
        if (temp->child[key] == NULL) {
            Node* node = malloc(sizeof(Node));  
            if (node == NULL) {
                fprintf(stderr, "Error in creating node\n");
                exit(0);
            }
            node = create_node(node);
            temp->child[key] = node;
        }

        temp = temp->child[key];
    }
    temp->is_word = true;
    return root;
}


//***************** function to unload a function ********************
void unload(Node* node) {
    // This is to find the last node
    for (int i = 0; i < SIZE_OF_CHILD; i++) {
        if (node->child[i] != NULL) {
            unload(node->child[i]);
        }
    free(node);
    }
}

void test() {
    root = insert("Peter");
    unload(root);
    }
...