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

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

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

  先上代码,代码里有注释. 可以把注释变为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 }

原文地址:https://www.cnblogs.com/Cherrison-Time/p/10578408.html

时间: 2024-11-08 14:20:02

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

学习笔记:单链表实现多项式相乘(一)

单链表实现多项式相乘,有这样的一个思路可以参考: 实现多项式相乘,最关键的是系数和指数的两个数据,这里命名为coef和HighPower. 最简便的办法是使用两个嵌套循环例如(3x^2+4x^1)(x^2+2x^4)用3x^2遍历另外一个括号内的数据,同时实现本身括号内的遍历. 这个想法的核心程序可归纳为以下: while(pList!=NULL){ while(pList2!=NULL){ pNew=(PNODE)malloc(sizeof(NODE)); pNew->pNext=NULL;

单向链表实现多项式加和乘--自己写数据结构

用单项链表实现多项式数据结构和代码如下(由于时间原因多项式乘法的函数没用实现,读者可以在自己完善): 存放结构体的头文件polylist.h #ifndef _H_POLYLIST_ #define _H_POLYLIST_ typedef struct _Poly_Node { int ratio; //系数 int power; //幂 struct _Poly_Node* next; }Node,*pNode; typedef struct _Poly_List { struct _Pol

数据结构之利用单向链表实现多项式加法和乘法

在<数据结构与算法分析--c语言描述>一书中,作者指出了使用单向链表作为实现多项式的方法.但是没有给出具体实现.下面自己对其进行实现.只考虑功能.对其他细节不暂时不考虑.程序完成两个功能,使用单向链表完成多项式的加法和乘法.首先看加法,解决加法问题的思想在于对表示进行操作的两个链表表示的多项式按照指数递减的结构排列,每个节点的数据域存储着多项式某一项的系数(Coefficient)和指数(Exponent),还有一个指向后继节点的指针.节点的实现如下: 1 typedef struct Nod

链表_多项式相加相乘

加法部分运行成功.乘法仍存在问题,找机会解决,欢迎大家指正. 还有一个问题,C语言函数传地址如何传,是否不需要我这样多次申请内存空间?欢迎交流. 代码如下: 1 #include<stdio.h> 2 #include<malloc.h> 3 4 typedef struct PolyNode *Poly;//定义多项式结构体类型 5 struct PolyNode{ 6 int coef; 7 int expon; 8 struct PolyNode *next; 9 }; 10

文章分享:简单数据结构学习:单向链表

文章分享:简单数据结构学习:单向链表:https://www.textarea.com/aprikyb/jiandan-shujujiegou-xuexi-danxiang-lianbiao-252/

17、蛤蟆的数据结构笔记之十七链表实现多项式

17.蛤蟆的数据结构笔记之十七链表实现多项式 本篇名言:"人生不是一种享乐,而是一桩十分沉重的工作."列夫托尔斯泰. 栈的应用在上面中基本覆盖了很多,接下去我们来补充下链表在多项式实现中的例子. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/46653857 1.  多项式 这个问题是符号多项式的处理问题,已经成为表处理中的一个经典例子.把每项表示为一个结点,该结点包括系数域.指数域和指向下一项的指针.类型申明如下

数据结构实践——链表:多项式求和

本文针对数据结构基础系列网络课程(2):线性表的实践项目. [项目 - 多项式求和] 用单链表存储一元多项式,并实现两个多项式的加法. 提示: 1.存储多项式的数据结构 多项式的通式是pn(x)=anxn+an?1xn?1+...+a1x+a0.n次多项式共有n+1项.直观地,可以定义一个数组来存储这n+1个系数.以多项式p(x)=?3.4x10?9.6x8+7.2x2+x为例,存储这个多项式的数组如下图: 可以看出,这种方案适合对某些多项式的处理.但是,在处理一些次数高但项数少的多项式时,存在

数据结构学习之单链表基本操作

数据结构学习之单链表基本操作 0x1 前言 今天实验课,学习了下单链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的单链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)释

数据结构学习之双链表基本操作

数据结构学习之双链表基本操作 0x1 前言 今天实验课,学习了下双链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的双链链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)