2014-10-01 3 views
0

У меня есть проблема с struct. Я создал структуру и функцию, чтобы попытаться понять, как работает структура данных дерева. Теперь проблема заключается в том, что когда я пытаюсь скомпилировать следующий код с помощью команды gcc test.c -o test, компилятор всегда возвращает сообщение об ошибке error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token, пожалуйста, дайте мне несколько Помогите.Проблемы с использованием «struct» в plain c

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

typedef struct BiTNode 
{ 
    int data; 
    struct BiTNode *lchild, *rchild; 
}BiTNode, *BiTree; 

void createTree(BiTree &T) 
{ 
    int i; 
    scanf("%d", &i); 
    if(i == -1) 
    { 
     T = NULL; 
    } 
    else 
    { 
     T = (BiTNode *)malloc(sizeof(BiTNode)); 
     T->data = i; 
     createTree(T->lchild); 
     createTree(T->rchild); 
    } 
} 

int main(void) 
{ 
    BiTNode* root = NULL; 
    createTree(root); 
    return 0; 
} 
+0

BTW, 'BiTNode' в' typedef struct BiTNode' является избыточным. – HolyBlackCat

+0

Вы ожидаете, что 'root' будет bon NULL после' createTree (root); 'statement? –

+0

@HolyBlackCat, на самом деле это не избыточно. Если вы вставляете код и компилируете его (после определения объявления как @Ashalynd и @Elliott), то явное 'BiTNode' в' typedef struct BiTNode' предотвращает следующее предупреждение компилятора в двух строках: 'createTree (T-> lchild); createTree (T-> rchild); ':' предупреждение: несовместимые типы указателей, передающие 'struct BiTNode *' в параметр типа «BiTree». По крайней мере, об этом говорит мой компилятор. Попробуйте. –

ответ

5

Правильная подпись:

void createTree(BiTree T) 

и нет:

void createTree(BiTree &T) 

Если факт, вы не можете использовать & в сигнатуры функций C. То, как вы это сделали, будет действительным в C++, поддерживающем ссылки. C этого не делает.

В сигнатуре вы можете использовать указатель (например, createTree(BiTNode* T)), но в вашем случае это не нужно, поскольку вы уже указали, что BiTree является указателем на BiTNode.

Важное обновление: это изменение сделает вашу функцию компилируемой, но для ее работы вам также необходимо убедиться, что вы действительно можете использовать указатель, созданный внутри этой функции. Есть два способа сделать это:

1) Возвращает новый указатель как результат:

BiTree createTree() 
{ 
    BiTree T; 
    int i; 
    scanf("%d", &i); 
    if(i == -1) 
    { 
     T = NULL; 
    } 
    else 
    { 
     T = (BiTNode *)malloc(sizeof(BiTNode)); 
     T->data = i; 
     T->lchild = createTree(); 
     T->rchild = createTree(); 
    } 
    return T; 
} 

int main(void) 
{ 
    BiTNode* root = NULL; 
    root = createTree(); 
    return 0; 
} 

2) Дайте указатель на BiTree в качестве аргумента функции (возможно, это было то, что вы были смысл делать с ссылка).

void createTree(BiTree *T) 
{ 
    int i; 
    scanf("%d", &i); 
    if(i == -1) 
    { 
     *T = NULL; 
    } 
    else 
    { 
     *T = (BiTNode *)malloc(sizeof(BiTNode)); 
     (*T)->data = i; 
     createTree(&(*T)->lchild); 
     createTree(&(*T)->rchild); 
    } 
} 

int main(void) 
{ 
    BiTNode* root = NULL; 
    createTree(&root); 
    return 0; 
} 
+1

Чтобы быть понятным, C имеет указатели. Он не поддерживает ссылки. – StilesCrisis

+0

Да, вот что я хотел сказать. – Ashalynd

+2

@Ashalynd: Должна ли подпись быть 'void createTree (BiTree * T)' ?? –

1

Ваша функция

void createTree(BiTree &T) 

должен быть

void createTree(BiTree *T) 

или

void createTree(BiTree T) 

Вы не можете пройти по ссылке с этим синтаксисом C++ в простом C.

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