开发中虚函数应用,大大减少开发时间
5 #define MULT_NODE 3
6
7 typedef struct _Node{
8 int type;
9 double val;
10 struct _Node *pLeft;
11 struct _Node *pRight;
12 }Node;
13
14 double Calc(Node * pNode);
15
16 #define newNumNode(val) {NUM_NODE, (val), NULL, NULL};
17 #define newAddNode(pLeft, pRight) {ADD_NODE, 0, (pLeft), (pRight)};
18 #define newMultNode(pLeft, pRight) {MULT_NODE, 0 , (pLeft), (pRight)};
其中,使用了名为newNumNode、newAddNode和newMultNode的宏将结构体初始化,表达式算术树接口的实现详见程序清单 4.13。
程序清单 4.13 表达式算术树接口的实现(cacltree.c)
1 #include"Node.h"
2
3 double Calc(Node * pNode)
4 {
5 double x = 0;
6 switch (pNode -> type){
7 case NUM_NODE:
8 x = pNode -> val;
9 break;
10 case ADD_NODE:
11 x = Calc(pNode -> pLeft) + Calc(pNode -> pRight);
12 break;
13 case MULT_NODE:
14 x = Calc(pNode -> pLeft) * Calc(pNode -> pRight);
15 break;
16 default:
17 break;
18 }
19 return x;
20 }
表达式算术树的使用范例详见程序清单 4.14。
程序清单 4.14 表达式算术树使用范例
1 #include
2 #include "Node.h"
3
4 void main()
5 {
6 Node node1 = newNumNode(20.0);
7 Node node2 = newNumNode(-10.0);
8 Node node3 = newAddNode(&node1, &node2);
9 Node node4 = newNumNode(0.1);
10 Node node5 = newMultNode(&node3, &node4);
11 printf("Calculating the tree\n");
12 double x = Calc(&node5);
13 printf("Result:%lf\n", x);
14 }
2. 抽象类
根据问题的描述,需求词汇表中有一组这样的概念,比如,根结点和左右叶子结点的操作数,且加法和乘法都是二元操作。虽然词汇表对应的词汇为Node、_pLeft、_pRight、Number、Binary、Additive和Multiplicative,但用Node、_pLeft、_pRight、NumNode、BinNode、AddNode和MultNode描述表达式算术树的各个结点更准确。
由于AddNode和MultNode都是二元操作,其共性是两个数(_pLeft和_pRight)的计算,其可变性分别为加
- 面向对象编程——虚函数(09-20)
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)