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


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

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

      先上代码,代码里有注释. 可以把注释变为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 }
  • 相关阅读:
    net8:XML的读写操作【广告控件的XML文件实例】
    挺喜欢这个网站的
    问的问题的答案~
    zookeeper集群搭建
    solrCloud简介
    e3商城_day07
    solrj实现增删查
    solr后台管理界面-数据导入
    solr后台管理界面-增删改
    s5p6818 从SD卡启动程序(制作SD启动卡)
  • 原文地址:https://www.cnblogs.com/Cherrison-Time/p/10578408.html
Copyright © 2020-2023  润新知