Я программирую назначение в C, и нам нужно перевести логические формулы.
Для одной части нам нужно преобразовать формулу следующим образом: φ <-> ψ → (φ & ψ) | (~ φ & ~ ψ)
Алгоритм данных представляет собой двоичное дерево.
Код, который переводит содержимое дерева, является следующей функцией:
int translate2(FormTree *tree) {
//for1 <-> for2 = (for1 & for2) | (~for1 & ~for2)
if((*tree)->tt == Symbol && (*tree)->t.symbol == 1) {
Token neg, con, dis;
neg.symbol = '~';
con.symbol = '&';
dis.symbol = '|';
FormTree pt1 = newFormTreeNode(Symbol, con, (*tree)->left, (*tree)->right);
FormTree negl = newFormTreeNode(Symbol, neg, (*tree)->left, NULL);
FormTree negr = newFormTreeNode(Symbol, neg, (*tree)->right, NULL);
FormTree pt2 = newFormTreeNode(Symbol, con, negl, negr);
*tree = newFormTreeNode(Symbol, dis, pt1, pt2);
}
return 0;
}
Основная функция просит пользователя вставить формулу, модуль сканирования (который должен быть написан правильно, как дали нам наши лекторы) помещает его в двоичное дерево, и мы должны перевести его и распечатать результат. Затем программа запускается снова, запрашивая у пользователя другую формулу.
Когда я запускаю программу и ввожу, например, a <-> b , программа переводит ее правильно. Однако, когда я вхожу в него во второй раз, программа падает с ошибкой сегментации. Из некоторой отладки я узнал, что эта ошибка возникает при создании pt2 FormTree.
Функция newFormTreeNode:
FormTree newFormTreeNode(TokenType tt, Token t, FormTree tL, FormTree tR) {
FormTree new = malloc(sizeof(FormTreeNode));
assert (new != NULL);
new->tt = tt;
new->t = t;
new->left = tL;
new->right = tR;
return new;
}
Заголовочный файл формы дерева:
typedef struct FormTreeNode *FormTree;
typedef struct FormTreeNode {
TokenType tt;
Token t;
FormTree left;
FormTree right;
} FormTreeNode;
FormTree newFormTreeNode(TokenType tt, Token t, FormTree tL, FormTree tR);
И последнее, но не менее важное: основная функция:
int main(int argc, char *argv[]) {
char *ar;
List tl, tl1;
tl1 = NULL;
printf("enter a formula: ");
ar = readInput();
while (ar[0] != '!') {
tl = tokenList(ar);
printList(tl);
tl1 = tl;
FormTree t = NULL;
if ( treeFormula(&tl1,&t)!=0 && tl1 == NULL ) {
translate2(&t);
printf("translated: ");
printTree(t);
printf("\n");
freeTree(t);
} else {
printf("this is not a formula\n");
if (t != NULL) {
freeTree(t);
}
}
free(ar);
freeTokenList(tl);
printf("\nenter a formula: ");
ar = readInput();
}
free(ar);
return 0;
}