我试图设计一个像data—struct一样的二元树,除了每个 node 可以有的子元素没有限制.现在,在每个 node 中,我可以这样声明node struct:

struct node {
  int id;
  int num_children;
  struct node ** child;
};

我的问题是,有没有办法避免使用:

  1. realloc在这种情况下,所以当你释放和重新分配内存时,不要结束大量的碎片?每次我添加一个新的子元素将需要经过这个过程,
  2. 在数组中静态分配有限数量的指针,这意味着(a)在某个点上,我将无法添加到它(b)一些 node 将没有子元素,所以这是一种浪费&

推荐答案

首先分配固定数量的子指针,然后添加一个成员来存储列表的当前容量. 当你go 添加一个子元素到列表,如果列表是一个容量,两倍大小. 这将减少您需要做的重新定位的数量.

所以一个 node 被修改为如下所示:

struct node {
  int id;
  int capacity;
  int num_children;
  struct node ** child;
};

要创建 node ,请执行以下操作:

struct node *newnode = malloc(sizeof *newnode);
newnode->num_children = 0;
newnode->capacity = 10;
newnode->child = malloc(sizeof *newnode->child * newnode->capacity);

要在能力时添加一个子元素:

if (current->capacity == current->num_children) {
    current->capacity *= 2;
    current->child = realloc(current->child, 
         sizeof *current->child * newnode->capacity);
}
current->child[current->num_children++] = new_child;

注意:为了简洁起见,省略了错误判断.

C++相关问答推荐

ARM上的Modulo Sim Aarch 64(NEON)

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

C编译器是否遵循restrict的正式定义?

减法运算结果的平方的最快方法?

为什么C语言允许你使用var =(struct NAME){

为什么我一直收到分段错误?

二进制计算器与gmp

调用mProtection将堆栈上的内存设置为只读,直接导致程序SIGSEGV

如何在C语言中正确打印图形

判断X宏的空性

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

如何使用libgpio(d)为Raspberry Pi编译C程序?

用C++高效解析HTTP请求的方法

将非连续物理内存映射到用户空间

为什么我无法访问C语言中的文件

try 查找带有指针的数组的最小值和最大值

C 语言中 CORDIC 对数的问题

无法在线程内用 C 打印?

如何在 C 中编辑 struct 体中的多个变量

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?