?? bo2-7.cpp
字號:
// bo2-7.cpp 多項式(存儲結構由c2-6.h定義)的基本操作及算法2.22、2.23等
#include"c2-5.h"
#include"bo2-6.cpp"
typedef LinkList polynomial;
#define DestroyPolyn DestroyList // 與bo2-6.cpp中的函數同義不同名
#define PolynLength ListLength // 與bo2-6.cpp中的函數同義不同名
Status OrderInsertMerge(LinkList &L,ElemType e,int(* compare)(term,term))
{ // 按有序判定函數compare()的約定,將值為e的結點插入或合并到升序鏈表L的適當位置
Position q,s;
if(LocateElem(L,e,q,compare)) // L中存在該指數項
{
q->data.coef+=e.coef; // 改變當前結點系數的值
if(!q->data.coef) // 系數為0
{ // 刪除多項式L中當前結點
s=PriorPos(L,q); // s為當前結點的前驅
if(!s) // q無前驅
s=L.head;
DelFirst(L,s,q);
FreeNode(q);
}
return OK;
}
else // 生成該指數項并插入鏈表
if(MakeNode(s,e)) // 生成結點成功
{
InsFirst(L,q,s);
return OK;
}
else // 生成結點失敗
return ERROR;
}
int cmp(term a,term b) // CreatPolyn()的實參
{ // 依a的指數值<、=或>b的指數值,分別返回-1、0或+1
if(a.expn==b.expn)
return 0;
else
return (a.expn-b.expn)/abs(a.expn-b.expn);
}
void CreatPolyn(polynomial &P,int m) // 算法2.22
{ // 輸入m項的系數和指數,建立表示一元多項式的有序鏈表P
Position q,s;
term e;
int i;
InitList(P);
printf("請依次輸入%d個系數,指數:\n",m);
for(i=1;i<=m;++i)
{ // 依次輸入m個非零項(可按任意順序)
scanf("%f,%d",&e.coef,&e.expn);
if(!LocateElem(P,e,q,cmp)) // 當前鏈表中不存在該指數項,cmp是實參
if(MakeNode(s,e)) // 生成結點并插入鏈表
InsFirst(P,q,s);
}
}
void PrintPolyn(polynomial P)
{ // 打印輸出一元多項式P
Link q;
q=P.head->next; // q指向第一個結點
printf(" 系數 指數\n");
while(q)
{
printf("%f %d\n",q->data.coef,q->data.expn);
q=q->next;
}
}
void AddPolyn(polynomial &Pa,polynomial &Pb) // 算法2.23
{ // 多項式加法:Pa=Pa+Pb,并銷毀一元多項式Pb
Position ha,hb,qa,qb;
term a,b;
ha=GetHead(Pa);
hb=GetHead(Pb); // ha和hb分別指向Pa和Pb的頭結點
qa=NextPos(ha);
qb=NextPos(hb); // qa和qb分別指向Pa和Pb中當前結點(現為第一個結點)
while(!ListEmpty(Pa)&&!ListEmpty(Pb)&&qa)
{ // Pa和Pb均非空且ha沒指向尾結點(qa!=0)
a=GetCurElem(qa);
b=GetCurElem(qb); // a和b為兩表中當前比較元素
switch(cmp(a,b))
{
case -1:ha=qa; // 多項式Pa中當前結點的指數值小
qa=NextPos(ha); // ha和qa均向后移一個結點
break;
case 0: qa->data.coef+=qb->data.coef;
// 兩者的指數值相等,修改Pa當前結點的系數值
if(qa->data.coef==0) // 刪除多項式Pa中當前結點
{
DelFirst(Pa,ha,qa);
FreeNode(qa);
}
else
ha=qa;
DelFirst(Pb,hb,qb);
FreeNode(qb);
qb=NextPos(hb);
qa=NextPos(ha);
break;
case 1: DelFirst(Pb,hb,qb); // 多項式Pb中當前結點的指數值小
InsFirst(Pa,ha,qb);
ha=ha->next;
qb=NextPos(hb);
}
}
if(!ListEmpty(Pb))
{
Pb.tail=hb;
Append(Pa,qb); // 鏈接Pb中剩余結點
}
DestroyPolyn(Pb); // 銷毀Pb
}
void AddPolyn1(polynomial &Pa,polynomial &Pb)
{ // 另一種多項式加法的算法:Pa=Pa+Pb,并銷毀一元多項式Pb
Position qb;
term b;
qb=GetHead(Pb); // qb指向Pb的頭結點
qb=qb->next; // qb指向Pb的第一個結點
while(qb)
{
b=GetCurElem(qb);
OrderInsertMerge(Pa,b,cmp);
qb=qb->next;
}
DestroyPolyn(Pb); // 銷毀Pb
}
void Opposite(polynomial Pa)
{ // 一元多項式系數取反
Position p;
p=Pa.head;
while(p->next)
{
p=p->next;
p->data.coef*=-1;
}
}
void SubtractPolyn(polynomial &Pa,polynomial &Pb)
{ // 多項式減法:Pa=Pa-Pb,并銷毀一元多項式Pb
Opposite(Pb);
AddPolyn(Pa,Pb);
}
void MultiplyPolyn(polynomial &Pa,polynomial &Pb)
{ // 多項式乘法:Pa=PaPb,并銷毀一元多項式Pb
polynomial Pc;
Position qa,qb;
term a,b,c;
InitList(Pc);
qa=GetHead(Pa);
qa=qa->next;
while(qa)
{
a=GetCurElem(qa);
qb=GetHead(Pb);
qb=qb->next;
while(qb)
{
b=GetCurElem(qb);
c.coef=a.coef*b.coef;
c.expn=a.expn+b.expn;
OrderInsertMerge(Pc,c,cmp);
qb=qb->next;
}
qa=qa->next;
}
DestroyPolyn(Pb); // 銷毀Pb
ClearList(Pa); // 將Pa重置為空表
Pa.head=Pc.head;
Pa.tail=Pc.tail;
Pa.len=Pc.len;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -