链表实现多项式相乘-数据结构学习

链表实现多项式相乘<线性表>

初学数据结构,我这个菜鸟 没看教程完全自己想. 这个题做好了好久. 不过还好总于做出来了. 

  先上代码,代码里有注释. 可以把注释变为cout<<注释  看一下向乘的过程.

    后面再做详细的补充说明

问题描述 :

  输入两个多项式,多项式的第一个数是项数.后续是两两一对,一个系数,一个指数. 多项式有序,按照系数的降序. 通过单链表实现两个多项式相乘. 输出结果多项式.同样第一项为项的个数, 后续安装指数降序排列.

要通过链表实现.

解决思路:

  初始时把两个多项式的第一项存下来,这就是结果多项式的第一项.因为有序的原因,后面的都没有这一项的指数大,因此不用考虑这一项的本位相加和向前插入.之后遍历链表每一项,三个基本过程,本位相加,向前插入,向后插入.就实现了,两个多项式相乘,这个新构建的链表就是结果多项式.

上代码:

  1 #include<iostream>
  2 #define ends " ";  //linux ends不输出
  3 using namespace std;
  4 
  5 typedef struct polynomial
  6 {
  7     int coef; //项的系数
  8     int index; //指数
  9     polynomial * next;
 10 }term,*pTerm;
 11 
 12 pTerm creatterm();
 13 void showterm(pTerm);
 14 pTerm mult(pTerm,pTerm);
 15 
 16 int main(){
 17     pTerm term1,term2,termAns;
 18     term1=creatterm();
 19     term2=creatterm();
 20     cout<<"输入的两个多项式分别是:"<<endl;
 21     showterm(term1);
 22     showterm(term2);
 23     cout<<"结果是:"<<endl;
 24     termAns=mult(term1,term2);
 25     showterm(termAns);
 26     return 0;
 27 }
 28 //建立多项式
 29 pTerm creatterm(){
 30     int val,m,c,f;
 31     pTerm phead, ptail;
 32     phead = (pTerm)malloc(sizeof(term));
 33     ptail=phead;
 34     ptail->next=NULL;
 35     cout<<"输入多项式的项数:";
 36     cin>>m;
 37     for(int i=0;i<m;i++){
 38         cin>>c>>f;
 39         pTerm pnew=(pTerm)malloc(sizeof(term));
 40         pnew->coef=c;
 41         pnew->index=f;
 42         ptail->next=pnew;
 43         pnew->next=NULL;
 44         ptail=pnew;
 45     }
 46     phead->coef=m;
 47     return phead;
 48 }
 49 //显示多项式的值
 50 void showterm(pTerm phead){
 51     pTerm p;
 52     p=phead->next;
 53     while(p!=NULL){
 54         cout<<p->coef <<" "<< p->index<<" ";
 55         p=p->next;
 56     }
 57     cout<<endl;
 58 }
 59 //多项式相乘
 60 pTerm mult(pTerm t1,pTerm t2){
 61     pTerm p1,p2,p,pre,phead;//第一个多项式 第二个多项式 工作节点指向当前的比较项 p的前一项 头节点
 62     int n=1;               //项数
 63     //分配空间
 64     p=(pTerm)malloc(sizeof(term));
 65     pre=(pTerm)malloc(sizeof(term));
 66     phead=(pTerm)malloc(sizeof(term));
 67     p1=t1->next;  //第一个多项式的第一项
 68     p2=t2->next;  //第二个多项式的第一项
 69     //p初始化为第一项
 70     p->coef=p1->coef*p2->coef;
 71     p->index=p1->index+p2->index;
 72     p->next=NULL;
 73     pre->next=p;
 74     phead->next=p;
 75     //循环遍历处理每一项
 76     while(p1!=NULL){
 77         p2=t2->next;
 78         while(p2!=NULL){
 79            p=phead->next;
 80            pTerm pnew=(pTerm)malloc(sizeof(term));
 81            pnew->coef=p1->coef*p2->coef;
 82            pnew->index=p1->index+p2->index;
 83            pnew->next=NULL;
 84            for(int i=0;i<t1->coef*t2->coef;i++)
 85             {
 86                 if(p->index==pnew->index){ //本位相加
 87                     if(n==1) break;  //第一项已有直接退出循环
 88                     else{p->coef+=pnew->coef;
 89                     n++;
 90                     break;}
 91                 }else if(p->index>pnew->index){
 92                     pre=p;
 93                     if(p->next==NULL) {  //向后插入
 94                         p->next=pnew;
 95                         n++;
 96                         break;
 97                     }
 98                     else p=p->next;
 99                 }else if(p->index<pnew->index) { //向前插入
100                     pre->next=pnew;
101                     pnew->next=p;
102                     pre=pnew;
103                     n++;
104                     break;
105                 } 
106             }
107             p2=p2->next;  //p2移动
108         }
109         p1=p1->next;    //p1移动
110     }
111     cout<<n<<" ";  //输出项数
112     return phead;
113 }

 

posted @ 2019-03-22 15:14  Cherrison_Time  阅读(4031)  评论(0编辑  收藏  举报