• 办事指南
  • 创业起步
  • 企业管理
  • 市场营销
  • 开店指南
  • 创业之路
  • 创业故事
  • 互联网创业
  • 工商知识
  • 财务知识
  • 税务知识
  • 会计知识
  • 其它创业知识
  • 当前位置: 工作范文网 > 创业 > 其它创业知识 > 正文

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

    时间: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;

    }

    有关的专题