首页 > 编程语言 >用单链表实现一元多项式相加 C++代码

用单链表实现一元多项式相加 C++代码

时间:2023-08-27 11:34:56浏览次数:39  
标签:单链 LNode 多项式 Px C++ next Pb Pa


 

#include <iostream>
using namespace std;
 
/*结点的定义*/
typedef struct LNode
{
      float coef;
      int  exp;
      struct LNode *next;
}LNode;
typedef LNode *Polynomial;
 
 
/*多项式的初始化*/
void initDuoX(Polynomial &Px)
{
      Px=new LNode;
      Px->next=NULL;
}
 
 
/*用正序插入法建立多项式*/
void creatDuoX(Polynomial &Px,int n)
{
      initDuoX(Px);
 
      LNode *p,*q;
      p=Px;
 
      for(int i=0;i<n;i++)
      {
             q=new LNode;
 
             cin>>q->coef>>q->exp;
             q->next=NULL;
 
             p->next=q;
             p=q;
 
      }
}
 
 
/*求多项式的长度*/
int lengthDuoX(Polynomial &Px)
{
      LNode *p;
      int count;
 
      p=Px->next;
      count=0;
 
      while(p!=NULL)
      {
             p=p->next;
             count++;
      }
      
      return count;
}
 
/*输出多项式*/
void outputDuoX(Polynomial &Px)
{
      LNode *p;
      p=Px->next;
 
      int i;
      for(i=0;i<lengthDuoX(Px);i++)
      {
             cout<<p->coef<<" "<<p->exp<<" ";
             p=p->next;
      }
      cout<<endl;
}
 
 
/*多项式相加*/
LNode * addDuoX(Polynomial &Pa,Polynomial &Pb)
{
      LNode *p,*q;
      LNode *prep;//prep指向p的前驱。
      LNode *u;
 
      p=Pa->next;
      q=Pb->next;//p、q分别指向多项式的第一项。
 
      prep=Pa;//因为是Pb加到Pa上,所以此处不需要使用q的前驱。
 
      while (p&&q)
      {
             if(p->exp<q->exp)//第一种情况,指针只需后移。
             {
                    prep=p;
                    p=p->next;
             }
             else if(p->exp > q->exp)//第二种情况,将q结点插入到p结点之前。
             {
                    u=q->next;
                    
                    q->next=p;
                    prep->next=q;
                    
                    prep=q;
                    q=u;
             }
             else//第三种情况,系数进行相加。
             {
                    p->coef=p->coef+q->coef;
                    if(p->coef==0)//系数相加等于0
                    {
                           LNode *temp1;
                           LNode *temp2;
                           temp1=p;
                           temp2=q;
                           prep->next=p->next;
                           p=p->next;
                           q=q->next;
                           
                           delete temp1;//这里不能直接释放p结点。
                           delete temp2;
                    }
                    else
                    {
                           LNode *temp2;
                           temp2=q;
 
                           prep=p;
                           p=p->next;
                           q=q->next;
                           delete temp2;
                    }
             }
      }
      if(q)
             prep->next=q;
 
      delete Pb;
      return Pa;
}
 
 
void main()
{
      Polynomial Pa,Pb,Pc;
      creatDuoX(Pa,4);
      creatDuoX(Pb,5);
 
      Pc=addDuoX(Pa,Pb);
      outputDuoX(Pc);
}

 

总体上来说,虽然是两个多项式相加,但两个多项式的地位是不一样的。是Pb加到Pa上,所以对两个多项式的处理也不一样。

虽然是照着算法写这个程序,可是还是费了老大的劲,才把它写出来,而且还出错了!经过调试之后,测试了一组数据,呵呵,正确!为确保万无一失,再测一组,呜呜,错了!所以写了程序,要多测几组数据 ,才能确保万无一失。

写这个程序没有学到多少新的东西,但是让我对单链表有了更深的理解,并且能够更加牢固的掌握它!嘿嘿,自己要加油啊!!!

写程序,写程序,乐在其中!!!

 

标签:单链,LNode,多项式,Px,C++,next,Pb,Pa
From: https://blog.51cto.com/u_5173797/7252044

相关文章

  • 双链表的定义、初始化、插入、删除,C++代码实现的算法
    #include<iostream>usingnamespacestd;/*双向链表类型定义*/typedefstructduNode{chardata;structduNode*prior;structduNode*next;}duNode;typedefduNode*duLinklist;//指针类型,故访问它的成员用“->”。/*初始化双向链表*/voidinitLinkl......
  • 链队列的实现,C++代码实现
    /*链队列的实现*/#include<iostream>usingnamespacestd;/*链队列类型定义*/typedefstructQNode{structQNode*next;chardata;}QNode,*queuePtr;//结点的定义typedefstructlinkQueue{queuePtrrear;queuePtrfront;}linkQueue;//队列的定......
  • 基于QT和C++实现的停车场管理系统
    基于QT和C++实现的停车场管理系统停车场管理系统简介一、 问题描述设停车场是一个可停放若干辆辆汽车的狭多层平面区域,且只有一个大门可供汽车进出。若车场内已停满汽车,则后来的汽车只能在门外的狭长便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入。每辆停放在......
  • 力扣-2. 两数相加(C++题解)
    题目链接:https://leetcode.cn/problems/add-two-numbers/description/给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之......
  • C++11 右值引用&&、移动语义std::move、完美转发std::forward
    参考:https://blog.csdn.net/HR_Reborn/article/details/130363997 #pragmaonceclassArray{public:Array():size_(0),data_(nullptr){}Array(intsize):size_(size){data_=newint[size_];}//复制构造函数(深拷贝构造)A......
  • C++的三大特性 ,封装、继承、多态?(一)
    C++的三大特性:封装、继承、多态。一、封装:将属性和行为作为一个整体,表现生活中的事物。一般来说就是把变量和函数一起放在一个类里,此时变量叫做成员变量,函数叫做成员函数。封装的意义一:将属性和行为作为一个整体,表现生活中的事物。1#include<iostream>2usingnamespaces......
  • 力扣-228. 汇总区间(C++题解)
    题目链接:https://leetcode.cn/problems/summary-ranges/description/给定一个 无重复元素的 有序整数数组\(nums\)。返回恰好覆盖数组中所有数字的最小有序区间范围列表 。也就是说,\(nums\)的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于\(......
  • [转]C++使用虚函数的时候,子类也要使用virtual关键字吗
    原文地址:https://blog.csdn.net/gao1440156051/article/details/45670715父类使用虚函数是为了让子类重写,那子类重写的时候也需要带virtual关键字吗?比如:classBase{virtualboolinit();};classDerived{virtualboolinit();//这里的vitual是必须的吗?好像不用也能编译通过呃…......
  • 【算法-二分查找】实现过程、C++代码示例以及实际应用
    二分查找简介:也称为折半查找,是一个在已排序数组中查找特定元素的搜索算法。它的工作原理是将有序数组分成两半,然后检查目标值是在左半部分还是右半部分,然后在所选择的那部分中继续查找。这一过程将不断地重复,直到找到目标值或确定目标值不在数组中。实现过程:1.初始化两个指针:lo......
  • C++STL函数
    1、排序算法描述键盘输入5个整数,使用vector进行存储,使用STL排序算法对元素进行排序(从大到小),再使用STL遍历算法输出元素。(元素和元素之间使用空格隔开)输入描述:键盘输入5个整数输出描述:输出排序后的元素,元素和元素之间使用空格隔开。#include<iostream>#include<ve......