資料結構 一元多項式的表示及相加(C語言)

2021-08-18 08:45:38 字數 3731 閱讀 9756

//一元多項式的表示及相加

#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...