我正在用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;
}
formtree头文件:
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;
}