2015-04-27 7 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 *' в самом определении структуры? Здесь, похоже, вы вызываете 'struct node' до typedef ... – Aracthor

+0

Я думаю, что я действительно пытался это сделать, да. Позвольте мне убедиться, хотя. Отчитается. – enenra

+0

@Aractor welp. Это был ответ. Клянусь, я попытался это в какой-то момент, но у меня, должно быть, были другие проблемы одновременно. Благодаря! Все эти ошибки исчезли, но теперь я получаю ошибки относительно обработки строк: 'C [strlen (C)] = '0';' (несовместимые типы указателей) есть ли у вас идея, что это может быть, или мне нужно просто создайте новую тему для этого? – enenra

ответ

1

Как найти в комментариях, ваша проблема была из вашего определения структуры:

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

Вы вызываете struct node перед концом typedef. Просто замените struct node на struct radixNode.

Для вашей второй проблемы это связано с тем, что ваша переменная C представляет собой массив указателей, а не массив символов, и вы пытаетесь присвоить строку как символ. Если вы хотите создать десять-байт долго обугленного массив, просто определить его как это:

char C[10]; 

И, кстати, если вы хотите напечатать строку с Printf, это с %s, не &s.

+0

Еще раз спасибо! И да, указатель был проблемой, я тоже это исправил. Теперь нет ошибок, но нет надлежащего вывода, поэтому я буду начинать новую тему, как только я исследую еще кое-что. Что касается струнной струны - я усмехнулся, когда увидел это. Это опасности неанглийских раскладок клавиатуры. Ключ, который я должен нажимать для%, находится рядом с тем, который был для & (сдвиг + 5 или 6), и, выполняя эту физкультуру, возможно, произошел неправильный, который я начал копировать + вставить ... – enenra

+0

Там * * no 'struct node', даже * после * typedef ... просто' struct radixNode' и 'node'. Рекомендуемое исправление является правильным, хотя - 'struct node *' не будет работать, потому что 'struct node' * никогда * не определен, а' node * 'не будет работать, потому что' node' не определен до тех пор, пока typedef , но 'struct radixNode *' будет работать нормально). – Dmitri

Смежные вопросы