有如下結構體的數據
typedef struct tagdata
{
double a;
double b;
double c;
double d;
}data;
有數組數據
data x[1000];
有公式
y = (x.a + x.b + x.c + x.d + 100) / 4
其中數據對應關係爲
y[n] = (x[n - 1].a + x[n - 2].b + x[n].c + x[n].d + 100) / 4 (n >= 2)
現在通過構造表達式二叉樹完成計算。
定義二叉樹節點結構體
typedef struct tagbintree
{
char op;
char level;
double fvalue;
int structindex; /* 用於在計算中識別結構體成員 */
struct tagbintree *lchild;
struct tagbintree *rchild;
}bintree;
添加一個函數 preoffset 處理表達式中數據的座標變化
double preoffset(data *p, int offset, int structindex)
{
if (structindex == 1)
return (p - offset)->a;
if (structindex == 2)
return (p - offset)->b;
if (structindex == 3)
return (p - offset)->c;
return (p - offset)->d;
}
現在將要計算的表達式做一下變換
y = (preoffset(a, 1) + preoffset(b, 2) + c + d + 100) / 4
原有的計算節點值的函數 double caltree(const bintree *node) 修改成爲double caltree(const bintree *node, data *p) ,通過參數p引入數據數組x,完成計算。
表達式樹的構造過程沒有多大變化,只要將表達式中變量識別之後記錄在節點中,最後計算時通過循環以表達式樹計算數組x每個元素將結果放進數組y當中。
可以以此來實現由數據繪製函數圖像的功能。
在原有的程序基礎上做修改很容易的,完整代碼就不再寫了。