我的結構定義遇到了很大的麻煩。我嘗試了幾種不同的方式來定義它們,但似乎無法擺脫錯誤。取消引用指向不完整類型的指針(基數樹)
我可能也有代碼的其他問題的財富,但我實際上無法通過運行我認爲的代碼找到它們而無法修復這些問題。這就是爲什麼我需要首先解決這個問題。
下面是完整的代碼:
#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)) ===|
您是否嘗試在結構定義本身中定義'struct radixNode *'而不是'struct node *'字段?在這裏,它看起來像你在typedef之前調用'struct node' ... – Aracthor
我認爲我確實嘗試過,是的。但讓我確定。將回報。 – enenra
@Aracthor welp。這是答案。我發誓我一度嘗試過,但我必須同時遇到其他問題。謝謝!所有這些錯誤都消失了,但現在我得到了關於字符串處理的錯誤:'C [strlen(C)] ='0';'(不兼容的指針類型)你是否也知道這可能是什麼?只是爲此創建一個新話題? – enenra