单链表之一元多项式求和C++实现
单链表之一元多项式求和
一元多项式求和单链表实现伪代码
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++实现的更多相关文章
- leetcode 题解 Add Two Numbers(两个单链表求和)
		
题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...
 - 数据结构 C++ 单链表 一元多项式的相加
		
#include <iostream> using namespace std; struct Node { double coe; //系数 int exp; //指数 Node *ne ...
 - PTA基础编程题目集6-6求单链表结点的阶乘和(函数题)
		
本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义: int FactorialSum( List L ); 其中单链表List的定义 ...
 - 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
		
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
 - 单链表的C++实现(采用模板类)
		
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
 - Java实现单链表的各种操作
		
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
 - [LeetCode] Linked List Cycle II 单链表中的环之二
		
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...
 - c++单链表基本功能
		
head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status; ...
 - 单链表、循环链表的JS实现
		
数据结构系列前言: 数据结构作为程序员的基本知识,需要我们每个人牢牢掌握.近期我也展开了对数据结构的二次学习,来弥补当年挖的坑...... 当时上课的时候也就是跟着听课,没有亲自实现任何一种数据结 ...
 
随机推荐
- Ubuntu 增加全新硬盘 分区及开机自动挂载
			
安装新的硬盘后.可以安装Gparted, 或者从live cd启动,然后用Gparted工具对硬盘进行分区.然后进入系统,启动Disks, 找到对应硬盘, 选择Edit Mount Options, ...
 - 说说C语言运算符的“优先级”与“结合性”
			
论坛和博客上常常看到关于C语言中运算符的迷惑,甚至是错误的解读.这样的迷惑或解读大都发生在表达式中存在着较为复杂的副作用时.但从本质上看,仍然是概念理解上的偏差.本文试图通过对三个典型表达式的分析,集 ...
 - python+selenium初学者常见问题处理
			
要做web自动化,第一件事情就是搭建自动化测试环境,那就没法避免的要用到selenium了. 那在搭建环境和使用过程中经常会遇到以下几类问题: 1.引入selenium包失败: 出现这种错误,一般分为 ...
 - JavaScript 金额、数字、千分位、千分位、保留几位小数、舍入舍去、支持负数
			
JavaScript 金额.数字 千分位格式化.保留指定位数小数.支持四舍五入.进一法.去尾法 字段说明: number:需要处理的数字: decimals:保留几位小数,默认两位,可不传: dec_ ...
 - 【C语言学习笔记】字符串拼接的3种方法 .
			
昨天晚上和@buptpatriot讨论函数返回指针(malloc生成的)的问题,提到字符串拼接,做个总结. #include<stdio.h> #include<stdlib.h&g ...
 - GO里的“指针”
			
指针 *T即为类型T的指针 &t即为获取变量t的地址 *p即为获取指针变量所指向的内容 var p *int 指针的*在左边 类型在右边.这里的 *int就是一个指针类型. 跟int str ...
 - Vue项目实现excel导出
			
1.package.json里面安装三个插件 npm install xlsx --save npm install script-loader –save-dev npm install ...
 - No.2 selenium学习之路之八种基本定位
			
selenium的八种定位方式 1.通过id定位 find_element_by_id() send_keys() 输入框输入字符串 click() 鼠标点击事件 注:send_keys输入 ...
 - 开发者常用的 Sublime Text 3 插件
			
1.官网下载 Sublime Text 3 (已有安装包的,请忽略) Sublime Text 官网下载地址 : http://www.sublimetext.com/ 2.打开 Sublime Te ...
 - 关于 poScreenCenter 与 poDesktopCenter
			
主要是窗体水平方向与垂直方向的的 居中问题,由于水平方向 没有什么,所以不探讨.而垂直方向由于底部有个工具栏,工具栏自身有个高度,所以垂直方向的居中问题,需要探讨下. 结论: poScreenCent ...