单链表之一元多项式求和

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

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

  1. //一元多项式求和头文件
  2. #include<iostream>
  3. using namespace std;
  4. template<class DataType>
  5. //定义单链表结点
  6. struct Node
  7. {
  8.   //数据域:非零项的系数和指数
  9.   DataType coef, exp;
  10.   //指针域
  11.   Node<DataType> *next;
  12. };
  13. //定义存放一元多项式的类
  14. template<class DataType>
  15. class Linklist
  16. {
  17. private:
  18.   Node<DataType> *first;
  19.   //一元多项式的项数
  20.   int size;
  21. public:
  22.   //构造函数
  23.   Linklist();
  24.   //初始化一元多项式
  25.   void Init();
  26.   //输出一元多项式
  27.   void Print();
  28.   //定义一元多项式的的加法操作
  29.   Linklist<DataType> operator+(Linklist &p2);
  30. };
  31.  
  32. //构造函数
  33. template<class DataType>
  34. Linklist<DataType>::Linklist()
  35. {
  36.   first = new Node<DataType>;
  37.   first = NULL;
  38.   size = ;
  39. }
  40.  
  41. //实现一元多项式单链表的初始化
  42. template<class DataType>
  43. void Linklist<DataType>::Init()
  44. {
  45.   cout << "多项式的元素个数为:";
  46.   cin >> size;
  47.   DataType x, y;
  48.   cout << "请输入第1项的系数:";
  49.   cin >> x;
  50.   cout << "请输入第1项的指数:";
  51.   cin >> y;
  52.   Node<DataType> *m;
  53.   m = new Node<DataType>;
  54.   m->coef = x;
  55.   m->exp = y;
  56.   m->next = NULL;
  57.   first = m;
  58.   for (int i = ; i <= size; i++)
  59.   {
  60.     cout << "请输入第" << i << "项的系数:";
  61.     cin >> x;
  62.     cout << "请输入第" << i << "项的指数:";
  63.     cin >> y;
  64.     Node<DataType> *n;
  65.     n = new Node<DataType>;
  66.     n->coef = x;
  67.     n->exp = y;
  68.     n->next = NULL;
  69.     m->next = n;
  70.     m = n;
  71.   }
  72. }
  73.  
  74. //实现一元多项式单链表实的输出
  75. template<class DataType>
  76. void Linklist<DataType>::Print()
  77. {
  78.   Node<DataType> *m = first;
  79.   while (m != NULL)
  80.   {
  81.     if (m == first)
  82.     {
  83.       if (m->coef != && m->exp != )
  84.       {
  85.         cout << m->coef << "x^" << m->exp;
  86.       }
  87.       else if (m->coef != && m->exp == )
  88.       {
  89.         cout << m->coef;
  90.       }
  91.     }
  92.     else
  93.     {
  94.       if (m->coef > && m->exp != ){
  95.         cout << "+" << m->coef << "x^" << m->exp;
  96.       }
  97.       else if (m->coef< && m->exp != )
  98.       {
  99.         cout << m->coef << "x^" << m->exp;
  100.       }
  101.       else if (m->coef> && m->exp == )
  102.       {
  103.          cout << "+" << m->coef;
  104.       }
  105.       else if (m->coef < && m->exp == )
  106.       {
  107.         cout << m->coef;
  108.       }
  109.     }
  110.     m = m->next;
  111.   }
  112.   cout << endl;
  113. }
  114.  
  115. //实现一元多项式单链表的相加
  116. template<class DataType>
  117. Linklist<DataType> Linklist<DataType>::operator+(Linklist &p2)
  118. {
  119.   //声明工作指针
  120.   Node<DataType> *pre, *p, *qre, *q;
  121.   //初始化工作指针
  122.   pre = this->first;
  123.   p = pre->next;
  124.   qre = p2.first;
  125.   q = qre->next;
  126.   while (p != NULL&&q != NULL)
  127.   {
  128.     //p->exp < q->exp:指针 p 后移
  129.     if (p->exp < q->exp)
  130.     {
  131.       pre = p;
  132.       p = p->next;
  133.     }
  134.     //p->exp > q->exp:将结点 q 插到结点 p 之前,指针 p 指向他原指结点的下一个结点
  135.     if (p->exp > q->exp)
  136.     {
  137.       Node<DataType> *s;
  138.       s = q->next;
  139.       pre->next = q;
  140.       q->next = p;
  141.       q = s;
  142.     }
  143.     //p->exp == q->exp:
  144.     if (p->exp == q->exp)
  145.     {
  146.       //p->coef = p->coef + q->coef
  147.       p->coef = p->coef + q->coef;
  148.       if (p->coef == )
  149.       {
  150.         //使指针 p 指向它原指结点的下一个结点
  151.         pre->next = p->next;
  152.         //删除结点 p
  153.         delete p;
  154.         p = p->next;
  155.       }
  156.       else
  157.       {
  158.         pre = p;
  159.         p = pre->next;
  160.       }
  161.       //使指针 q 指向它原指结点的下一个结点
  162.       qre->next = q->next;
  163.       //删除结点 q
  164.       delete q;
  165.       q = qre->next;
  166.     }
  167.   }
  168.   //如果 q 不为空,将结点 q 链接在第一个单链表的后面。
  169.   if (q != NULL)
  170.   {
  171.     pre->next = q;
  172.     delete p2.first;
  173.   }
  174.   return *this;
  175. }

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

  1. #include<iostream>
  2. //引入一元多项式之单链表实现的头文件
  3. #include "PolynomialOfOneIndeterminateAdd.h"
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.   //声明一元多项式单链表
  9.   Linklist<int> p1, p2, p3;
  10.   cout << "请按指数由小到大的顺序定义多项式A(x):" << endl;
  11.   p1.Init();
  12.   cout << "输入的多项式A(x)为:";
  13.   p1.Print();
  14.   cout << "\n请按指数由小到大的顺序定义多项式B(x):" << endl;
  15.   p2.Init();
  16.   cout << "输入的多项式B(x)为:";
  17.   p2.Print();
  18.   //一元多项式相加
  19.   p3 = p1 + p2;
  20.   cout << "\n多项式A(x)和多项式B(x)的和为:" << endl;
  21.   p3.Print();
  22.   return ;
  23. }

三、运行示例结果

单链表之一元多项式求和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. react 带参数事件方法不立即执行

    handleClick:()=>{this.to_step('to_step3_2')}}

  2. MySQL GTID你知多少【转】

    MySQL在5.6的版本推出了GTID复制,相比传统的复制,GTID复制对于运维更加友好,这个事务是谁产⽣,产⽣多少事务,⾮常直接的标识出来,当然GTID也有限制,对于什么是GTID可以参考我之前的文 ...

  3. java递归遍历获取目录下所有文件

    import java.io.File; import java.util.ArrayList; import java.util.List; public class GetFiles { Arra ...

  4. 03.JavaScript简单介绍

    一.JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) N ...

  5. excl筛选求和

    Excel中的筛选,是一个很常用的功能.但不知道是有意还是疏忽,Excel没有直接提供在筛选后的一些统计功能,例如求和.平均值等.而由于筛选的主要功能之一就是可以方便快捷的进行变换,所普通的以直接在数 ...

  6. Python基础 - 正则表达式

    Python自带正则表达式模块,即re模块. 导入正则模块: import re 用dir()函数查看re模块内的属性和方法: dir(re)

  7. java IO流知识点总结

    I/O类库中使用“流”这个抽象概念.Java对设备中数据的操作是通过流的方式.表示任何有能力产出数据的数据源对象,或者是有能力接受数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节.IO流 ...

  8. IPC对象的持续性

    转载:http://book.51cto.com/art/201006/207275.htm <UNIX网络编程:第2版.第2卷,进程间通信>本书全面深入地讲解了各种进程间通信形式,包括消 ...

  9. C++之构造函数的继承

    #include<iostream> usingnamespace std; classBase1 { public: Base1()=default; Base1(const strin ...

  10. 利用sys.dm_db_index_physical_stats查看索引碎片等数据

    我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最 ...