1、if(isconsnode(B)p=calcons(Q.op,B);if(newleft=1)/*getnode(B)是处理 Q 时新建结点 */delnode(B);if(n=getnode(p)=NULL)makeleaf(p);类型 四元式 DAG 结点 0 型(=,B,A)A B 1 型 (op,B,A)op 2 型(op,B,C,A)(=,B,C,A)(jrop,B,C,A)B C=3 1 2 B C rop 3 1 2 B C op 3 1 2 实用文档 文案大全 n=getnode(p);else if(n=findnode(Q.op,B)=NULL)n=makenode(Q.o
2、p,B);case 2:if(getnode(C)=NULL)makeleaf(C);newright=1;if(isconsnode(B)&isconsnode(C)p=calcons(Q.op,B,C);if(newright=1)/*getnode(C)是处理 Q 时新建结点 */delnode(C);n=getnode(p);else if(n=findnode(Q.op,B,C)=NULL)n=makenode(Q.op,B,C);上述算法中应设置如下的函数:getnode(B):返回 B(可以是标记或附加信息)在当前 DAG 中对应的结点号。makeleaf(B):构造标记为 B
3、的叶子结点。isconsnode(B):检查 B 对应的结点是否为标记为常数的叶子结点。calcons(Q.op,B):计算 op B 的值(即合并已知量)。它的另一种调用形式是 calcons(Q.op,B,C):计算 B op C 的值。delnode(B):删除 B(结点的标记)在当前 DAG 中对应的结点。findnode(Q.op,B):在当前DAG中查找并返回这样的结点:标记为op,后继为getnode(B)(即查找公共子表达式 op B)。它的另一种调用形式是 findnode(Q.op,B,C)(即查找公共子表达式 B op C)。实用文档 文案大全 makenode(Q.op
4、,B,C):构造并返回标记为 op,左右后继分别为 getnode(B)、getnode(C)的内部结点。insertidset(n,A):若 getnode(A)=NULL,则把 A 附加到结点 n;否则,若 A 在 getnode(A)的附加标识符集中,且 getnode(A)无前驱或虽有前驱但 getnode(A)附加标识符集中符号数大于 1,则把 A 从 getnode(A)的附加标识符集中删除(即删除无用赋值)。请实现上述基本块的DAG构造算法,并添加从所得DAG按原来生成DAG各个结点的顺序,重建四元式序列的功能。(3)测试用例 用下面的基本块作为输入:(1)T1=A*B(2)T2
5、=3/2(3)T3=T1 T2(4)X=T3 (5)C=5(6)T4=A*B(7)C=2(8)T5=18+C(9)T6=T4*T5(10)Y=T6 基本块的 DAG 如下:按生成 DAG 各个结点的顺序,重建四元式序列如下:(1)T1=A*B(2)T2=1.5(3)T3=T1 1.5(4)X=T3 (5)T4=T1(6)C=2(7)T5=20(8)T6=T1*20(9)Y=T6 *-T1,T4 T3,X T6,Y A B 1.5 20 5 2 T2 T5 C 实用文档 文案大全 Code.txt 文件内容 T1=A*B T2=3/2 T3=T1 T2 X=T3 C=5 T4=A*B C=2 T
6、5=18+C T6=T4*T5 Y=T6#include#include#include#include /*function ans data statement*/#define MAXN 5 /*符号或变量最大长度*/*结点类型*/typedef struct node int iscons;/*0-无 1-整型 2-浮点*/int val_int;/*整型值*/double val_float;/*浮点值*/int idnum;/*变量的个数*/char idMAXNMAXN;/*变量 0valnum-1*/char opMAXN;/*结点操作*/int left,right;/*左右
7、节点*/DAGNODE;#define MAXNN 20 /*DAG 最大结点数目*/实用文档 文案大全/*DAG*/typedef struct mnode int num;/*结点个数*/DAGNODE nodeMAXNN;/*结点内容 1NUM*/DAG;/*四元式 Quaternion*/typedef struct snode int type;/*类型 0 1 2*/char opMAXN;/*操作*/char op1MAXN;/*操作数 1*/char op2MAXN;/*操作数 2*/char ansMAXN;/*结果*/QUA;void init();/*初始化函数*/boo
8、l getqua(QUA*qua);/*获取一个四元式*/int isnums(char*val);/*检测字符串是否是数字串 0 标识符 1 整型数串 2 浮点数串*/void makeleaf(DAGNODE*n,char val);/*构造叶子结点*/void makenode(DAGNODE*n,char op,int left,int right);/*构造中间结点*/int getnode(DAG dag,char var);/*获取 var所在结点号*/int find1node(DAG dag,char op1,char op);/*查找已有的表达式 1*/int find2n
9、ode(DAG dag,char op1,char op2,char op);/*查找已知表达式 2*/char*isconsnode(DAG dag,char id);/*是否是常数结点的 id*/void delnode(DAG*dag,int num);/*删除结点 num*/void delid(DAG*dag,int num);/*删除某节点的 Id*/void copynode(DAGNODE*to,DAGNODE from);/*复制结点值*/void insertvar(DAG*dag,int noden,char var);/*将值 var 附加在 noden 结点*/int
10、 insertnode(DAG*dag,DAGNODE dagn);/*将结点插入 DAG*/char*calcons1(char op,char op1);/*计算 op op1 的运算值*/char*calcons2(char op,char op1,char op2);/*op1 op op2*/void makeDAG();/*构造 DAG*/void dispDAG(DAG dag);/*输出 DAG*/char*getv(DAG dag,int dagn);FILE*fp;/*文件指针,指向代码文件*/void dispcode();int main()init();实用文档 文案
11、大全 dispcode();init();makeDAG();return 0;void dispcode()static int i=1;QUA q;while(getqua(&q)if(q.type=0)printf(%d)%s%s%sn,i+,q.ans,q.op,q.op1);else if(q.type=1)printf(%d)%s=%s%sn,i+,q.ans,q.op,q.op1);else printf(%d)%s=%s%s%sn,i+,q.ans,q.op1,q.op,q.op2);/*初始化函数*/void init()if(fp=fopen(code.txt,r)=NUL
12、L)printf(the code file is not existed.);exit(0);/*获取一个四元式*/bool getqua(QUA*qua)int t;if(feof(fp)fclose(fp);return false;fscanf(fp,%d,&t);fscanf(fp,%s,qua-ans);fscanf(fp,%s,qua-op);fscanf(fp,%s,qua-op1);if(fgetc(fp)=n|feof(fp)strcpy(qua-op2,);if(!strcmp(qua-op,=)qua-type=0;return true;实用文档 文案大全 fscan
13、f(fp,%s,qua-op);if(fgetc(fp)=n|feof(fp)strcpy(qua-op2,qua-op);strcpy(qua-op,qua-op1);strcpy(qua-op1,qua-op2);strcpy(qua-op2,);qua-type=1;fscanf(fp,%s,qua-op2);qua-type=2;int isnums(char*val)int i,flag;for(i=0;vali;i+)if(!isdigit(vali)if(vali=.)/*浮点*/flag=2;flag=0;else flag=1;/*整型*/return flag;/*构造叶子
14、结点*/void makeleaf(DAGNODE*n,char val)switch(isnums(val)case 0:n-iscons=0;n-val_float=0;n-val_int=0;n-idnum=1;strcpy(n-id0,val);实用文档 文案大全 n-idnum=0;n-iscons=1;n-val_int=atoi(val);n-idnum=0;n-iscons=2;n-val_float=atof(val);strcpy(n-op,);n-left=n-right=0;/*构造中间结点*/void makenode(DAGNODE*n,char op,int left,int right)n-idnum=0;strcpy(n-op,op);n-left=left;n-right=ri
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1