两次运行代码时出现分段错误

时间:2020-03-16 15:25:14

标签: c data-structures tree binary-tree

我正在用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;
}

0 个答案:

没有答案