#include<iostream>
#include<cstdlib>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef int Elemtype;
typedef int Status;
typedef struct PNode//定义多项式
{
float coef;//系数cofficient
Elemtype expn;//指数exponent
struct PNode* next;//地址域
}PNode, * Polynomial;
Status InitPolyn(Polynomial& P);//初始化多项式
Status CreatePolyn(Polynomial& P, int i);//创建多项式
Status AddPolyn(Polynomial& Pa, Polynomial& Pb);//多项式的加法运算
Status PrintPolyn(Polynomial P);//在单链表中打印元素
int main(void)
{
int a, b;
a = b = 0;
Polynomial Pa, Pb;
InitPolyn(Pa);
InitPolyn(Pb);
cout << "创建链表Pa的长度为:";
cin >> a;
CreatePolyn(Pa,a);
cout << "创建链表Pb的长度为:";
cin >> b;
CreatePolyn(Pb, b);
AddPolyn(Pa, Pb);
PrintPolyn(Pa);
return 0;
}
Status InitPolyn(Polynomial& P)//初始化一个只有头结点的单链表
{
P = new PNode;
P->next = NULL;
return OK;
}
Status CreatePolyn(Polynomial& P, int i)
{
PNode* p, * pre, * q;
cout << "\n输入多项式的相关数据为(系数和指数):";
for (int t = 0; t < i; t++)
{
p = new PNode;//生成一个新节点*p
cin >> p->coef >> p->expn;//输入当前项指数expn和系数coef
pre = P;//pre用于保存q的前驱节点,初始时指向头节点,用于找到第一个大于输入项指数的节点的前驱
q = P->next;//q初始化,指向首元节点
while (q && (q->expn < p->expn))//比较指数,找到第一个大于输入项指数的项*q
{
pre = q;
q = q->next;
}
p->next = q;//赋值生成节点*p的指针域 将输入项p插入*q和其前驱节点pre之间
pre->next = p;
}
return OK;
}
Status AddPolyn(Polynomial& Pa, Polynomial& Pb)
{
PNode* p1, * p2, * p3, * r;
p1 = Pa->next, p2 = Pb->next, p3 = Pa;
while (p1 && p2)//p1,p2都不为空
{
if (p1->expn == p2->expn)//p1指向的指数等于p2指向的指数
{
float sum = 0;
sum = p1->coef + p2->coef;//sum表示两个系数之和
if (sum != 0)
{
p1->coef = sum;
p3->next = p1;
p3 = p1;
p1 = p1->next;
r = p2;
p2 = p2->next;
delete r;
}
else
{
r = p1;
p1 = p1->next;
delete r;
r = p2;
p2 = p2->next;
delete r;
}
}
else
{
if (p1->expn < p2->expn)
{
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else
{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
}
p3->next = p1 ? p1 : p2;//将非空表的剩余段插入到pc
delete Pb;//释放Lb的头结点
return OK;
}
Status PrintPolyn(Polynomial P)
{
PNode* p;
p = P->next;
if (p == NULL)
{
cout << "\n表不存在。";
return ERROR;
}
while (p != NULL)
{
cout << "\n系数为:";
cout << p->coef << " ";
cout << "\n指数为:";
cout << p->expn << " ";
p = p->next;
}
return OK;
}

最新文章

  1. iOS系列教程 目录 (持续更新...)
  2. Java进击C#——语法之ADO.NET
  3. (1)WCF少废话系列之 _Hello WCF!
  4. JDK和Tomcat环境变量,以及用MyEclipse新建Web Project测试Tomcat Server
  5. 创建本地Ubuntu镜像
  6. CSS那些事儿-阅读随笔2(选择符的组合与优先级/权重)
  7. JavaScript设置右下角悬浮窗
  8. HDU 3516 Tree Construction (四边形不等式)
  9. 如何用好消息推送(JPush)为app拉新、留存、促活
  10. linux系统性能监控--网络利用率
  11. jQuery的siblings方法
  12. C#图片操作公共库
  13. OSS内文件如何设置为无时间限制的下载链接
  14. shell中的函数、数组、报警系统脚本
  15. CENTOS7常用的基础命令集合(一)
  16. 【转载】ASP.NET工具类:文件夹目录Directory操作工具类
  17. (已解决)在linux的虚拟机上安装vmware tools(实现windows与虚拟机之间的文件交互复制粘贴)
  18. 基于js的自适应、多样式轮播图插件(兼容IE8+、FF、chrome等主流浏览器)
  19. selenium+python自动化92-多线程启动多个不同浏览器
  20. 【326】PIL 截图及图片识别

热门文章

  1. Web Socket 长连接
  2. 【Linux】Linux网络编程
  3. 网络图片转base64
  4. js复选框,三层结构
  5. win10 扩展c盘 “PARTITION_BASIC_DATA_GUID&quot;
  6. react-router V6踩坑
  7. ES实战-trying to create too many buckets
  8. unity 利用相机截图,可以截取UI,保存png格式,可用于签名抠图
  9. spring 使用@Async注解实现异步调用
  10. Redis后端面试题