cstructdereferenceradix-tree

dereferencing pointer to incomplete type (radix tree)


I'm having major trouble with my struct definition. I have tried a couple different ways of defining them but can't seem to get rid of the error.

I probably also have a wealth of other problems with the code but I can't actually fix those without finding them by running the code I think. Which is why I need to solve this first.

Here is the complete code:

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

typedef int bool;
enum { false, true };

typedef struct radixNode {
    bool active;
    struct node * pnt;
    struct node * l;
    struct node * r;
} node;

void insert(node *root, char * B) {

    // digit is zero so we go left
    if (B[0] == 0) {

        // left child doesn't exist, create it
        if (root->l == NULL) {

            root->l = malloc(sizeof(node));

            /* if the next index in the string does NOT contain a 1 or 0,
            the current index is the last index and the node is activated */
            if (B[1] == 1 || B[1] == 0)
                root->l->active = false;
            else
                root->l->active = true;

            root->l->pnt = root;
            root->l->l = NULL;
            root->l->r = NULL;
            insert(root->l,B++); // B++ removes the first digit of the string
        }

        // left child exists, traverse
        else {
            insert(root->l,B++);
        }
    }

    // digit is one, go right
    else {

        // right child doesn't exist, create it
        if (root->r == NULL) {

            root->r = malloc(sizeof(node));

            /* if the next index in the string does NOT contain a 1 or 0,
            the current index is the last index and the node is activated */
            if (B[1] == 1 || B[1] == 0)
                root->r->active = false;
            else
                root->r->active = true;

            root->r->pnt = root;
            root->r->l = NULL;
            root->r->r = NULL;
            insert(root->r,B++);
        }

        // left child exists, traverse
        else {
            insert(root->r,B++);
        }
    }
}

node * printTreeMin(node *root) {

    char * C[10];

    /* goes left until it can't, appends 0 to string
    till it can't. if node is active, print the string */
    while (root->l != NULL) {

        C[strlen(C)] = '0';

        if (root->active)
            printf("&s\n",C);

        root = root->l;
    }

    return root;
}

// prints the next smallest binary number in the tree, returns the node it printed
node * printNextSmallest(node * root) {

    char * C[10];

    // if right child exists, go there and find lowest node (after if same deal as printTreeMin() )
    if (root->r != NULL) {

        C[strlen(C)] = '1';
        if (root->active)
            printf("&s\n",C);

        root = root->r;

        while (root->l != NULL) {

            C[strlen(C)] = '0';
            if (root->active)
                printf("&s\n",C);

            root = root->l;
        }

        return root;
    }

    node * temp = root->pnt;

    while (temp != NULL && root == temp->r) {

        root = temp;
        temp = temp->pnt;
    }

    return temp;
}

void printRadixTree(node *root) {

    root = printTreeMin(root);

    while (printNextSmallest(root) != NULL)
        root = printNextSmallest(root);
}

void test() {

    node * tree = malloc(sizeof(node));
    tree->l = NULL;
    tree->r = NULL;

    // a)
    insert(tree,"101000");
    insert(tree,"10100");
    insert(tree,"10110");
    insert(tree,"101");
    insert(tree,"1111");

    // b)
    printRadixTree(tree);

}

int main() {
    test();
}

Here are the errors I get:

|In function 'insert':|
30|error: dereferencing pointer to incomplete type|
32|error: dereferencing pointer to incomplete type|
34|error: dereferencing pointer to incomplete type|
35|error: dereferencing pointer to incomplete type|
36|error: dereferencing pointer to incomplete type|
37|warning: passing argument 1 of 'insert' from incompatible pointer type [enabled by default]|
17|note: expected 'struct node *' but argument is of type 'struct node *'|
42|warning: passing argument 1 of 'insert' from incompatible pointer type [enabled by default]|
17|note: expected 'struct node *' but argument is of type 'struct node *'|
57|error: dereferencing pointer to incomplete type|
59|error: dereferencing pointer to incomplete type|
61|error: dereferencing pointer to incomplete type|
62|error: dereferencing pointer to incomplete type|
63|error: dereferencing pointer to incomplete type|
64|warning: passing argument 1 of 'insert' from incompatible pointer type [enabled by default]|
17|note: expected 'struct node *' but argument is of type 'struct node *'|
69|warning: passing argument 1 of 'insert' from incompatible pointer type [enabled by default]|
17|note: expected 'struct node *' but argument is of type 'struct node *'|

|In function 'printTreeMin':|
82|warning: passing argument 1 of 'strlen' from incompatible pointer type [enabled by default]|
49|note: expected 'const char *' but argument is of type 'char **'|
82|warning: assignment makes pointer from integer without a cast [enabled by default]|
87|warning: assignment from incompatible pointer type [enabled by default]|

|In function 'printNextSmallest':|
101|warning: passing argument 1 of 'strlen' from incompatible pointer type [enabled by default]|
49|note: expected 'const char *' but argument is of type 'char **'|
101|warning: assignment makes pointer from integer without a cast [enabled by default]|
105|warning: assignment from incompatible pointer type [enabled by default]|
109|warning: passing argument 1 of 'strlen' from incompatible pointer type [enabled by default]|
49|note: expected 'const char *' but argument is of type 'char **'|
109|warning: assignment makes pointer from integer without a cast [enabled by default]|
113|warning: assignment from incompatible pointer type [enabled by default]|
119|warning: initialization from incompatible pointer type [enabled by default]|
121|warning: comparison of distinct pointer types lacks a cast [enabled by default]|
124|warning: assignment from incompatible pointer type [enabled by default]|

||=== Build failed: 10 error(s), 16 warning(s) (0 minute(s), 0 second(s)) ===|

Solution

  • As found in commentaries, your problem was from your structure definition:

    typedef struct radixNode {
        bool active;
        struct node * pnt;
        struct node * l;
        struct node * r;
    } node;
    

    You are calling struct node before the typedef end. Just remplace struct node by struct radixNode.

    For your second problem, it's because your variable C is an array of pointers, not an array of chars, and you are trying to assign a row as a char. If you want to create a ten-bytes long char array, just define it like this:

    char C[10];
    

    And by the way, if you want to print a string with printf, it's with %s, not &s.