2015-04-27 95 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

相關問題