Я пытаюсь пересечь двоичное дерево в C. Мое дерево содержит узел AST (абстрактный узел синтаксического дерева для компилятора). ASTnode резервирует nodetype, который задает тип данного узла (например, INT OP или CHAR и TYPE, нам не нужно относиться к другим типам), остальные члены - указатели слева и справа и, наконец, мы сохраняем.Прохождение двоичного дерева в C
Вот код траверса:
void traverse(struct ASTNode *root)
{
if(root->nodeType == OP){
printf("OP \n");
if(root->left != NULL){
printf("left - ");
traverse(root->left);
}
if(root->right != NULL){
printf("right - ");
traverse(root->right);
}
return;
}
else{
if(root != NULL && root->nodeType == INT)
{
printf("INT - ");
printf("INT: %d\n",root->value);
}
if(root != NULL && root->nodeType == CHAR)
{
printf("CHAR - ");
printf("CHAR: %c\n",root->chValue);
}
return;
}
}
Кроме того, мы не можем назначить левое или правое значение ПОСТОЯННЫХ узлов, так как в AST, постоянные значения не содержат какие-либо дополнительных значений.
Обновлено:
Проблема заключается в моей основной вызов:
int main()
{
struct ASTNode *node1 = makeCharNode('a');
struct ASTNode *node2 = makeCharNode('b');
struct ASTNode *node10 = makeCharNode('c');
struct ASTNode *node3 = makeINTNode(19);
struct decl *d = (struct decl*) malloc(sizeof(struct decl*));
struct decl *d2 = (struct decl*) malloc(sizeof(struct decl*));
struct ASTNode *node4 = makeNode(3,d,node3,node2);
struct ASTNode *node5 = makeNode(3,d2,node4,node1); !!
traverse(node4);
}
Если удалить node5 (который отмечен !!) код работает очень хорошо в противном случае он дает ошибку сегментации.
Функции, которые работают на makenode
:
struct ASTNode *makeNode(int opType,struct decl *resultType,struct ASTNode *left,struct ASTNode *right)
{
struct ASTNode *node= (struct ASTNode *) malloc(sizeof(struct ASTNode *));
node->nodeType = opType;
node->resultType = resultType;
node->left = left;
node->right = right;
return node;
}
struct ASTNode *makeINTNode(int value)
{
struct ASTNode *intnode= (struct ASTNode *) malloc(sizeof(struct ASTNode *));
intnode->nodeType = INT;
intnode->value = value;
return intnode;
}
struct ASTNode *makeCharNode(char chValue)
{
struct ASTNode *charNode = (struct ASTNode *) malloc(sizeof(struct ASTNode *));
charNode->nodeType = CHAR;
charNode->chValue = chValue;
return charNode;
}
В какой строке это происходит? Скомпилируйте с опцией '-g' и запустите' gdb' с файлом corefile: 'gdb prog core', запустите команду' bt' - он напечатает обратную линию и сообщит вам точное место вашей программы segfaults. – qrdl
Стартовая программа:/home/nazmi/Рабочий стол/таблица символов/xx/new/ast OP left - INT - INT: 19 Программный сигнал SIGSEGV, ошибка сегментации. 0x08048891 в traverse99 (root = 0x11) at ast.c: 154 154 if (root-> nodeType == OP) – iva123
Так что это не удается по строке 154, разыменовывая 'root'. Вы должны убедиться, что 'root' не' NULL' перед разыменованием – qrdl