Nested linked lists in C -
i'm trying implement nested linked list in c, used hierarchical menu. however, gcc (v4.9.3-1) complaining nested structures, , have no idea how fix this. here minimum (non)working example.
is nesting possible in c?
main.c
#include "menu.h" int main(void) { init_menu(); return 0; }
menu.c
#include "menu.h" menuitem_t lvl_0_mainmenu = { .size = 0, }; menuitem_t lvl_1_measurements = { .size = 0, }; void init_menu(void) { menu_add_child(&lvl_0_mainmenu, &lvl_1_measurements); } void menu_add_child(menuitem_t *parent, menuitem_t *child) { parent->children[parent->size] = child; child->parent = parent; parent->size++; }
menu.h
typedef struct { unsigned char size; menuitem_t children[10]; menuitem_t *parent; } menuitem_t; extern menuitem_t lvl_0_mainmenu; extern menuitem_t lvl_1_measurements; void init_menu(void); void menu_add_child(menuitem_t *parent, menuitem_t *child);
based on answers @bolov , @sps (once again, both of them), here minimum working example:
main.c
#include "menu.h" int main(void) { init_menu(); return 0; }
menu.c
#include "menu.h" menuitem_t lvl_0_mainmenu = { .size = 0, }; menuitem_t lvl_1_measurements = { .size = 0, }; void init_menu(void) { menu_add_child(&lvl_0_mainmenu, &lvl_1_measurements); } void menu_add_child(menuitem_t *parent, menuitem_t *child) { parent->children[parent->size] = child; child->parent = parent; parent->size++; }
menu.h
struct menuitem_t { unsigned char size; struct menuitem_t *children[10]; struct menuitem_t *parent; }; typedef struct menuitem_t menuitem_t; extern menuitem_t lvl_0_mainmenu; extern menuitem_t lvl_1_measurements; void init_menu(void); void menu_add_child(menuitem_t *parent, menuitem_t *child);
the difference between corrected program , original (non)working program, children array defined array of pointers variables of type menuitem_t
instead of array of variables of same type. other difference nested list (inside structure) should contain keyword struct
@bolov explained.
you need use struct
type used inside itself, if typedef later on.
e.g. won't work:
struct x_ { x* next; }; typedef struct x_ x;
but will
struct x_ { struct x_* next; };
as side note, don't form:
typedef struct { } x;
i use:
struct x { }; typedef struct x x;
but maybe me being more fond of c++
.
if want use form, it's same: need add struct
, works:
typedef struct { struct x2* next; } x2;
regarding:
struct x { struct x arr[10]; };
you can't have that! array in our way understand why. let's simplify:
struct x { int a; struct x var; };
this can't be. size x
be? sizeof(x) = sizeof(int) + sizeof(x) + padding
. see problem? can have pointer x
, not object x
inside x
.
returning array. need dynamic arrays:
struct x { struct x* arr; int arr_size; };
it gets more complicated need manage memory (malloc
/free
fun), can't avoid it.
Comments
Post a Comment