单链表之一元多项式求和

一元多项式求和单链表实现伪代码

1、工作指针 pre、p、qre、q 初始化
2、while(p 存在且 q 存在)执行下列三种情况之一:
  2.1、若 p->exp < q->exp:指针 p 后移;
  2.2、若 p->exp > q->exp,则
    2.2.1、将结点 q 插到结点 p 之前
    2.2.2、指针 p 指向他原指结点的下一个结点;
  2.3、若 p->exp == q->exp,则
    2.3.1、p->coef = p->coef + q->coef
    2.3.2、若 p->coef == 0,则执行下列操作,否则指针 p 后移,
      2.3.2.1、删除结点 p
      2.3.2.2、使指针 p 指向它原指结点的下一个结点
    2.3.3、删除结点 q
    2.3.4、使指针 q 指向它原指结点的下一个结点
3、如果 q 不为空,将结点 q 链接在第一个单链表的后面。
一、一元多项式求和单链表实现头文件:PolynomialOfOneIndeterminateAdd.h

 //一元多项式求和头文件
#include<iostream>
using namespace std;
template<class DataType>
//定义单链表结点
struct Node
{
  //数据域:非零项的系数和指数
  DataType coef, exp;
  //指针域
  Node<DataType> *next;
};
//定义存放一元多项式的类
template<class DataType>
class Linklist
{
private:
  Node<DataType> *first;
  //一元多项式的项数
  int size;
public:
  //构造函数
  Linklist();
  //初始化一元多项式
  void Init();
  //输出一元多项式
  void Print();
  //定义一元多项式的的加法操作
  Linklist<DataType> operator+(Linklist &p2);
}; //构造函数
template<class DataType>
Linklist<DataType>::Linklist()
{
  first = new Node<DataType>;
  first = NULL;
  size = ;
} //实现一元多项式单链表的初始化
template<class DataType>
void Linklist<DataType>::Init()
{
  cout << "多项式的元素个数为:";
  cin >> size;
  DataType x, y;
  cout << "请输入第1项的系数:";
  cin >> x;
  cout << "请输入第1项的指数:";
  cin >> y;
  Node<DataType> *m;
  m = new Node<DataType>;
  m->coef = x;
  m->exp = y;
  m->next = NULL;
  first = m;
  for (int i = ; i <= size; i++)
  {
    cout << "请输入第" << i << "项的系数:";
    cin >> x;
    cout << "请输入第" << i << "项的指数:";
    cin >> y;
    Node<DataType> *n;
    n = new Node<DataType>;
    n->coef = x;
    n->exp = y;
    n->next = NULL;
    m->next = n;
    m = n;
  }
} //实现一元多项式单链表实的输出
template<class DataType>
void Linklist<DataType>::Print()
{
  Node<DataType> *m = first;
  while (m != NULL)
  {
    if (m == first)
    {
      if (m->coef != && m->exp != )
      {
        cout << m->coef << "x^" << m->exp;
      }
      else if (m->coef != && m->exp == )
      {
        cout << m->coef;
      }
    }
    else
    {
      if (m->coef > && m->exp != ){
        cout << "+" << m->coef << "x^" << m->exp;
      }
      else if (m->coef< && m->exp != )
      {
        cout << m->coef << "x^" << m->exp;
      }
      else if (m->coef> && m->exp == )
      {
         cout << "+" << m->coef;
      }
      else if (m->coef < && m->exp == )
      {
        cout << m->coef;
      }
    }
    m = m->next;
  }
  cout << endl;
} //实现一元多项式单链表的相加
template<class DataType>
Linklist<DataType> Linklist<DataType>::operator+(Linklist &p2)
{
  //声明工作指针
  Node<DataType> *pre, *p, *qre, *q;
  //初始化工作指针
  pre = this->first;
  p = pre->next;
  qre = p2.first;
  q = qre->next;
  while (p != NULL&&q != NULL)
  {
    //p->exp < q->exp:指针 p 后移
    if (p->exp < q->exp)
    {
      pre = p;
      p = p->next;
    }
    //p->exp > q->exp:将结点 q 插到结点 p 之前,指针 p 指向他原指结点的下一个结点
    if (p->exp > q->exp)
    {
      Node<DataType> *s;
      s = q->next;
      pre->next = q;
      q->next = p;
      q = s;
    }
    //p->exp == q->exp:
    if (p->exp == q->exp)
    {
      //p->coef = p->coef + q->coef
      p->coef = p->coef + q->coef;
      if (p->coef == )
      {
        //使指针 p 指向它原指结点的下一个结点
        pre->next = p->next;
        //删除结点 p
        delete p;
        p = p->next;
      }
      else
      {
        pre = p;
        p = pre->next;
      }
      //使指针 q 指向它原指结点的下一个结点
      qre->next = q->next;
      //删除结点 q
      delete q;
      q = qre->next;
    }
  }
  //如果 q 不为空,将结点 q 链接在第一个单链表的后面。
  if (q != NULL)
  {
    pre->next = q;
    delete p2.first;
  }
  return *this;
}

二、测试一元多项式单链表实现的源程序:TestPolynomialOfOneIndeterminateAdd.cpp

 #include<iostream>
//引入一元多项式之单链表实现的头文件
#include "PolynomialOfOneIndeterminateAdd.h"
using namespace std; int main()
{
  //声明一元多项式单链表
  Linklist<int> p1, p2, p3;
  cout << "请按指数由小到大的顺序定义多项式A(x):" << endl;
  p1.Init();
  cout << "输入的多项式A(x)为:";
  p1.Print();
  cout << "\n请按指数由小到大的顺序定义多项式B(x):" << endl;
  p2.Init();
  cout << "输入的多项式B(x)为:";
  p2.Print();
  //一元多项式相加
  p3 = p1 + p2;
  cout << "\n多项式A(x)和多项式B(x)的和为:" << endl;
  p3.Print();
  return ;
}

三、运行示例结果

单链表之一元多项式求和C++实现的更多相关文章

  1. leetcode 题解 Add Two Numbers(两个单链表求和)

    题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...

  2. 数据结构 C++ 单链表 一元多项式的相加

    #include <iostream> using namespace std; struct Node { double coe; //系数 int exp; //指数 Node *ne ...

  3. PTA基础编程题目集6-6求单链表结点的阶乘和(函数题)

    本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义: int FactorialSum( List L ); 其中单链表List的定义 ...

  4. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  5. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  6. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  7. [LeetCode] Linked List Cycle II 单链表中的环之二

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  8. c++单链表基本功能

    head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status; ...

  9. 单链表、循环链表的JS实现

    数据结构系列前言: 数据结构作为程序员的基本知识,需要我们每个人牢牢掌握.近期我也展开了对数据结构的二次学习,来弥补当年挖的坑......   当时上课的时候也就是跟着听课,没有亲自实现任何一种数据结 ...

随机推荐

  1. Count of Smaller Number before itself

    Give you an integer array (index from 0 to n-1, where n is the size of this array, value from 0 to 1 ...

  2. mysql5.7.10 源码编译安装记录 (centos6.4)【转】

    一.准备工作 1.1 卸载系统自带mysql 查看系统是否自带MySQL, 如果有就卸载了, 卸载方式有两种yum, rpm, 这里通过yum卸载 rpm -qa | grep mysql //查看系 ...

  3. 2015 Dhaka

    2015 Dhaka A - Automatic Cheater Detection solution 模拟计数. B - Counting Weekend Days solution 模拟计数. C ...

  4. shell服务管理->

    nginx.php等服务管理练习脚本 ->nginx的启动状态 root@jumpserver- day02]# cat nginx_web.sh #!/bin/bash source /etc ...

  5. 数据结构之队列(Python 版)

    数据结构之队列(Python 版) 队列的特点:先进先出(FIFO) 使用链表技术实现 使用单链表技术,在表首尾两端分别加入指针,就很容易实现队列类. 使用顺序表list实现 # 队列类的实现 cla ...

  6. python网络编程-协程(协程说明,greenlet,gevent)

    一:什么是协程 协程(Coroutine):,又称微线程.协程是一种用户态的轻量级线程.是由用户自己控制,CPU根本不知道协程存在. 协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和 ...

  7. FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑

    FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没 ...

  8. 使用插件实现Jenkins参数化构建

    一.插件安装 1.打开插件管理,在此界面可以安装插件 二.参数化 1.在“可选插件”中查找如下两个插件然后安装,安装后重启Jenkins Build With Parameters 输入框式的参数 P ...

  9. Spring框架的基本使用(AOP部分)

    AOP,Aspect Oriented Programming,意为面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP采取横向抽取机制,取代了传统纵向继承体系重复 ...

  10. 编程六月定律 | 外刊IT评论网

    编程六月定律 上周,我被迫对一个很老的项目做一些修改.麻烦是,当开始着手时,我真的记不清这个项目究竟有多老了. 这实际上是我使用Codeigniter实现的第一个MVC项目.打开项目文件后,很多东西都 ...