// c2-6.h 抽象数据类型Polynomial的实现(见图2.45)
typedef struct // 项的表示,多项式的项作为LinkList的数据元素
{
float coef; // 系数
int expn; // 指数
}term,ElemType; // 两个类型名:term用于本ADT,ElemType为LinkList的数据对象名

图246 是根据c2-5.h 和c2-6.h 定义的多项式7.3+22X7 的存储结构。

// bo2-7.cpp 多项式(存储结构由c2-6.h定义)的基本操作及算法2.22,2.23等(8个)
#include"c2-5.h"
#include"bo2-6.cpp"
typedef LinkList polynomial;
#define DestroyPolyn DestroyList // 与bo2-6.cpp中的函数同义不同名
#define PolynLength ListLength // 与bo2-6.cpp中的函数同义不同名
void OrderInsertMerge(LinkList &L,ElemType e,int(* compare)(term,term))
{ // 按有序判定函数compare()的约定,将值为e的结点插入或合并到升序链表L的适当位置
Position q,s;
if(LocateElem(L,e,q,compare)) // L中存在该指数项
{
q->data.coef+=e.coef; // 改变当前结点系数的值
if(!q->data.coef) // 系数为0
{ // 删除多项式L中当前结点
s=PriorPos(L,q); // s为当前结点的前驱
if(!s) // q无前驱
s=L.head;
DelFirst(L,s,q);
FreeNode(q);
}
}
else // 生成该指数项并插入链表
{
MakeNode(s,e); // 生成结点
InsFirst(L,q,s);
}
}
int cmp(term a,term b) // CreatPolyn()的实参
{ // 依a的指数值<、=或>b的指数值,分别返回-1、0或+1
if(a.expn==b.expn)
return 0;
else
return (a.expn-b.expn)/abs(a.expn-b.expn);
}
void CreatPolyn(polynomial &P,int m) // 算法2.22
{ // 输入m项的系数和指数,建立表示一元多项式的有序链表P
Position q,s;
term e;
int i;
InitList(P);
printf("请依次输入%d个系数,指数:\n",m);
for(i=1;i<=m;++i)
{ // 依次输入m个非零项(可按任意顺序)
scanf("%f,%d",&e.coef,&e.expn);
if(!LocateElem(P,e,q,cmp)) // 当前链表中不存在该指数项,cmp是实参
{
MakeNode(s,e); // 生成结点并插入链表
InsFirst(P,q,s);
}
}
}
void PrintPolyn(polynomial P)
{ // 打印输出一元多项式P
Link q;
q=P.head->next; // q指向第1个结点
printf(" 系数指数\n");
while(q)
{
printf("%f %d\n",q->data.coef,q->data.expn);
q=q->next;
}
}
void AddPolyn(polynomial &Pa,polynomial &Pb) // 算法2.23
{ // 多项式加法:Pa=Pa+Pb,并销毁一元多项式Pb
Position ha,hb,qa,qb;
term a,b;
ha=GetHead(Pa);
hb=GetHead(Pb); // ha和hb分别指向Pa和Pb的头结点
qa=NextPos(ha);
qb=NextPos(hb); // qa和qb分别指向Pa和Pb中当前结点(现为第1个结点)
while(!ListEmpty(Pa)&&!ListEmpty(Pb)&&qa)
{ // Pa和Pb均非空且ha没指向尾结点(qa!=0)
a=GetCurElem(qa);
b=GetCurElem(qb); // a和b为两表中当前比较元素
switch(cmp(a,b))
{
case -1:ha=qa; // 多项式Pa中当前结点的指数值小
qa=NextPos(ha); // ha和qa均向后移1个结点
break;
case 0: qa->data.coef+=qb->data.coef; // 两者的指数值相等,修改Pa当前结点的系数值
if(qa->data.coef==0) // 删除多项式Pa中当前结点
{
DelFirst(Pa,ha,qa);
FreeNode(qa);
}
else
ha=qa;
DelFirst(Pb,hb,qb);
FreeNode(qb);
qb=NextPos(hb);
qa=NextPos(ha);
break;
case 1: DelFirst(Pb,hb,qb); // 多项式Pb中当前结点的指数值小
InsFirst(Pa,ha,qb);
ha=ha->next;
qb=NextPos(hb);
}
}
if(!ListEmpty(Pb))
{
Pb.tail=hb;
Append(Pa,qb); // 链接Pb中剩余结点
}
DestroyPolyn(Pb); // 销毁Pb
}
void AddPolyn1(polynomial &Pa,polynomial &Pb)
{ // 另一种多项式加法的算法:Pa=Pa+Pb,并销毁一元多项式Pb
Position qb;
term b;
qb=GetHead(Pb); // qb指向Pb的头结点
qb=qb->next; // qb指向Pb的第1个结点
while(qb)
{
b=GetCurElem(qb);
OrderInsertMerge(Pa,b,cmp);
qb=qb->next;
}
DestroyPolyn(Pb); // 销毁Pb
}
void Opposite(polynomial Pa)
{ // 一元多项式Pa系数取反
Position p;
p=Pa.head;
while(p->next)
{
p=p->next;
p->data.coef*=-1;
}
}
void SubtractPolyn(polynomial &Pa,polynomial &Pb)
{ // 多项式减法:Pa=Pa-Pb,并销毁一元多项式Pb
Opposite(Pb);
AddPolyn(Pa,Pb);
}
void MultiplyPolyn(polynomial &Pa,polynomial &Pb)
{ // 多项式乘法:Pa=Pa×Pb,并销毁一元多项式Pb
polynomial Pc;
Position qa,qb;
term a,b,c;
InitList(Pc);
qa=GetHead(Pa);
qa=qa->next;
while(qa)
{
a=GetCurElem(qa);
qb=GetHead(Pb);
qb=qb->next;
while(qb)
{
b=GetCurElem(qb);
c.coef=a.coef*b.coef;
c.expn=a.expn+b.expn;
OrderInsertMerge(Pc,c,cmp);
qb=qb->next;
}
qa=qa->next;
}
DestroyPolyn(Pb); // 销毁Pb
ClearList(Pa); // 将Pa重置为空表
Pa.head=Pc.head;
Pa.tail=Pc.tail;
Pa.len=Pc.len;
}
// main2-7.cpp 检验bo2-7.cpp的主程序
#include"c1.h"
#include"c2-6.h"
#include"bo2-7.cpp"
void main()
{
polynomial p,q;
int m;
printf("请输入第1个一元多项式的非零项的个数:");
scanf("%d",&m);
CreatPolyn(p,m);
printf("请输入第2个一元多项式的非零项的个数:");
scanf("%d",&m);
CreatPolyn(q,m);
AddPolyn(p,q);
printf("2个一元多项式相加的结果:\n");
PrintPolyn(p);
printf("请输入第3个一元多项式的非零项的个数:");
scanf("%d",&m);
CreatPolyn(q,m);
AddPolyn1(p,q);
printf("2个一元多项式相加的结果(另一种方法):\n");
PrintPolyn(p);
printf("请输入第4个一元多项式的非零项的个数:");
scanf("%d",&m);
CreatPolyn(q,m);
SubtractPolyn(p,q);
printf("2个一元多项式相减的结果:\n");
PrintPolyn(p);
printf("请输入第5个一元多项式的非零项的个数:");
scanf("%d",&m);
CreatPolyn(q,m);
MultiplyPolyn(p,q);
printf("2个一元多项式相乘的结果:\n");
PrintPolyn(p);
DestroyPolyn(p);
}

运行结果如下:

一元多项式的表示及相加(抽象数据类型Polynomial的实现)的更多相关文章

  1. 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

    一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

  2. Week1绪论--抽象数据类型

    一.作业题目 1.构造有理数T,元素e1,e2分别被赋以分子.分母值 2.销毁有理数T 3.用e(引用类型参数)返回有理数T的分子或分母,当入参i为1时返回分子, i为2是返回分母. 4.将有理数T的 ...

  3. 抽象数据类型ADT

    ADT(Abstract Data Type) 类型由什么组成? 一个类型(type)指定两类信息,一个属性集和一个操作集. 假设要定义一个新的数据类型.首先,要提供存储数据的方式,可能是通过设计一个 ...

  4. C语言泛型编程--抽象数据类型

    一.数据类型: 在任何编程语言中,数据类型作为一个整体,ANSI-C包含的类型为:int.double.char……,程序员很少满意语言本身提供的数据类型,一个简单的办法就是构造类似:array.st ...

  5. ORACLE抽象数据类型

    ORACLE抽象数据类型 *抽象数据类型*/1,抽象数据类型 概念包含一个或多个子类型的数据类型不局限于ORACLE的标准数据类型可以用于其他数据类型中 2,创建抽象数据类型 的语法(必须用NOT F ...

  6. ADT(abstract data types)抽象数据类型

    1.What is it? An abstract data type is a set of objects together with a set of operations. 抽象数据类型是带有 ...

  7. 数据结构 集合_集合(数学)抽象数据类型的C语言实现

    链表是实现集合的一种理想的方式.将List以typedef的方式重命名为Set.这样做能保留链表简洁的特性,还能使集合具有了一些多态的特性. 使用这种方法的最大好处就是可以使用list_next来遍历 ...

  8. 【Python&数据结构】 抽象数据类型 Python类机制和异常

    这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Pyt ...

  9. DS博客作业01--日期抽象数据类型设计与实现

    1.思维导图及学习体会 1.1第一章绪论知识点思维导图 1.2 学习体会 这次博客园和大作业是我在编程学习中的有意义的进步,第一次尝试使用vs,并且通过同学的一些网站的推荐,和热心同学的帮忙,简单学会 ...

随机推荐

  1. spring开篇

    本文引用http://www.cnblogs.com/ityouknow/p/5292559.html spring简介: spring是一个开源框架,spring是于2003 年兴起的一个轻量级的J ...

  2. web前端工程师面试技巧 常见问题解答

    web前端工程师面试技巧 常见问题解答 每年的春招是各企业需求人才的黄金时期,不少的前端大牛或者前端新手在面试时候不知道怎么来回答面试官的问题,下面来看下我转载的这篇文章吧,希望对从事前端工作的你有所 ...

  3. ECSHOP快递物流单号查询插件

    本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅急送快递.德邦物流.百世快递.汇通快递.中通快递.天天快递等知 ...

  4. C语言进阶——循环语句07

    循环语句的基本工作方式: 通过条件表达式判定是否执行循环体 条件表达式遵循if语句表达式的原则 do,while,for的区别: do语句先执行后判断,循环体至少执行一次 while语句先判断后执行, ...

  5. C# 创建新线程

    首先需要包含命名空间 using System.Threading; 然后创建进程 Thread th = new Thread(new ThreadStart(ThreadMethod)); //创 ...

  6. Color Length UVA - 1625 DP

    题目:题目链接 题意:输入两个长度分别为n和m的颜色序列,要求按顺序合并成同一个序列,即每次可以把一个序列开头的颜色放到新序列的尾部.对于每个颜色c来说,其跨度L(c)等于最大位置和最小位置之差,输出 ...

  7. python基础之数据类型与变量patr1

    1:编写for循环,利用索引遍历出每一个字符 msg='hello egon 666' 2:编写while循环,利用索引遍历出每一个字符 msg='hello egon 666' 3:msg='hel ...

  8. TouTiao开源项目 分析笔记12 从总体到局部 构建视频主页面

    1.构建视频主列表的整体碎片VideoTabLayout 1.1.首先创建一个VideoTabLayout package com.jasonjan.headnews.module.video; im ...

  9. 5,MongoDB 之 "$" 的奇妙用法

    在MongoDB中有一个非常神奇的符号 "$" "$"  在 update 中 加上关键字 就 变成了 修改器 其实 "$" 字符 独立出现 ...

  10. Windows系统搭建Mysql Cluster集群

    简单介绍一下MySQL集群涉及的三种节点:     管理节点(也可以称管理服务器)是整个集群环境的核心,类似于集群中起调度作用的枢纽,由它来负责管理其它节点(数据节点和SQL节点)的开启.关闭或重启某 ...