C - 具有2个结构的破坏函数

时间:2015-11-25 22:16:47

标签: c struct hashtable free destroy

我正在为我的程序开发一个销毁功能但是我在实现它时遇到了麻烦,因为我的结构让我感到困惑。我有两个结构:1个用于<key, value>对,另一个用于数组,表大小和计数器。这就是我所拥有的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#include "symTable.h"
#define DEFAULT_TABLE_SIZE 61
#define HASH_MULTIPLIER 65599

typedef struct Node
{
    char *key;
    int *value;
    struct Node *next;
} Node_T;

typedef struct SymTable
{
    Node_T **Table;
    int tablesize;
    int counter;
} *SymTable_T;

SymTable_T SymTable_create(void)
{
    SymTable_T S_Table;

    S_Table = malloc(sizeof(SymTable_T *) * DEFAULT_TABLE_SIZE);
    S_Table->Table = (Node_T **) calloc(DEFAULT_TABLE_SIZE, sizeof(Node_T *));

    return S_Table;
}

void symTable_destroy(SymTable_T symTable)
{
    SymTable_T *p, *nextp;
    int i;

    assert(symTable != NULL);

    for (i = 0; i < DEFAULT_TABLE_SIZE; i++)
    {
        for (p = symTable[i]; p != NULL; p = nextp)
        {
            nextp = p->next;
            assert(p->key != NULL);
            free(p->key);
            free(p);
        }
    }
    free(symTable);
    return;
}

但是由于很多原因,这并不起作用。有人可以解释我如何解放两个结构中的所有东西吗?语法让我非常困惑。我需要(我应该)免费试用吗?我应该一次做一个结构,还是当我在阵列中的每个索引时,我应该释放节点?谢谢你们。

1 个答案:

答案 0 :(得分:0)

如果没有看到内存的分配方式,很难准确确定您要释放的内存布局。根据您的评论,您要为symTable(元素初始化NULL)数组分配内存,这些数组指向struct NodeTable)的初始化{{1从NULLkey分配节点列表并为其分配单独的分配。您将起始地址保存到value中的节点列表。

假设TablesymTable的已分配数组,并且在指向类型指针的指针中为类型struct SymTable的每个节点分配该内存对struct Node中的每个元素Node_tstruct Node)命名为Table,并且分配了symTablekey,您可以尝试释放内存与value的每个元素中的每个列表Table相关联,如下所示:

symTable

指针void symTable_destroy (SymTable_T *symTable) { for (i = 0; i < DEFAULT_TABLE_SIZE && symTable[i]; i++) { struct Node *p = *(symTable[i]->Table); /* pointer to node */ while (p != NULL) /* for each allocated node */ { struct Node *victim = p; /* pointer node to delete */ free (victim->key); /* free key for node */ free (victim->value); /* free value for node */ p = p->nextp; /* set p to next node */ free (victim); /* free node memory */ } free (symTable[i]->Table); /* free Table memory */ } free (symTable); /* free allocated array of struct SymTable */ } 上方指向要删除的当前节点,允许victim保存p的地址,并在删除当前节点后保持有效。如果你有问题,请告诉我。如果您有任何问题,请编辑您的问题并发布显示分配的完整代码,我很乐意与您合作。