//一元多項式的表示及相加
#include
#include
#define
true
1#define
false
0#define ok 1
#define error 0
#define infeasible -
1#define overflow -
2typedef struct //項的表示,多項式的項作為linklist的資料元素
term, elemtype; //兩個型別名:term用於本adt,elemtype為linklist的資料物件名
typedef struct lnode //結點型別
lnode, *
link, *position;
typedef struct //鍊錶型別
linklist;
typedef linklist polynomial; //用帶頭結點的有序鍊錶表示多項式
typedef int status;
status initlist(linklist *l)
else
return error;
} status makenode(link
*p,elemtype e)
status insfirst(linklist *l,link h,link s) //形參增加l,因為需修改l
status delfirst(linklist *l,link h,link
*q) //形參增加l,因為需修改l
else
return
false; //鍊錶空
}//置空鍊錶l
status clearlist(linklist *l)
free(q);
l->tail = l->head;
l->len =
0; }
return ok;
}position gethead(linklist *l)
position nextpos(link p)
position priorpos(linklist l, link p)
return q;
}void freenode(link
*p)status listempty(linklist l)
elemtype getcurelem(link p)
(*l).tail = s; //l的尾指標變成s的尾指標
(*l).len+=i; //增加長度
return ok;
}//銷毀一元多項式p
void destroypolyn(linklist *l)
//依e1的指數的值<,=,>e2的指數值, 分別返回-1,0,1 ,此為公升序
int cmp(term e1, term e2)
//若有序鍊錶l中存在於e滿足判定函式compare()取值為0的元素,則q指示l中第乙個值為e
//的結點的位置, 並返回true;否則q指示第乙個與e滿足判定函式compare()取值》0的元素的前驅的位置,並返回false
status locateelem(linklist l, elemtype e, position *q, int (*compare)(elemtype, elemtype))
while(p && compare(p->
data, e) <
0); //找到第乙個大於等於e的位置
if(!p || compare(p->
data, e) >
0) //到表尾或者找到的位置的值並不相等
else
//找到相等
}//按有序判定函式compare()的約定,將值為e的結點插入到有序鍊錶的l適當位置
status orderinsert(linklist *l, elemtype e, int(*compare)(elemtype, elemtype))
return ok;
}else
return error;
}}void creatpolyn(polynomial *p, int m)
}}//列印輸出一元多項式p
void printpolyn(polynomial p)
}//返回一元多項式p中的項數
int polynlength(polynomial p)
return i;
}//完成多項式相加運算:pa = pa + pb,並銷毀一元多項式
void addpolyn(polynomial *pa, polynomial *pb)
else
//為0則刪除多項式pa中當前結點
delfirst(pb, hb, &qb);
freenode(&qb);
qa = nextpos(ha);
qb = nextpos(hb);
break;
case
1: //多項式pb中當前結點係數小
delfirst(pb, hb, &qb);
insfirst(pa, ha, qb);
qb = nextpos(hb);
ha = nextpos(ha); }}
if(!listempty(*pb))
destroypolyn(pb);
}void oppsite(polynomial *pa)
}//(方法一)完成多項式相減運算,即:pa = pa - pb, 並銷毀一元多項式pb
void subtractpolyn(polynomial *pa, polynomial *pb)
else
delfirst(pb, hb, &qb); //不管a-b的結果如何都要刪除此時pb所指結點
freenode(&qb);
qb = nextpos(hb);
qa = nextpos(ha);
break;
case
1: qb->
data
.coef *=-1;
delfirst(pb, hb, &qb);
insfirst(pa, ha, qb); //如果b>a就把此時pb所指元素插入到pa所指元素之前
qb = nextpos(hb);
ha = ha->next;
break;}}
if(!listempty(*pb))
pb->tail = hb;
}destroypolyn(pb);
}//(方法二)完成多項式相減運算,即:pa = pa - pb, 並銷毀一元多項式pb
void subtractpolyn_n(polynomial *pa, polynomial *pb)
//多項式乘法:pa = pa * pb,並銷毀一元多項式pb
void multipypolyn(polynomial *pa, polynomial *pb)
qa = qa->next;
}destroypolyn(pb);
clearlist(pa);
pa->head = pc.head;
pa->tail = pc.tail;
pa->len = pc.len;
}void main()
資料結構 一元多項式的表示及相加
typedef struct float coef 係數 int expn 指數 term,elemtype 定義結構體 typedef linklist polynomial 用帶頭結點的有序鍊錶表示多項式 int cmp term a,term b 依a 的指數值 b 的指數值。分別返回 1 0...
資料結構 一元多項式的表示及相加
本文所有 均為偽碼,僅闡述演算法基本思想 資料結構 清華大學出版社 一元多項式的表示採用鏈式儲存結構來實現,基本操作和鍊錶的合併類似。以下為演算法部分 typedef structterm,elemtype 兩個型別名 term用於本adt,elemtype為linklist的資料物件名 type ...
資料結構 一元多項式的表示及相加
用單鏈表儲存多項式的結點結構如下 struct polynode 1.兩個多項式中所有指數相同的項的對應係數相加,若和不為零,則構成 和多項式 中的一項 2.所有指數不相同的項 均復抄到 和多項式 中。1.若pa exp exp,則結點pa所指的結點應是 和多項式 中的一項,將結點pa插入在結點pc...