计算一元稀疏多项式

要求完成如下功能:
(1) 输入并建立多项式——creatpolyn()
(2) 输出多项式,输出形式为整数序列,序列按指数升序排列——printpolyn()
(3) 多项式a和b相加,建立多项式a+b,输出相加的多项式——addpolyn()
(4) 多项式a和b相减,建立多项式a-b,输出相减的多项式——subpolyn()用带表头结点的单链表存储多项式。
测试数据:
(1)(2x+5x8-3.1x11)+(7-5x8+11x9)
(2) (6-3x+4.4x2-1.2x9)-(-6-3x+5.4x2+7.8x15)
(3)(x+x2+x3)+0
(4)(x+x3)-(-x-x-3)
这是我做的,未成功。请高手看下
#include<iostream.h>
//#define elemtype int
//const int maxsize=1000;
class polyn
{
protected:
double coef;//多项式的系数
double exp;//多项式的指数
polyn *next;//下一个元素的地址
public:

polyn *creatpolyn()//建立多项式链表
{
polyn *p,*r,*s;
p=r=new polyn;//申请多项式链表
double x,y;
cout<<"输入多项式的系数和指数(系数为0结束,指数从小到大)";
cin>>x>>y;
while(x)
{
s=new polyn;
s->coef=x;
s->exp=y;
r->next=s;
r=s;
cout<<"输入多项式的系数和指数(系数为0结束,指数从小到大)";
cin>>x>>y;
}
r->next=NULL;
return p;
}
void print (polyn *h)//输入多项式
{
polyn *p=h->next;
//输出多项式的第一个结点
if(p->coef!=0)
{
if(p->exp!=0)
cout<<p->coef<<"x^"<<p->exp;
else
cout<<p->coef;

}
p=p->next;
while(p!=NULL)
{
if(p->coef>0)
cout<<"+";
cout<<p->coef<<"x^"<<p->exp;
p=p->next;
}
cout<<endl;
}

void addpolyn(polyn *a,polyn *b) //多项式相加
{
polyn *p,*q,*u,*pre;
double x;
p=a->next;
q=b->next;
while((p!=NULL)&&(q!=NULL))
if(p->exp<q->exp)
{
pre=p;p=p->next;
}
else if(p->exp==q->exp)
{
x=p->coef+q->coef;
if(x!=0)
{p->coef=x;pre=p;}
else
{pre->next=p->next;delete p;}//删除结点
p=pre->next;u=q;q=q->next;delete u;//删除结点
}
else
{u=q->next;q->next=p;pre->next=q;pre=q;q=u;}//插入结点
if(q!=NULL) pre->next=q;
}

void subpolyn(polyn *a,polyn *b) //多项式相减

{
polyn *s=b;while(s)
{ s->coef*=-1;s=s->next; }
addpolyn(a,b);
}
};

void main()
{
polyn *a,*b,c;
cout<<"建立第一个多项式链表"<<endl;//建立第一个多项式链表
a=c.creatpolyn();
cout<<"建立第二个多项式链表"<<endl;//建立第二个多项式链表
b=c.creatpolyn();
c.print(a);//输出第一个链表
c.print(b);//输出第二个链表
int i;
cout<<"输入多项式是做和还是做差,做和输入1,做差输入0"<<endl;
cin>>i;
if(i==1)
{c.addpolyn(a,b);//输出合并后的链表
c.print(a);}
else { c.subpolyn(a,b);//输出相减后的链表
c.print(a);}
}

输入说明:一组输入数据,所有数据均为整数。第1行为2个正整数n,m,其中 n表示第一个多项式的项数,m表示第二个多项式的项数。

第2行包含2n个整数,每两个整数分别表示第一个多项式每一项的系数和指数;第3行包含2m个整数,每两个整数分别表示第二个多项式每一项的系数和指数。(注:序列按指数升序排列)

输出说明:在一行以类多项式形式输出结果,指数按从低到高的顺序。注意,系数值为1的非零次项的输出形式中略去系数1,如1x^2的输出形式为x^2,-1 x^2的输出形式为-x^2。

输入样例:

6 2。

1 0 1 1 1 2 1 3 1 4 2 5。

-1 3 -2 4。

输出样例:

1+x+x^2-x^4+2x^5。

扩展资料:

一、需求分析:

1、输入并建立两个多项式。

2、多项式a与b相加,建立和多项式c。

3、输出多项式a,b,c。输出格式:比如多项式a为:A(x)=c1xe1+c2xe2+…+ cmxem,其中,ci和ei分别为第i项的系数和指数,且各项按指数的升幂排列,即0≤e1<e2<…<em。多项式b,c类似输出。

4、测试数据。

(1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)。

(2)(x+x100)+(x100+x200)=(x+2x100+x200)。

(3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11)    。    

二、设计。

存储结构:用带头结点的单链表存储多项式。三个多项式链表中都只存储非零系数项。若多项式a与b中指数相。等的两项相加后,系数为零,则在和多项式c中不存储该指数项。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-06
这是我以前做的数据结构课程设计,加减乘除、求值、求导等功能。
希望可以帮上你的忙。

#include<stdio.h>
#include<malloc.h>
typedef struct Polynomial{
float coef;
int expn;
struct Polynomial *next;
}*Polyn,Polynomial; //Polyn为结点指针类型
void Insert(Polyn p,Polyn h){
if(p->coef==0) free(p); //系数为0的话释放结点
else{
Polyn q1,q2;
q1=h;q2=h->next;
while(q2&&p->expn<q2->expn){ //查找插入位置
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn){ //将指数相同相合并
q2->coef+=p->coef;
free(p);
if(!q2->coef){ //系数为0的话释放结点
q1->next=q2->next;
free(q2);
}
}
else{ //指数为新时将结点插入
p->next=q2;
q1->next=p;
}
}
}//Insert
Polyn CreatePolyn(Polyn head,int m){//建立一个头指针为head、项数为m的一元多项式
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0;i<m;i++){
p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:",i+1);
scanf("%f %d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}//CreatePolyn
void DestroyPolyn(Polyn p){//销毁多项式p
Polyn q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next){
free(q1);
q1=q2;//指针后移
q2=q2->next;
}
}
void PrintPolyn(Polyn P){
Polyn q=P->next;
int flag=1;//项数计数器
if(!q) { //若多项式为空,输出0
putchar('0');
printf("\n");
return;
}
while (q){
if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项
if(q->coef!=1&&q->coef!=-1){//系数非1或-1的普通情况
printf("%g",q->coef);
if(q->expn==1) putchar('X');
else if(q->expn) printf("X^%d",q->expn);
}
else{
if(q->coef==1){
if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef==-1){
if(!q->expn) printf("-1");
else if(q->expn==1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}//while
printf("\n");
}//PrintPolyn
int compare(Polyn a,Polyn b){
if(a&&b){
if(!b||a->expn>b->expn) return 1;
else if(!a||a->expn<b->expn) return -1;
else return 0;
}
else if(!a&&b) return -1;//a多项式已空,但b多项式非空
else return 1;//b多项式已空,但a多项式非空
}//compare
Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn qa=pa->next;
Polyn qb=pb->next;
Polyn headc,hc,qc;
hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb){
qc=(Polyn)malloc(sizeof(struct Polynomial));
switch(compare(qa,qb)){
case 1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case 0:
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case -1:
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;
}
}//switch
if(qc->coef!=0){
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
else free(qc);//当相加系数为0时,释放该结点
}//while
return headc;
}//AddPolyn
Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn h=pb;
Polyn p=pb->next;
Polyn pd;
while(p){ //将pb的系数取反
p->coef*=-1;
p=p->next;
}
pd=AddPolyn(pa,h);
for(p=h->next;p;p=p->next) //恢复pb的系数
p->coef*=-1;
return pd;
}//SubtractPolyn
float ValuePolyn(Polyn head,float x){//输入x值,计算并返回多项式的值
Polyn p;
int i;
float sum=0,t;
for(p=head->next;p;p=p->next){
t=1;
for(i=p->expn;i!=0;){
if(i<0){t/=x;i++;}//指数小于0,进行除法
else{t*=x;i--;}//指数大于0,进行乘法
}
sum+=p->coef*t;
}
return sum;
}//ValuePolyn
Polyn Derivative(Polyn head){//求解并建立a的导函数多项式,并返回其头指针
Polyn q=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hd->next=NULL;
while(q){
if(q->expn!=0){ //该项不是常数项时
p2=(Polyn)malloc(sizeof(struct Polynomial));
p2->coef=q->coef*q->expn;
p2->expn=q->expn-1;
p2->next=p1->next;//连接结点
p1->next=p2;
p1=p2;
}
q=q->next;
}
return hd;
}//Dervative
Polyn MultiplyPolyn(Polyn pa,Polyn pb){//求解并建立多项式a*b,返回其头指针
Polyn hf,pf;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next){
for(qb=pb->next;qb;qb=qb->next){
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}
}
return hf;
}//MultiplyPolyn
void DevicePolyn(Polyn pa,Polyn pb){//求解并建立多项式a*b,返回其头指针
Polyn hf,pf,af,temp1,temp2,q;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点,存储商
hf->next=NULL;
pf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点,存储余数
pf->next=NULL;
temp1=(Polyn)malloc(sizeof(struct Polynomial));
temp1->next=NULL;
temp2=(Polyn)malloc(sizeof(struct Polynomial));
temp2->next=NULL;
temp1=AddPolyn(temp1,pa);
while(qa!=NULL&&qa->expn>=qb->expn){
temp2->next=(Polyn)malloc(sizeof(struct Polynomial));
temp2->next->coef=(qa->coef)/(qb->coef);
temp2->next->expn=(qa->expn)-(qb->expn);
Insert(temp2->next,hf);
pa=SubtractPolyn(pa,MultiplyPolyn(pb,temp2));
qa=pa->next;
temp2->next=NULL;
}
pf=SubtractPolyn(temp1,MultiplyPolyn(hf,pb));
pb=temp1;
printf("商是:");
PrintPolyn(hf);
printf("余数是:");
PrintPolyn(pf);
}//DevicePolyn

int main(){
int m,n,flag=0;
float x;
Polyn pa=0,pb=0,pc,pd,pe,pf;//定义各式的头指针,pa与pb在使用前付初值NULL
printf("请输入a的项数:");
scanf("%d",&m);
pa=CreatePolyn(pa,m);//建立多项式a
printf("请输入b的项数:");
scanf("%d",&n);
pb=CreatePolyn(pb,n);//建立多项式a
//输出菜单
printf("**********************************************\n");
printf("操作提示:\n\t1.输出多项式a和b\n\t2.建立多项式a+b\n\t3.建立多项式a-b\n");
printf("\t4.计算多项式a在x处的值\n\t5.求多项式a的导函数\n\t6.建立多项式a*b\n");
printf("\t7.建立多项式a/b\n\t8.退出\n**********************************************\n");
for(;;flag=0){
printf("执行操作");
scanf("%d",&flag);
if(flag==1){
printf("多项式a:");PrintPolyn(pa);
printf("多项式b:");PrintPolyn(pb);continue;
}
if(flag==2){
pc=AddPolyn(pa,pb);
printf("多项式a+b:");PrintPolyn(pc);
DestroyPolyn(pc);continue;
}
if(flag==3){
pd=SubtractPolyn(pa,pb);
printf("多项式a-b:");PrintPolyn(pd);
DestroyPolyn(pd);continue;
}
if(flag==4){
printf("输入x的值:x=");
scanf("%f",&x);
printf("多项式a的值%g\n",ValuePolyn(pa,x));continue;
}
if(flag==5){
pe=Derivative(pa);
printf("多项式a的导函数:");PrintPolyn(pe);
DestroyPolyn(pe);continue;
}
if(flag==6){
pf=MultiplyPolyn(pa,pb);
printf("多项式a*b:");PrintPolyn(pf);
DestroyPolyn(pf);continue;
}
if(flag==7){
DevicePolyn(pa,pb);
continue;
}
if(flag==8) break;
if(flag<1||flag>8) printf("Error!!!\n");continue;
}//for
DestroyPolyn(pa);
DestroyPolyn(pb);
return 0;
}本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网