一元多项式相加问题地实验报告材料

来源:工作范文网 时间:2020-09-27 08:43:40

实用文案

实用文案

标准文档

标准文档

一元多项式相加问题

一、 问题描述

通过键盘输入两个形如 Po + P 1X1 +P 2X2+…+ P nX

的多项式,经过程序运后在屏幕上输出它们的相加和。

二、 数据结构设计

一个一元多项式的每一个子项都由“系数 -指数”两部分组成,因此可

将其抽象为包含系数coef、指数exp、指针域next构成的链式线性表。将两 个多项式分别存放在两个线性表中,然后经过相加后将所得多项式存放在一 个新的线性表中,但是不用再开辟新的存储空间,只依靠结点的移动来构成 新的线性表,期间可以将某些不需要的空间回收。基于这样的分析,可以采 用不带头结点的单链表来表示一个一元多项式。具体数据类型定义为:

struct node

{

float coef; // 系数域

int exp; //指数域

struct node *n ext;

};

三、 功能函数设计

1、 输入多项式的系数和指数初始化多项式的功能模块

具体函数为node *in_fun()

此函数的处理较为全面,要求用户按照指数递增的顺序和一定的输入格式输

入各个系数不为0的子项,输入一个子项建立一个相关结点,当遇到输入结 束标志时停止输入。关键步骤具体如下:

⑴控制用户按照指数递增的顺序输入

r=a;

while(r!=q->n ext)

{

if(y<=r->exp)

{

coutvv"请按照指数递增顺序输入,请重新输入";

cin> >x>>y;

break;

}

r=r- >n ext;

}

从头开始遍历,若遇到目前输入的指数不是最大时,就跳出循环,让用户重

新输入。

⑵当输入的系数为零时,不为其分配存储空间存储

while(x==0) { cin> >x>>y; continu e;}

即若系数为0,不再进行动态分配并新建结点,而是重新提取用户输入的下一 个子项的系数和指数,利用continue进入下一次循环。

⑶初始化完成后将最后一个结点的指针域置为空,并返回该新建链表的首地

址。

if(q!二NULL) q->n ext二NULL;

return a;

⑷动态分配空间新建结点存储系数和指数的代码如下:

p=new node;

p->coef=x;

p->exp=y;

if(a==NULL) a=p;

else q->n ext=p;

q=p;

2、 多项式显示功能函数

由于系数有正有负,故采取如下处理:

对于正数,输出时在前面加“ + ”,头指针除外;对于负数,直接将系数输出

即可,即:

p=a;

while(p)

{

if(p==a) cout<vp->coefvv"*xA"vvp->exp;

else if(p->coef<0)else if(p->coef>0) p=p->n ext;}输出的多项式的形式形如:cout<<p->coef<<"*xA

else if(p->coef<0)

else if(p->coef>0) p=p->n ext;

}

输出的多项式的形式形如:

PiXAI+P 2XA2+ …+PnXAn

3、 多项式相加的功能函数

c为头指函数为:

c为头指

此函数根据在1中初始化的两个多项式进行相加运算,并存放在以

针的一个新链表中 设指针p,q,r分别指向描述多项式的链表 a,b,c的头部,其中将a也赋给c。

p,q两个指针同时移动,并根据 p,q两结点对应的指数的大小采取不同的操 作。

⑴当(p->exp)v(q->exp) 时,操作如下:

w=p;

p=p->n ext;

r->n ext=w;

r=w;

即定义一个结点w,将结点p赋给它,然后将p结点后移,指向a中下一个 待处理结点,然后将w移动到新生成链表c的尾结点的后面,最后将w赋给 r,使得r仍指向链表c的尾结点。

⑵当p->exp>q->exp 时,采取如下操作:

w=q;

q二q->n ext;

r->n ext=w;

r=w;

即此时将q赋给w,然后使q结点指向链表b中下一个待处理结点,然后将w 移动到新生成链表c的尾结点的后面,最后将 w赋给r,使得r仍指向链表c 的尾结点。

⑶当p->exp==q->exp 时,定义一个float类型的变量x,当x不为0时,

采取如下操作:

p->coef=x;

W=p;

p=p->n ext;

r->n ext=w;

r=w;

w=q;

q二q->n ext;

delete w;

即将x的值赋给p的系数域,之后将结点p赋给w,然后将p结点后移,指 向a中下一个待处理结点,然后将 w移动到新生成链表c的尾结点的后面, 最后将w赋给r,使得r仍指向链表c的尾结点。同时,将q的内存空间释放, 并使得q指向b中下一个待处理结点。

当x为0时,采取如下操作:

w=p;

p=p->n ext;

delete w;

w=q;

q二q->n ext;

delete w;

即将pq的空间释放,并分别使其指向各自链表中下一个待处理结点。

⑷当上面的循环进行完后,至少有一个链表已被遍历完,然后只需将另一个 链表剩余的所有结点都移动到c中即可。

if(p!二NULL)

{

while(p) {

w=p;

p=p->n ext;

r->n ext=w;

r=w;

}

}

if(q!二NULL)

{

while(q)

{

w=q;

q二q->n ext;

r->n ext=w;

r=w;

}

}

⑸最后将c中的最后一个结点的指针域置为空,并返回c的地址

r->n ext=NULL;

return c;

4、 主函数功能设计

采用循环的形式可以多次进行两个多项式的初始化和求和。

四、界面设计

提示用户进行每一步操作以及每一步输出的内容,界面简明清晰

五、运行与调试

—元多项式相加问题

请输入第一个多项式的系数和指数

TOC \o "1-5" \h \z 1 2

-0.2 4

3 5

a

a 0

您所输入的多项式为

请输入第二个多顶式的系数和指数

TOC \o "1-5" \h \z 3 2

0 3

-3 5

* 6

0.7 B

0 0

石所输入的多顶式为

3?x"2-3?x"5 *5?xA6 +0.

初始化完毕,两多顶式相加得

4?xA2-0_2?xA4*5*xA6+7*x^8

TOC \o "1-5" \h \z 址绫初始比多项衣请输人1,停止请输入D 1

—元多顶式相加问题

请输入第一个多顶式的系数和指数

1 1

3 3

备按禺指数递増顺序输人请重新输入4 4

0 5

7 ?

芬所输入的多项式为

1+4mxa4+7*xa7

请输入第二个多项式的系数和指数

2 2

TOC \o "1-5" \h \z -3 3

0 6

-7 7

? 9

8 0

您所输入的多顶式为

2 *x^2 -3 *x -7*x A7+9 *x

初始化完毕,两多项式相加得

1*ka1£ +4m^a4+9*xa9

继续初始化多项式请输入丄?停止请输人0 0

Pi'tss a.rty ke呼 to continue

六、源代码

#in clude<iostream.h> struct node

{

float coef; // 系数域

int exp; //指数域

struct node *n ext;

};

node *in_fun()

{

node *p,*a,*q,*r;

a=q=NULL;

float x;

int y;

cin> >x?y;

while(x!=O||y!=O)

{

while(x==0)

{

cin> >x?y;

if(x==0&&y==0) break;

else {con ti nu e;}

}

if(x==0&& y==0) break;

p=new node;

p_>coef=x;

p->exp=y;

if(a==NULL) a=p;

else q->n ext=p;

q=p;

cin> >x?y;

if(x==0&& y==0) break;

r=a;

while(r!=q->n ext)

{

if(y<=r->exp)

cout<<"请按照指数递增顺序输入

cin> >x?y;

break;

}

r=r->n ext;

}

if(x==O&& y==0) break;

}

if(q!=NULL) q-> next=NULL;

return a;

}

void out_fun(node *a)

{

node *p;

p=a;

,请重新输入

,请重新输入";

{

if(p==a) cout<<p->coef<<"*x 人"< <p_>exp;

else if(p->coef<0)cout<<p->coef<<"*x 人"< <p_>exp;

else if(p->coef<0)

else if(p->coef>0) cout<<"+"<<p->coef<<"*x 人"< <p_>exp;

p=p->n ext;

}

cout<<e ndl;

}

node *plus_fu n(node *a,node *b)

{

node *c,*p,*q,*r,*w;

float x;

p=a;

q=b;

c=a;

r=c;

while(p&&q)

{

if((p->exp)<(q->exp))

{

w=p;

p=p->n ext;

r->n ext=w;

r=w;

} else if(p->exp==q->exp) x=p_>coef+q_>coef;

if(x!=O)

{

p->coef=x; w=p;

p=p->n ext; r->n ext=w; r=w;

w=q; q=q_>n ext; delete w;

}

else if(x==0)

{

w=p;

p=p->n ext; delete w;

w=q; q=q_>n ext; delete w;

}

else if(p_>exp>q_>exp) {

w=q;

q=q_>n ext;

r->n ext=w; r=w;

}

}

if(p!=NULL)

{

while(p)

{

w=p;

p=p->n ext;

r->n ext=w; r=w;

}

}

if(q!=NULL)

{

while(q)

{

w=q;

q=q_>n ext;

r->n ext=w;

r=w;

}

}

r->n ext=NULL;

return c;

}

int mai n()

{

node *a,*b,*c;

int n=1;

while( n)

{

--"<<endl;"<<e ndl;"<<e ndl;cout<<endl<<"

--"<<endl;

"<<e ndl;

"<<e ndl;

cout<<e ndl<<" 请输入第一个多项式的系数和指数

a=in_fu n();

cout<<e ndl<<" 您所输入的多项式为 "<<e ndl;

out_fu n( a);

cout<<e ndl<<" 请输入第二个多项式的系数和指数

b=in_fu n();

cout<<e ndl<<" 您所输入的多项式为 "<<e ndl;

out_fun (b);

cout<<e ndl<<" 初始化完毕,两多项式相加得 "<<e ndl;

c=plus_fu n( a,b);

out_fu n(c);

cout<<"继续初始化多项式请输入 1,停止请输入0

cin?n;

cout<<e ndl;

while( n!=1&&n !=0)

{

cout<<"输入错误,请重新输入:";

cin?n;

}

cout<<e ndl;

}

return 0;

}