zoukankan      html  css  js  c++  java
  • C++一元多项式相加

    实验名称:一元多项式相加
      1 // multiply.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include<iostream>
      6 #include "stdio.h"
      7 using namespace std;
      8 
      9 
     10 /***********************定义多形式的数据结构*************************/
     11 typedef struct Node
     12 {
     13   int coef;      //多项式系数
     14   int exp;         //多项式指数
     15   struct Node *next;//指向下一项的指针
     16 } Node,*LinkList;   //定义了一个Node型指针的别名LinkList;
     17 
     18 /***********************多项式初始化*************************/
     19 void initpoly (LinkList &px)
     20 {
     21    px = new Node;
     22    px ->next = NULL;
     23 }
     24 
     25 /***********************多项式创建*************************/
     26 void creatpoly (LinkList &px,int n )
     27 {
     28     LinkList p=NULL,q=NULL;  //q是用来开辟空间的。
     29     p = px;      //p是用来存储整个链表的。    这里px相当于一个全局的指针变量一样。
     30     for(int i = 0; i < n; i++)
     31     {
     32         q = new Node;
     33         cout << "请输入第" << i << "项的系数:"<< endl;
     34         cin >> q ->coef;
     35         cout << "请输入第" << i << "项的指数:"<< endl;
     36         cin >> q ->exp;
     37         q ->next = NULL;
     38         p ->next = q;//链表向前一直在扩大。
     39         p = q;
     40     }
     41 }
     42 
     43 
     44 int lengthpoly(LinkList &px) //计算多项式的项数。
     45 {
     46     LinkList p = NULL;
     47     int count = 0;
     48     p = px ->next;
     49     while(p != NULL)
     50     {
     51         p = p ->next;
     52         count++;
     53     }
     54     return count;
     55 }
     56 /***********************多项式输出*************************/
     57 void outputpoly(LinkList &px)
     58 {
     59     LinkList p = NULL;
     60     p = px ->next;
     61     for(int i = 0;i < lengthpoly(px);i++)
     62     {
     63         cout << p ->coef << "*X^" << p->exp << "+";
     64         p = p ->next;
     65     }
     66     cout << "0" << endl;
     67 }
     68 /***********************多项式相加*************************/
     69 //void addpoly(LinkList &pa,LinkList &pb,LinkList &pc)
     70 //{
     71 //    LinkList la=NULL,lb=NULL,lc=NULL,r=NULL;
     72 //    la = pa ->next;
     73 //    lb = pb ->next;
     74 //    lc = pc;     //prep是用来存储整个a+b的链表的。
     75 //    while(la&&lb)//a与b其中一个不为0
     76 //    {
     77 //        if(la ->exp < lb ->exp)  //a的指数小
     78 //        {
     79 //            r = new Node;
     80 //            r ->coef = la ->coef;
     81 //            r ->exp = la ->exp;
     82 //            lc ->next = r;
     83 //            lc = r;
     84 //            r ->next = NULL;
     85 //            la = la ->next;
     86 //        }
     87 //        else if(la ->exp > lb ->exp)
     88 //        {
     89 //            r = new Node;
     90 //            r ->coef = lb ->coef;
     91 //            r ->exp = lb ->exp;
     92 //            lc ->next = r;
     93 //            r ->next = NULL;
     94 //           lc = r;
     95 //           lb = lb ->next;
     96 //        }
     97 //        else
     98 //        {
     99 //            int sum = la ->coef + lb ->coef;
    100 //            if(sum != 0)
    101 //            {
    102 //                r = new Node;
    103 //                r ->coef = sum;
    104 //                r ->exp = la ->exp;
    105 //                lc ->next = r;
    106 //                r ->next = NULL;
    107 //                lc = r;
    108 //                la = la ->next;
    109 //                lb = lb ->next;
    110 //            }
    111 //            else 
    112 //            {
    113 //                la = la ->next;
    114 //                lb = lb ->next;
    115 //            }
    116 //        }
    117 //
    118 //    }
    119 //    while(la != NULL)  
    120 //        {
    121 //            r = new Node;
    122 //            r ->coef = la ->coef;
    123 //            r ->exp = la ->exp;
    124 //            lc ->next = r;
    125 //            lc = r;
    126 //            r ->next = NULL;
    127 //            la = la ->next;
    128 //        }
    129 //   while(lb != NULL)
    130 //        {
    131 //            r = new Node;
    132 //            r ->coef = lb ->coef;
    133 //            r ->exp = lb ->exp;
    134 //            lc ->next = r;
    135 //            lc = r;
    136 //            r ->next = NULL;
    137 //            lb = lb ->next;
    138 //        }
    139 //}
    140 
    141 Node * addDuoX(LinkList &Pa,LinkList &Pb)//关键部分,A与B相加
    142 {
    143     Node *p,*q;
    144     Node *prep;
    145     Node *u;
    146  
    147     p = Pa->next;
    148     q = Pb->next;
    149  
    150     prep=Pa;
    151  
    152     while (p&&q)//A与B都不等于0
    153     {
    154         if(p->exp<q->exp)//A的指数小于B的指数
    155         {
    156             prep=p; 
    157             p=p->next;
    158         }
    159         else if(p->exp > q->exp)//A的指数大的话
    160         {
    161             u=q->next;
    162             
    163             q->next=p;
    164             prep->next=q;
    165             
    166             prep=q;
    167             q=u;
    168         }
    169         else//A与B的指数相等的话
    170         {
    171             p->coef=p->coef+q->coef;
    172             if(p->coef==0)//A与B的指数相等的话,且其中A的系数为0
    173             {
    174                 Node *temp1;
    175                 Node *temp2;
    176                 temp1=p;
    177                 temp2=q;
    178                 prep->next=p->next;//删除该项数
    179                 p=p->next;
    180                 q=q->next;
    181                 
    182                 delete temp1;
    183                 delete temp2;
    184             }
    185             else//A与B的指数相等的话,且其中A的系数为0,B的系数为0
    186             {
    187                 Node *temp2;
    188                 temp2=q;
    189  
    190                 prep=p;
    191                 p=p->next;
    192                 q=q->next;
    193                 delete temp2;
    194             }
    195         }
    196     }
    197     if(q)
    198         prep->next=q;
    199  
    200     delete Pb;
    201     return Pa;
    202 }
    203 
    204 
    205 //再做一个小的处理,先合并同类型。对指数相同的进行相加,并删去其中一个,合并同类项
    206 void hebing(Node *px)
    207 {
    208     Node *p = NULL,*q = NULL;
    209     p = px ->next;
    210     q = new Node;
    211     while(p->next!=NULL)
    212     {
    213         q = p ->next;
    214         if(p ->exp == q ->exp)
    215         {
    216             p ->coef = p->coef + q->coef;
    217             p -> next = q -> next;
    218              //p 不在受q约束,一直不受其约束。
    219             delete(q);
    220         }
    221         p = p ->next; 
    222     }
    223 }
    224 /*** 程序中用了选择排序 ***/
    225 void paixu(Node *px)   
    226 {
    227     //用选择排序怎么做
    228     Node *p = NULL,*q = NULL;
    229     p = px ->next; //此时开辟了内存空间。
    230     q = px ->next;
    231     int temp; //注:类初始化化时需要加上(),而结构体初始化不需要。
    232     for(p ;p!= NULL;p = p ->next)  //这玩意就相当于i++,
    233     {
    234         for(q = p ->next; q!= NULL; q = q ->next ) //为什么不用q -> next,因为q = p -> next 了。
    235         {
    236             if(p ->exp > q ->exp)   //我真是弄错啦,我现在只需要把结点里面的值换掉就行了,何必换掉整个的结点,这样位置肯定出问题。
    237             {
    238                 temp = p ->exp;
    239                 p ->exp = q ->exp;
    240                 q ->exp = temp;
    241 
    242                 temp = p ->coef;
    243                 p ->coef= q ->coef;
    244                 q ->coef = temp;
    245             }
    246         }
    247     }
    248 }
    249 
    250 
    251 int main()
    252 {
    253     LinkList pa = NULL,pb = NULL,pc = NULL;
    254     initpoly(pa);
    255     initpoly(pb);
    256     initpoly(pc);
    257     int a,b;
    258     
    259     cout << "输入第一个多项式的项数:"<<endl;
    260     cin >> a;
    261     cout << "输入第二个多项式的项数:"<<endl;
    262     cin >> b; 
    263     cout << "请按升序输入:"<<endl;
    264     cout << "请输入第一个多项式的系数与指数"<<endl;
    265     creatpoly(pa,a);
    266     hebing(pa);
    267     paixu(pa);
    268     outputpoly(pa);
    269     cout << "请按升序输入:"<<endl;
    270     cout << "请输入第二个多项式的系数与指数"<<endl;
    271     creatpoly(pb,b);
    272     paixu(pb);
    273     outputpoly(pb);
    274     //addpoly(pa,pb,pc);
    275     pc = addDuoX(pa,pb);
    276     outputpoly(pc);
    277     cin >> b;
    278     delete(pa);
    279     delete(pb);
    280     delete(pc);
    281     return 0;
    282 }
     

    实验目的:练习并掌握如何使用C++语言实现链表的说明、创建等操作。

    实验要求:能实现一元多项式的输入、输出,以及两个一元多项式相加及结果显示。(具体内容请参照数据结构实验内容)

    实验步骤及内容

    1、首先建立一个定义多项式的结构体Node,及结构体指针LinkList,该结构体包含一个指数exp,一个系数coef,一个指向下一项的指针*next,代码如下:

        typedef struct Node

    {

      int coef;      //多项式系数

      int exp;         //多项式指数

      struct Node *next;//指向下一项的指针

    } Node,*LinkList;   //定义了一个Node型指针的别名LinkList;

    2、初始化多项式,代码如下:

      void initpoly (LinkList &px)

    {

       px = new Node;

       px ->next = NULL;

    }

    3、建立多项式,用来指导用户输入程序运行时所需要的必须得数据,两个一元多项式的项数、系数、指数。具体的代码如下:

         void creatpoly (LinkList &px,int n )

    {

        LinkList p=NULL,q=NULL;  //q是用来开辟空间的。

        p = px;      //p是用来存储整个链表的。

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

        {

            q = new Node;

            cout << "请输入第" << i << "项的系数:"<< endl;

            cin >> q ->coef;

            cout << "请输入第" << i << "项的指数:"<< endl;

            cin >> q ->exp;

            q ->next = NULL;

            p ->next = q;

            p = q;

        }

    }

    4、求一个多形式的长度,主要用来获取一个多形式的长度,便于输出。

       int lengthpoly(LinkList &px) //计算多项式的项数

    {

        LinkList p = NULL;

        int count = 0;

        p = px ->next;

        while(p != NULL)

        {

            p = p ->next;

            count++;

        }

        return count;

    }

    5、输出多形式,此函数用来对多项式进行输出验证。

       void outputpoly(LinkList &px)

    {

        LinkList p = NULL;

        p = px ->next;

        for(int i = 0;i < lengthpoly(px);i++)

        {

            cout << p ->coef << "^" << p->exp << "+";

            p = p ->next;

        }

        cout << "0" << endl;

    }

    6、多项式相加,输出也是按序排列。当两个多项式都不为0时,进行相加,然后剩下的部分直接赋给相加后的多项式,前提是输入的多形式必须是按顺序排列的。代码如下:

        void outputpoly(LinkList &px)

    {

        LinkList p = NULL;

        p = px ->next;

        for(int i = 0;i < lengthpoly(px);i++)

        {

            cout << p ->coef << "*X^" << p->exp << "+";

            p = p ->next;

        }

        cout << "0" << endl;

    }

     

    void addpoly(LinkList &pa,LinkList &pb,LinkList &pc)

    {

        LinkList la=NULL,lb=NULL,lc=NULL,r=NULL;

        la = pa ->next;

        lb = pb ->next;

        lc = pc;     //prep是用来存储整个a+b的链表的。

        while(la&&lb)//a与b其中一个不为

        {

            if(la ->exp < lb ->exp)  //a的指数小

            {

                r = new Node;

                r ->coef = la ->coef;

                r ->exp = la ->exp;

                lc ->next = r;

                lc = r;

                r ->next = NULL;

                la = la ->next;

            }

            else if(la ->exp > lb ->exp)

            {

                r = new Node;

                r ->coef = lb ->coef;

                r ->exp = lb ->exp;

                lc ->next = r;

                r ->next = NULL;

               lc = r;

               lb = lb ->next;

            }

            else

            {

                int sum = la ->coef + lb ->coef;

                if(sum != 0)

                {

                    r = new Node;

                    r ->coef = sum;

                    r ->exp = la ->exp;

                    lc ->next = r;

                    r ->next = NULL;

                    lc = r;

                    la = la ->next;

                    lb = lb ->next;

                }

                else

                {

                    la = la ->next;

                    lb = lb ->next;

                }

            }

     

        }

        while(la != NULL) 

            {

                r = new Node;

                r ->coef = la ->coef;

                r ->exp = la ->exp;

                lc ->next = r;

                lc = r;

                r ->next = NULL;

                la = la ->next;

            }

       while(lb != NULL)

            {

                r = new Node;

                r ->coef = lb ->coef;

                r ->exp = lb ->exp;

                lc ->next = r;

                lc = r;

                r ->next = NULL;

                lb = lb ->next;

            }

    }

    7、主函数代码如下,为了便于交互,所以增加了好些用户提示符:

        int main()

    {

        LinkList pa = NULL,pb = NULL,pc = NULL;

        initpoly(pa);

        initpoly(pb);

        initpoly(pc);

        int a,b;

        cout << "输入第一个多项式的项数:"<<endl;

        cin >> a;

        cout << "输入第二个多项式的项数:"<<endl;

        cin >> b;

        cout << "请输入第一个多项式的系数与指数"<<endl;

        creatpoly(pa,a);

        cout << "请输入第二个多项式的系数与指数"<<endl;

        creatpoly(pb,b);

        addpoly(pa,pb,pc);

        outputpoly(pc);

        cin >> b;

        delete(pa);

        delete(pb);

        delete(pc);

        return 0;

    }

     当然我们可以在人性化一点,加上while实现,连续操作。

    实验总结:

    1、刚开始编的时候,老是出现不能访问内存错,说是没有初始化,不能访问。通过查找资料发现,在开辟一个新节点时,必须给其开辟空间,在c++里面用new语句,在c中用malloc语句即可。在定义结构体指针的时候,最好给其赋值为空,谨防出现野指针的情况。

    2、  多项式相加的函数中,定义了一个返回LinkList的返回值,不过一直出错,直到我把返回值去掉的时候,才不会出错,具体什么原因,我现在还不清楚。

  • 相关阅读:
    .net remoting学习(2)MarshalByRefObject与对象激活
    Android之旅Service
    Android之旅Handler与多线程
    Android之旅广播(BroadCast)
    .net remoting学习(3) 配置与服务端广播
    网址收藏
    Asp.net生命周期
    Android API 拦截系统短消息
    TCL脚本语言学习
    实现一个包含Microsoft.Advertising和SmartMad广告控件的UserControl
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3474772.html
Copyright © 2011-2022 走看看