Self-Ссылка C Struct

Можете ли вы иметь структуру в C, которая имеет элементы той же структуры? Моя первая попытка реализовать двоичное дерево поиска в C заключается в следующем:

#include <stdio.h>

struct binary_tree_node {

    int value;
    struct binary_tree_node *left = null;
    struct binary_tree_node *right = null;

};

main() {

    struct binary_tree_node t;
    t.value = 12;

    struct binary_tree_node y;
    y.value = 44;
    t.left = &y;
}

Я не могу понять, что не так с этим кодом, любая помощь будет оценена. Я понимаю, что есть другие вопросы по реализации бинарного поиска в C, но я пытаюсь выяснить это с нуля с помощью моего собственного кода (и, конечно, некоторых рекомендаций). Спасибо!

3 ответа

Решение

Удалить = null в вашей декларации структуры. Вы можете объявить самоссылку, но не можете ее установить.

Это сообщение об ошибке на GCC 4:

test.c:6: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token
test.c: In function ‘main’:
test.c:18: error: ‘struct binary_tree_node’ has no member named ‘left’

Во-первых, вы null является NULL в C. Во-вторых, вы не можете установить значение для элемента в структуре внутри определения структуры.

Итак, это будет выглядеть примерно так:

#include <stdio.h>

struct binary_tree_node {

    int value;
    struct binary_tree_node *left;
    struct binary_tree_node *right;

};

main() {

    struct binary_tree_node t;
    t.left = NULL;
    t.right = NULL;
    t.value = 12;

    struct binary_tree_node y;
    y.left = NULL;
    t.right = NULL;
    y.value = 44;
    t.left = &y;
}

Или, вы можете создать функцию, чтобы сделать левый и правый NULL,

#include <stdio.h>

struct binary_tree_node {

    int value;
    struct binary_tree_node *left;
    struct binary_tree_node *right;

};

void make_null(struct binary_tree_node *x) {
    x->left = NULL;
    x->right = NULL;
}

main() {

    struct binary_tree_node t;
    make_null(&t)
    t.value = 12;

    struct binary_tree_node y;
    make_null(&y);
    y.value = 44;
    t.left = &y;
}

Вы не можете определить значения внутри структуры при определении структуры. Этот фрагмент кода может помочь вашему проекту:

typedef struct binary_tree_node
{
    int value;
    binary_tree left;
    binary_tree right;
} binary_tree_node, *binary_tree;

#define DATA(T) ((T)->value)
#define LEFT(T) ((T)->left)
#define RIGHT(T) ((T)->right)
Другие вопросы по тегам