您的位置:首页 > 其它

一元多项式运算

2008-10-10 02:38 190 查看
#include<iostream>

#include<malloc.h>

#include<stdlib.h>

using namespace std;

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef struct polyn

{

float coef;

int expn;

struct polyn *next;

}Elem,*polynomial;

void CreatPolyn(polynomial &p,int n) //创建多项式

{

p=(polynomial)malloc(sizeof(Elem));

p->expn=-1;

p->next=NULL;

polynomial q=p,r;

for(int i=0;i<n;i++)

{

q=(polynomial)malloc(sizeof(Elem));

cin>>q->coef>>q->expn;

if(!i) {p->next=q;r=q;}

else {r->next=q;r=q;}

}

q->next=NULL;

}

void Sort(polynomial &p,int n) //排序

{

polynomial q,r,t;

int j;

bool change=true;

for(int i=n-1;i>0&&change;i--)

{

change=false;

for(r=p,q=p->next,j=0;q->next&&j<i;j++)

if(q->expn>q->next->expn) {

r->next=q->next;

t=q->next->next;

q->next->next=q;

q->next=t;

change=true;

r=r->next;}

else{r=q;q=q->next;}

}

}

void PrintPolyn(polynomial p) //输出

{

while(p=p->next)

cout<<p->coef<<" "<<p->expn<<endl;

cout<<endl;

}

void AddPolyn(polynomial &La,polynomial &Lb) //加法

{

polynomial qa=La->next,qb=Lb->next,qqa=La,t;

while(qa&&qb)

{ if(qb->expn>qa->expn) {qqa=qa;qa=qa->next;}

else if(qb->expn<qa->expn) {

qqa->next=qb;

t=qb;

qb=qb->next;

t->next=qa;}

else {

qa->coef+=qb->coef;

if(!qa->coef) {qqa->next=qa->next;

free(qa);

t=qb;

qb=qb->next;

free(t);

qa=qqa->next;}

else {qb=qb->next; qqa=qa;qa=qa->next;}

}

}

if(!qa&&qb) qqa->next=qb;

free(Lb);

}

void SubtractPolyn(polynomial &La,polynomial &Lb) //减法

{

polynomial qa=La->next,qb=Lb->next,qqa=La,t;

while(qa&&qb)

{ if(qb->expn>qa->expn) {qqa=qa;qa=qa->next;}

else if(qb->expn<qa->expn) {

qb->coef=-qb->coef;

qqa->next=qb;

t=qb;

qb=qb->next;

t->next=qa;}

else {

qa->coef-=qb->coef;

if(!qa->coef) {qqa->next=qa->next;

free(qa);

t=qb;

qb=qb->next;

free(t);

qa=qqa->next;}

else {qb=qb->next; qqa=qa;qa=qa->next;}

}

}

if(!qa&&qb) {

qqa->next=qb;

while(qb)

{

qb->coef=-qb->coef;

qb=qb->next; }

}

free(Lb);}

void CopyPolyn(polynomial &La,polynomial &Lb) //复制

{

polynomial p,q,pp=La->next;

Lb=(polynomial)malloc(sizeof(Elem));

Lb->expn=-1;

for(;pp;pp=pp->next)

{

p=(polynomial)malloc(sizeof(Elem));

p->coef=pp->coef;

p->expn=pp->expn;

if(pp==La->next) {Lb->next=p;q=p;}

else {q->next=p;q=p;}

}

p->next=NULL; }

void InsertPolyn(polynomial &La,polynomial &e) //插入

{

polynomial pa=La,t;

while(pa->next&&pa->next->expn<e->expn)

pa=pa->next;

if(!pa->next) {pa->next=e;e->next=NULL;}

else if(pa->next->expn>e->expn) {

e->next=pa->next;

pa->next=e;

}

else if(pa->next->expn==e->expn) {

pa->next->coef+=e->coef;

if(!pa->next->coef)

{

t=pa->next;

pa->next=pa->next->next;

// free(t);

}

//free(e);

}

}

void MultiplyPolyn(polynomial La,polynomial Lb,polynomial &Lc) //乘法

{

polynomial qa,qb=Lb,qq;

Lc=(polynomial)malloc(sizeof(Elem));

Lc->expn=-1;

Lc->next=NULL;

while(qb=qb->next)

{

for(qa=La->next;qa;qa=qa->next)

{

qq=(polynomial)malloc(sizeof(Elem));

qq->coef=qa->coef*qb->coef;

qq->expn=qa->expn+qb->expn;

InsertPolyn(Lc,qq);}

}

}

int main()

{

int np,nq;

polynomial p,q,m,r,y;

cin>>np;

CreatPolyn(p,np);

Sort(p,np);

PrintPolyn(p);

cin>>nq;

CreatPolyn(q,nq);

Sort(q,nq);

PrintPolyn(q);

CopyPolyn(q,r);

PrintPolyn(r);

CopyPolyn(q,y);

PrintPolyn(y);

AddPolyn(p,q);

PrintPolyn(p);

SubtractPolyn(p,r);

PrintPolyn(p);

MultiplyPolyn(p,y,m);

PrintPolyn(m);

return 0;

}

3

2 1

3 0

1 3

3 0

2 1

1 3

2

1 4

-2 1

-2 1

1 4

-2 1

1 4

-2 1

1 4

3 0

1 3

1 4

3 0

2 1

1 3

-6 1

-4 2

1 4

2 5

1 7

请按任意键继续. . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: