2015-04-27 64 views
1

我的结构定义遇到了很大的麻烦。我尝试了几种不同的方式来定义它们,但似乎无法摆脱错误。取消引用指向不完整类型的指针(基数树)

我可能也有代码的其他问题的财富,但我实际上无法通过运行我认为的代码找到它们而无法修复这些问题。这就是为什么我需要首先解决这个问题。

下面是完整的代码:

#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(); 
} 

这里有错误,我得到:

|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)) ===| 
+1

您是否尝试在结构定义本身中定义'struct radixNode *'而不是'struct node *'字段?在这里,它看起来像你在typedef之前调用'struct node' ... – Aracthor

+0

我认为我确实尝试过,是的。但让我确定。将回报。 – enenra

+0

@Aracthor welp。这是答案。我发誓我一度尝试过,但我必须同时遇到其他问题。谢谢!所有这些错误都消失了,但现在我得到了关于字符串处理的错误:'C [strlen(C)] ='0';'(不兼容的指针类型)你是否也知道这可能是什么?只是为此创建一个新话题? – enenra

回答

1

正如在评论中发现,你的问题是从你的结构定义:

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

您在typedef结束之前调用struct node。只需struct nodestruct radixNode

对于你的第二个问题,这是因为你的变量C是一个指针数组,而不是一个字符数组,并且你试图将一行分配给一个char。如果你想创建一个十字节长的字符数组,只是把它定义是这样的:

char C[10]; 

顺便说一下,如果你想打印的printf同一个字符串,它与%s,不&s

+0

再次感谢!是的,指针是问题,我也修正了这个问题。现在没有错误,但没有适当的输出,所以我会开始一个新的话题,一旦我调查一些。关于打印字符串的事情 - 当我看到这一点时,我笑了起来。这些是非英语键盘布局的危险。我必须按的%的关键是在&(shift + 5或6)旁边,做那些手指体操可能会导致错误的,我继续复制+粘贴... – enenra

+0

There * *没有'struct node',甚至* * typedef之后...只是'struct radixNode'和'node'。建议的解决方法是正确的,尽管 - struct node *不起作用,因为'struct node'从未被定义,'node *'将不起作用,因为'node'没有被定义,直到typedef ,但'struct radixNode *'将正常工作)。 – Dmitri

相关问题