zoukankan      html  css  js  c++  java
  • [DataStructure]多项式加法与乘法--B.链表存储(适用于零元系数多的多项式)

    数据结构大作业……

    发出来大家乐呵乐呵……

    一、问题描述

    给出N个多项式,求他们的和与积

    二、解题报告

    基本思想:加法和乘法都是把得数项直接链接在链表后面,最后统一做一个Merge&Sort工作即可。方便又快捷。

    (1)建立存储结构

    1 struct _Poly
    2 {
    3     int factor;//系数
    4     int Index;//
    5     struct _Poly* next;//下一节点
    6 };
    7 _Poly* poly[MAXTIMES+1];
    8 int Sum[MAXTIMES+1]; //每一个多项式所含项数

    (2)主程序架构

     1 int main()
     2 {    int n;
     3     cout<<"请输入要做运算的多项式数量"<<endl;
     4     cin>>n;
     5     for (int i=0;i<=n+1;++i)   Init_Poly(i);
     6 for (int i=1;i<=n;++i)     Input_Data(i);
     7 /*TaskMgr,任务判断*/                                                                                                                                                                                                                                                                                                   cout<<"请输入你要进行什么类型的运算?1为加法,2为乘法:"<<endl;;
     8     cin>>Sum[0]; 
     9     if (Sum[0]==1)
    10 {    cout<<"f(x)="; 
    11 poly[0]=poly[1];
    12         for (int i=2;i<=n;++i)  Plus_Poly(poly[0], poly[i]);//加法
    13         Output_Poly(poly[0]);///Output加法结果
    14         cout<<""<<endl;
    15     }
    16     else if (Sum[0]==2)
    17     {   cout<<"f(x)=";
    18         poly[0]=poly[1];
    19         for (int i=2;i<=n;++i)  Multiply_Poly(poly[0], poly[i]);//乘法
    20         Output_Poly(poly[0]);///Output乘法结果
    21         cout<<""<<endl;
    22 }    return 0;
    23 }

    (3)初始化模块Init_Po  ly(int i);

    1 void Init_Poly(int i)
    2 {
    3      poly[i]=NULL;
    4      poly[i]=new _Poly;
    5      poly[i]->next=NULL;
    6 }

    (4)插入结点Insert_Node(_Poly* Poly0,_Poly* node);

     1 int Insert_Node(_Poly* poly0, _Poly* node)
     2 {
     3     while( poly0->next!=NULL )
     4         poly0=poly0->next;///遍历至表尾
     5     poly0->next=new _Poly;
     6     poly0=poly0->next;
     7     poly0->factor=node->factor;
     8     poly0->Index=node->Index;
     9     poly0->next=NULL;
    10     return 0;
    11 } 

    (5)删除结点Delete_Poly(_Poly** Poly0);

     1 int Delete_Poly(_Poly** poly0)
     2 {
     3     _Poly* tmp=NULL;
     4     while( NULL!=*poly0 )
     5     {
     6         tmp=*poly0;
     7         *poly0=(*poly0)->next;
     8         delete tmp;
     9     }
    10     return 0;
    11 }
    12

    (6)输入模块Input_Poly(int i);

    1 P.S. cout<<"----------------读入方式说明---------------"<<endl;
    2     cout<<"输入幂次和对应系数,常数项幂次为0"<<endl;
    3     cout<<"如对f(x)=x^5+x^2-54x+65"<<endl;
    4     cout<<"请输入:4"<<endl;
    5     cout<<"       1 5"<<endl;
    6     cout<<"       1 2"<<endl;
    7     cout<<"       -54 1"<<endl;
    8     cout<<"       65 0"<<endl;
     1 void Input_Data(int i)
     2 {
     3     _Poly data;
     4     cout<<"请输入第"<<i<<"个多项式项数:"<<endl;;
     5     cin>>Sum[i];
     6     cout<<"请分别输入多项式1各项的系数和幂数,中间用空格隔开:"<<endl;;
     7     for( int j=1; j<=Sum[i]; ++j)
     8     {
     9         cin>>data.factor>>data.Index;
    10         Insert_Node(poly[i], &data);
    11     }
    12     cout<<"f"<<i<<"(x)=";
    13     Output_Poly(poly[i]);
    14 } 

    (7)输出模块Output_Data(_Poly Poly0);

     1 int Output_Poly(_Poly* poly0)
     2 {
     3     if( poly0->next->Index!=0 )
     4     {
     5         if (poly0->next->factor!=1) cout<<poly0->next->factor;
     6         cout<<"x";
     7         if (poly0->next->Index!=1) cout<<'^'<<poly0->next->Index;
     8     }
     9     else
    10         cout<<poly0->next->factor;
    11     if (poly0->next->next!=NULL && poly0->next->next->factor>0) cout<<'+';
    12 poly0=poly0->next;
    13     while( NULL!=poly0->next )
    14     {
    15         if( poly0->next->factor>0 )
    16         {
    17             if( poly0->next->Index==0 )
    18                 cout<<poly0->next->factor;
    19             else
    20             {
    21                 if (poly0->next->factor!=1) cout<<poly0->next->factor;
    22                 cout<<"x";
    23                 if (poly0->next->Index!=1) cout<<'^'<<poly0->next->Index;
    24             }
    25         }
    26         else if( poly0->next->factor<0 )
    27         {
    28             if( poly0->next->Index==0 )
    29             {
    30                 if( poly0->next->factor!=0 )
    31                     cout<<poly0->next->factor;
    32             }
    33             else
    34              {
    35                 if (poly0->next->factor!=1) cout<<poly0->next->factor;
    36                 cout<<"x";
    37                 if (poly0->next->Index!=1) cout<<'^'<<poly0->next->Index;
    38              }
    39         }
    40         if (poly0->next->next!=NULL && poly0->next->next->factor>0) cout<<'+';
    41         poly0=poly0->next;
    42     }
    43     cout<<endl;
    44     return 0;
    45 }
    46

    (8)加法模块Plus_Poly(_Poly* poly1, _Poly* poly2);//////完了完了我大作业这句标题写错了

     1 ///预处理,先把两个链表相连,其他操作见后Merge_Poly();
     2 int Plus_Poly(_Poly* poly1, _Poly* poly2)
     3 {
     4     _Poly* head=poly1;
     5     while( poly1->next!=NULL )
     6         poly1=poly1->next;
     7     poly1->next=poly2->next;///将Poly2全部添加到Poly1后
     8     Merge_Poly(head);///合并同类项
     9     poly[0]=head;
    10     return 0;
    11 } 

    (9)乘法模块Multiply_Poly(int Sum);

     1 ///将新乘出的元素加在链表后面,待进一步Merge&Sort进行运算
     2 int Multiply_Poly(_Poly* poly1, _Poly* poly2)
     3 {
     4     _Poly data;
     5     _Poly *poly0=NULL;
     6     _Poly* head1=poly1;
     7     _Poly* head2=poly2;
     8     poly0=new _Poly;
     9     poly0->next=NULL;
    10     while( poly1->next!=NULL )
    11     {
    12         while( poly2->next!=NULL )
    13         {
    14             data.factor=(poly1->next->factor)*(poly2->next->factor);
    15             data.Index=(poly1->next->Index)+(poly2->next->Index);
    16             data.next=NULL;
    17             Insert_Node(poly0, &data);///新求得元素插入
    18             poly2=poly2->next;
    19         }
    20         poly2=head2;
    21         poly1=(poly1)->next;
    22     }//OutputPoly(pNew);
    23     Merge_Poly(poly0);///合并同类项
    24     poly[0]=poly0;
    25     Delete_Poly(&head1);
    26     Delete_Poly(&head2);
    27     return 0;
    28 } 

    (10)合并同类项,并排序Merge_Poly(_Poly* Poly0);

    本函数承接乘法和加法未完成事业,并为输出打下基础。

    是本程序核心代码之一。

     1 int Merge_Poly(_Poly* poly0)
     2 {    int sorted=0;   ///标记可合并元素
     3     _Poly* node;
     4     _Poly* tmp;
     5     _Poly* const head=poly0;
     6     if( NULL==poly0 ) return -1;
     7     node=head->next;
     8     head->next=NULL;
     9     while( node!=NULL )
    10     {
    11         sorted=0;
    12         poly0=head;
    13         while( poly0->next!=NULL )
    14         {
    15             if( node->Index==poly0->next->Index )  ///如果是幂数相同,则合并系数
    16             {
    17                 poly0->next->factor+=node->factor;
    18                 node=node->next;
    19                 sorted=1;
    20                 break;
    21             }
    22             else if((node->Index) > (poly0->next->Index)) ///如果幂数大,转移该项至前
    23             {
    24                 tmp=node;
    25                 node=node->next;
    26                 tmp->next=poly0->next;
    27                 poly0->next=tmp;
    28                 sorted=1;
    29                 break;
    30             }
    31             poly0=poly0->next;
    32         }/*while2*/
    33         if( sorted==0 )///该项已无可合并项
    34         {
    35             tmp=node;
    36             node=node->next;
    37             poly0->next=tmp;
    38             tmp->next=NULL;
    39         }
    40     }/*while*/
    41     return 0;
    42 }

    (11)完整代码

      1 /*
      2    By
      3      Iris.Catch-22.S、`
      4      Dept. of Mathematics,
      5      School of Science,
      6      HIT
      7    November,2015
      8 */
      9 #include<iostream>
     10 #define MAXTIMES 110
     11 using namespace std;
     12 void CopyRight()
     13 {
     14    cout<<"------------By ICS,HIT,2015/11-------------"<<endl;
     15    cout<<"--------多项式加法、乘法计算(链表)---------"<<endl;
     16    cout<<"------------------Ver 0.9------------------"<<endl;
     17 
     18 }
     19 struct _Poly
     20 {
     21     int factor;//系数
     22     int Index;//
     23     struct _Poly* next;//下一节点
     24 };
     25 /*定义*/
     26 _Poly* poly[MAXTIMES+1];
     27 int Sum[MAXTIMES+1];
     28 
     29 /*初始化Poly1、Poly2*/
     30 void Init_Poly(int i)
     31 {
     32      poly[i]=NULL;
     33      poly[i]=new _Poly;
     34      poly[i]->next=NULL;
     35 }
     36 /*插入节点*/
     37 int Insert_Node(_Poly* poly0, _Poly* node)
     38 {
     39     while( poly0->next!=NULL )
     40         poly0=poly0->next;///遍历至表尾
     41     poly0->next=new _Poly;
     42     poly0=poly0->next;
     43     poly0->factor=node->factor;
     44     poly0->Index=node->Index;
     45     poly0->next=NULL;
     46     return 0;
     47 }
     48 /*删除链表*/
     49 int Delete_Poly(_Poly** poly0)
     50 {
     51     _Poly* tmp=NULL;
     52     while( NULL!=*poly0 )
     53     {
     54         tmp=*poly0;
     55         *poly0=(*poly0)->next;
     56         delete tmp;
     57     }
     58     return 0;
     59 }
     60 /*输出多项式*/
     61 int Output_Poly(_Poly* poly0)
     62 {
     63     if( poly0->next->Index!=0 )
     64     {
     65         if (poly0->next->factor!=1) cout<<poly0->next->factor;
     66         cout<<"x";
     67         if (poly0->next->Index!=1) cout<<'^'<<poly0->next->Index;
     68     }
     69     else
     70         cout<<poly0->next->factor;
     71     if (poly0->next->next!=NULL && poly0->next->next->factor>0) cout<<'+';
     72     poly0=poly0->next;
     73     while( NULL!=poly0->next )
     74     {
     75         if( poly0->next->factor>0 )
     76         {
     77             if( poly0->next->Index==0 )
     78                 cout<<poly0->next->factor;
     79             else
     80             {
     81                 if (poly0->next->factor!=1) cout<<poly0->next->factor;
     82                 cout<<"x";
     83                 if (poly0->next->Index!=1) cout<<'^'<<poly0->next->Index;
     84             }
     85         }
     86         else if( poly0->next->factor<0 )
     87         {
     88             if( poly0->next->Index==0 )
     89             {
     90                 if( poly0->next->factor!=0 )
     91                     cout<<poly0->next->factor;
     92             }
     93             else
     94              {
     95                 if (poly0->next->factor!=1) cout<<poly0->next->factor;
     96                 cout<<"x";
     97                 if (poly0->next->Index!=1) cout<<'^'<<poly0->next->Index;
     98              }
     99         }
    100         if (poly0->next->next!=NULL && poly0->next->next->factor>0) cout<<'+';
    101         poly0=poly0->next;
    102     }
    103     cout<<endl;
    104     return 0;
    105 }
    106 void Input_Data(int i)
    107 {
    108     _Poly data;
    109     cout<<"请输入第"<<i<<"个多项式项数:"<<endl;;
    110     cin>>Sum[i];
    111     cout<<"请分别输入多项式1各项的系数和幂数,中间用空格隔开:"<<endl;;
    112     for( int j=1; j<=Sum[i]; ++j)
    113     {
    114         cin>>data.factor>>data.Index;
    115         Insert_Node(poly[i], &data);
    116     }
    117     cout<<"f"<<i<<"(x)=";
    118     Output_Poly(poly[i]);
    119 }
    120 /*系数合并,降幂排列*/
    121 int Merge_Poly(_Poly* poly0)
    122 {
    123     int sorted=0;   ///标记可合并元素
    124     _Poly* node;
    125     _Poly* tmp;
    126     _Poly* const head=poly0;
    127     if( NULL==poly0 ) return -1;
    128     node=head->next;
    129     head->next=NULL;
    130     while( node!=NULL )
    131     {
    132         sorted=0;
    133         poly0=head;
    134         while( poly0->next!=NULL )
    135         {
    136             if( node->Index==poly0->next->Index )  ///如果是幂数相同,则合并系数
    137             {
    138                 poly0->next->factor+=node->factor;
    139                 node=node->next;
    140                 sorted=1;
    141                 break;
    142             }
    143             else if((node->Index) > (poly0->next->Index)) ///如果幂数大,转移该项至前
    144             {
    145                 tmp=node;
    146                 node=node->next;
    147                 tmp->next=poly0->next;
    148                 poly0->next=tmp;
    149                 sorted=1;
    150                 break;
    151             }
    152             poly0=poly0->next;
    153         }/*while2*/
    154         if( sorted==0 )///该项已无可合并项
    155         {
    156             tmp=node;
    157             node=node->next;
    158             poly0->next=tmp;
    159             tmp->next=NULL;
    160         }
    161     }/*while*/
    162     return 0;
    163 }
    164 /*多项式加法*/
    165 int Plus_Poly(_Poly* poly1, _Poly* poly2)
    166 {
    167     _Poly* head=poly1;
    168     while( poly1->next!=NULL )
    169         poly1=poly1->next;
    170     poly1->next=poly2->next;///将Poly2全部添加到Poly1后
    171     Merge_Poly(head);///合并同类项
    172     poly[0]=head;
    173     return 0;
    174 }
    175 /*多项式乘法*/
    176 int Multiply_Poly(_Poly* poly1, _Poly* poly2)
    177 {
    178     _Poly data;
    179     _Poly *poly0=NULL;
    180     _Poly* head1=poly1;
    181     _Poly* head2=poly2;
    182     poly0=new _Poly;
    183     poly0->next=NULL;
    184     while( poly1->next!=NULL )
    185     {
    186         while( poly2->next!=NULL )
    187         {
    188             data.factor=(poly1->next->factor)*(poly2->next->factor);
    189             data.Index=(poly1->next->Index)+(poly2->next->Index);
    190             data.next=NULL;
    191             Insert_Node(poly0, &data);///新求得元素插入
    192             poly2=poly2->next;
    193         }
    194         poly2=head2;
    195         poly1=(poly1)->next;
    196     }
    197     //OutputPoly(pNew);
    198 
    199     Merge_Poly(poly0);///合并同类项
    200     poly[0]=poly0;
    201     Delete_Poly(&head1);
    202     Delete_Poly(&head2);
    203     return 0;
    204 }
    205 int main()
    206 {
    207     CopyRight();
    208     /*Init*/
    209     int n;
    210     cout<<"请输入要做运算的多项式数量"<<endl;
    211     cin>>n;
    212     for (int i=0;i<=n+1;++i)
    213        Init_Poly(i);
    214 
    215     cout<<"----------------读入方式说明---------------"<<endl;
    216     cout<<"输入幂次和对应系数,常数项幂次为0"<<endl;
    217     cout<<"如对f(x)=x^5+x^2-54x+65"<<endl;
    218     cout<<"请输入:4"<<endl;
    219     cout<<"       1 5"<<endl;
    220     cout<<"       1 2"<<endl;
    221     cout<<"       -54 1"<<endl;
    222     cout<<"       65 0"<<endl;
    223     cout<<"-------------------------------------------"<<endl;
    224     /*InputData*/
    225     for (int i=1;i<=n;++i)
    226         Input_Data(i);
    227     /*TaskMgr*/
    228     cout<<"请输入你要进行什么类型的运算?1为加法,2为乘法:"<<endl;;
    229     cin>>Sum[0];
    230     if (Sum[0]==1)
    231     {
    232         cout<<"f(x)=";
    233         poly[0]=poly[1];
    234         for (int i=2;i<=n;++i)
    235            Plus_Poly(poly[0], poly[i]);
    236         Output_Poly(poly[0]);///Output
    237         cout<<""<<endl;
    238     }
    239     else if (Sum[0]==2)
    240     {
    241         cout<<"f(x)=";
    242         poly[0]=poly[1];
    243         for (int i=2;i<=n;++i)
    244            Multiply_Poly(poly[0], poly[i]);
    245         Output_Poly(poly[0]);///Output
    246         cout<<""<<endl;
    247     }
    248     return 0;
    249 }
    250

    半吊子水平的链表……见笑了、欢迎神犇帮忙指正

    --------Done By Iris.Catch-22.S、`

  • 相关阅读:
    C++疑难杂症
    程序中的错误、异常处理框架设计
    客户端ARPG角色行为模型
    http协议
    MySQL数据库开发(2)
    MySQL数据库开发(1)
    网络编程进阶及并发编程
    网络编程-SOCKET开发
    面向对象编程
    常用模块
  • 原文地址:https://www.cnblogs.com/Catch-22/p/5092713.html
Copyright © 2011-2022 走看看