[数据结构-严蔚敏版]P42多项式Polynomial的实现

在这里插入图片描述
在这里插入图片描述

大家如果发现代码有错误,麻烦评论告知一下!!!

下面的代码多项式相乘的算法实现并不是书上那种,书上那种我实在是看不懂,所以用了自己的方法写了相乘的算法,就是模拟手算过程,一个一个相乘。

代码如下:

#include <iostream>
using namespace std;typedef struct
{double coef;int expn;
}term,ElemType;typedef struct LNode
{ElemType data;LNode *next;
}*Link,*Position;typedef struct
{Link head, tail;int len;
}LinkList;typedef LinkList Polynomial;bool makeNode(Link &p, ElemType e)
{p = new LNode;if (!p) return false;p->data = e;p->next = nullptr;return true;
}void freeNode(Link &p)
{delete p;p = nullptr;
}bool initList(LinkList &L)
{L.head = new LNode;if (!L.head) return false;L.tail = L.head;L.head->next = nullptr;L.len = 0;return true;
}bool insFirst(Link h, Link s)
{s->next = h->next;h->next = s;return true;
}bool delFirst(Link h, Link &q)
{q = h->next;h->next = h->next->next;q->next = nullptr;return true;
}bool append(LinkList &L, Link s)
{L.tail->next = s;while (L.tail->next){L.tail = L.tail->next;L.len++;}return true;
}bool remove(LinkList &L, Link &q)
{LNode *s = L.head;while (s->next != L.tail){s = s->next;}q = L.tail;L.tail = s;s->next = nullptr;L.len--;return true;
}bool insBefore(LinkList &L, Link &p, Link s)
{LNode *q = L.head;while (q->next != p){q = q->next;}s->next = p;q->next = s;L.len++;return true;
}bool insAfter(LinkList &L, Link &p, Link s)
{s->next = p->next;p->next = s;p = s;L.len++;return true;
}bool setCurElem(Link &p, ElemType e)
{p->data = e;return true;
}ElemType getCurElem(Link p)
{return p->data;
}int polynLength(Polynomial &p)
{int j = 0;LNode *s = p.head->next;while (s){j++;s = s->next;}p.len = j;return p.len;
}bool listEmpty(LinkList &L)
{polynLength(L);if (L.len == 0) return true;else return false;
}Position getHead(LinkList L)
{return L.head;
}Position getLast(LinkList L)
{return L.tail;
}Position priorPos(LinkList L, Link p)
{LNode *s = L.head;while (s->next != p){s = s->next;}if (s == L.head){return nullptr;}return s;
}Position nextPos(LinkList L, Link p)
{return p->next;
}bool locatePos(LinkList L, int i, Link &p)
{int j = 1;LNode *s = L.head->next;if (i < 1 || i > L.len) return false;while (s && j < i){s = s->next;j++;}if (!s || j > i){return false;}p = s;return true;
}bool locateElem(LinkList L, ElemType e, Position &q,int(*compare)(ElemType, ElemType))
{LNode *s = L.head->next;while (s){if (compare(s->data, e) == 0){q = s;return true;}s = s->next;}s = L.head;while (s->next){if (compare(s->next->data, e) > 0){q = s;return false;}s = s->next;}q = s;return false;
}int cmp(term a, term b)
{if (a.expn < b.expn) return -1;else if (a.expn == b.expn) return 0;else if (a.expn > b.expn) return 1;
}void destroyPolyn(Polynomial &L)
{LNode *p = L.head;while (p){LNode *q = p;p = p->next;delete q;}L.tail = L.head = nullptr;
}void printPolyn(Polynomial p)
{LNode *s = p.head->next;int j = 1;int len = polynLength(p);while (s){if (s->data.expn == 0){cout << s->data.coef;}else{cout << s->data.coef << "x^" << s->data.expn;}if (j < len)cout << " + ";s = s->next;j++;}cout << endl;
}void createPolyn(Polynomial &p, int n)
{initList(p);LNode *s = nullptr;LNode *h = nullptr;LNode *q = nullptr;h = getHead(p);ElemType e;e.coef = 0.0;e.expn = -1;setCurElem(h, e);for (int i = 0; i < n; i++){cin >> e.coef >> e.expn;if (e.coef == 0.0)continue;if (!locateElem(p, e, q, cmp)){if (makeNode(s, e)){insFirst(q, s);}}}LNode *p1 = p.head;while (p1->next){p1 = p1->next;}p.tail = p1;
}void addPolyn(Polynomial &pa, Polynomial &pb)
{LNode *ha = getHead(pa);LNode *hb = getHead(pb);LNode *qa = nextPos(pa, ha);LNode *qb = nextPos(pb, hb);while (qa && qb){ElemType a = getCurElem(qa);ElemType b = getCurElem(qb);switch (cmp(a, b)){case -1:ha = qa;qa = nextPos(pa, qa);break;case 0:ElemType sum;sum.coef = a.coef + b.coef;sum.expn = a.expn;if (sum.coef != 0.0){setCurElem(qa, sum);ha = qa;}else{delFirst(ha, qa);freeNode(qa);}delFirst(hb, qb);freeNode(qb);qb = nextPos(pb, hb);qa = nextPos(pa, ha);break;case 1:delFirst(hb, qb);insFirst(ha, qb);qb = nextPos(pb, hb);ha = nextPos(pa, ha);break;}}if (!listEmpty(pb)) append(pa, qb);freeNode(hb);
}void subtractPolyn(Polynomial &pa, Polynomial &pb)
{LNode *ha = getHead(pa);LNode *hb = getHead(pb);LNode *qa = nextPos(pa, ha);LNode *qb = nextPos(pb, hb);while (qa && qb){ElemType a = getCurElem(qa);ElemType b = getCurElem(qb);switch (cmp(a, b)){case -1:ha = qa;qa = nextPos(pa, qa);break;case 0:ElemType sum;sum.coef = a.coef - b.coef;sum.expn = a.expn;if (sum.coef != 0.0){setCurElem(qa, sum);ha = qa;}else{delFirst(ha, qa);freeNode(qa);}delFirst(hb, qb);freeNode(qb);qb = nextPos(pb, hb);qa = nextPos(pa, ha);break;case 1:delFirst(hb, qb);insFirst(ha, qb);qb = nextPos(pb, hb);ha = nextPos(pa, ha);break;}}if (!listEmpty(pb)) append(pa, qb);freeNode(hb);
}void multiplyPolyn(Polynomial &pa, Polynomial &pb)
{Polynomial pc;initList(pc);LNode *ha = getHead(pa);LNode *hb = getHead(pb);LNode *qa = nextPos(pa, ha);LNode *qb = nextPos(pb, hb);LNode *s = nullptr;LNode *q = nullptr;ElemType e;while (qa){while (qb){e.coef = qa->data.coef*qb->data.coef;if (qa->data.expn!= 0 && qb->data.expn!=0)e.expn = qa->data.expn+qb->data.expn;if (qa->data.expn == 0){e.expn = qb->data.expn;}else if (qb->data.expn == 0){e.expn = qa->data.expn;}if (!locateElem(pc, e, q, cmp)){if (makeNode(s, e)){insFirst(q, s);}}else{q->data.coef += e.coef;}qb = nextPos(pb, qb);}qb = nextPos(pb, hb);qa = nextPos(pa, qa);}destroyPolyn(pa);destroyPolyn(pb);pa = pc;
}int main()
{Polynomial L,L1;int n;cin >> n;createPolyn(L, n);printPolyn(L);cin >> n;createPolyn(L1, n);printPolyn(L1);cout << polynLength(L) << endl;cout << polynLength(L1) << endl;multiplyPolyn(L, L1);printPolyn(L);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

number five

一、外单履行域业务熟悉 申请了各种权限 看了部分三号项目 熟悉测试流程&#xff0c;例如履行的一些工具&#xff0c;只是熟悉了平台&#xff0c;因为部分权限未申请&#xff0c;没有操作过测试。 对于三号项目概念还没成体系&#xff0c;但了解了相关测试任务。 中间件hsf…

.Net Core实战之基于角色的访问控制的设计

前言上个月&#xff0c;我写了两篇微服务的文章&#xff1a;《.Net微服务实战之技术架构分层篇》与《.Net微服务实战之技术选型篇》&#xff0c;微服务系列原有三篇&#xff0c;当我憋第三篇的内容时候一直没有灵感&#xff0c;因此先打算放一放。本篇文章与源码原本打算实在去…

[数据结构-严蔚敏版]P46栈的顺序存储表示

大家如果发现代码有错误&#xff0c;麻烦评论告知一下!!! 代码如下: #include <iostream> using namespace std;const int STACK_INIT_SIZE 100; const int STACKINCREMENT 10;typedef int ElemType;typedef struct {ElemType *base;ElemType *top;int stacksize; }S…

ProcessOn使用

文章目录1. 拥有一个账号;2.思维导图&#xff1a;快速添加主题&#xff1a;移动主题位置和排序用格式刷来复制主题样式善用右键菜单快捷键后续使用时再补充 ^ ^1. 拥有一个账号; 2.思维导图&#xff1a; 快速添加主题&#xff1a; 移动主题位置和排序 用格式刷来复制主题样式…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

[数据结构-严蔚敏版]P48栈的链式表示

代码如下: #include <iostream> using namespace std;typedef int ElemType;typedef struct SNode {ElemType data;SNode *next; }SNode;typedef struct {SNode *top; }SqStack;bool initStack(SqStack &s) {s.top nullptr;return true; }bool destroyStack(SqStac…

还有多少人不会用K8s?.NET高级高薪岗,开始要求了!

毫无疑问&#xff0c;Kubernetes已经成为容器编排事实标准。除了已经拥抱Kubernetes的Google、BAT、京东、奇虎360等巨头大厂外&#xff0c;更多的企业也都在向Kubernetes迁移。容器技术大势所趋&#xff0c;是互联网企业目前急需的技术人才之一&#xff0c;已成为运维工程师、…

[数据结构-严蔚敏版]P61ADT Queue的表示与实现(单链队列-队列的链式存储结构)

代码如下: #include <iostream> using namespace std;typedef int ElemType;typedef struct QNode {ElemType data;QNode *next; }QNode ,*QueuePtr;typedef struct {QueuePtr front;QueuePtr rear; }LinkQueue;bool initQueue(LinkQueue &q) {q.front q.rear new…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(七)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

[数据结构-严蔚敏版]P64循环队列-队列的顺序存储结构

代码如下: #include <iostream> using namespace std;const int MAXQSIZE 10;typedef int ElemType;typedef struct {ElemType *base;int front;int rear; }SqQueue;bool initQueue(SqQueue &q) {q.base new ElemType[MAXQSIZE];if (!q.base) return false;q.fron…

BeetleX.FastHttpApi之Vuejs扩展

非常喜欢用vuejs,但又不想花时间去搞nodejs和webpack之类的&#xff0c;所以才有了BeetleX.FastHttpApi.VueExtend这样一个组件&#xff1b;组件的主要功能就是可以实现在vs.net中编写*.vue并直接引用到服务中&#xff0c;这样对于我这个习惯在vs.net写服务应的带来极大的方便性…

C++的new、delete需要注意的一点:使用危险函数导致的越界CRT detected that the application wrote to memory after end of heap

new、delete需要注意的一个特性 正常情况new一个数组之后&#xff0c;用delete释放是没有问题的。但是当对new得到的堆区进行越界的写入操作&#xff08;读操作不会&#xff09;将会导致delete时出现段错误&#xff0c;无法进行删除。如下面的程序所示&#xff1a; 数组大小只…

数据结构与算法专题——第四题 字符串相似度

这篇我们看看 最长公共子序列 的另一个版本&#xff0c;求字符串相似度(编辑距离)&#xff0c;我也说过了&#xff0c;这是一个非常实用的算法&#xff0c;在DNA对比&#xff0c;网页聚类等方面都有用武之地。一&#xff1a;概念对于两个字符串 A 和 B&#xff0c;通过基本的增…

[数据结构-严蔚敏版]P71串的抽象数据类型的定义

代码如下: #include <iostream> #include <string> using namespace std;typedef struct {char *ch;int length; }String;bool initString(String &s) {s.ch nullptr;s.length 0;return true; }bool strAssign(String &s, const char *ch) {int len st…

三分钟学会.NET Core Jwt 策略授权认证

一.前言大家好我又回来了&#xff0c;前几天讲过一个关于Jwt的身份验证最简单的案例&#xff0c;但是功能还是不够强大&#xff0c;不适用于真正的项目&#xff0c;是的&#xff0c;在真正面对复杂而又苛刻的客户中&#xff0c;我们会不知所措&#xff0c;就现在需要将认证授权…

[数据结构-严蔚敏版]P65离散事件模拟(银行客户的离散事件驱动模拟程序)

写这个简单玩意&#xff0c;居然花费了我6小时&#xff0c;唉!!!&#xff0c;还是太菜了! 中间已经起了放弃的念头了&#xff0c;最后还是坚持下来了! 总结&#xff1a; (1)漏了p p->next (2)队列删除元素的时候&#xff0c;删除的是最后一个忘记特判。 (3)写的时候太急了…

[温故知新] 编程原则和模式

写了这么多年代码&#xff0c;依旧做不好一个项目做好一个项目是人力、产品、业务、技术、运营的结合&#xff0c;可能还叠加一点时机的因素&#xff0c;就我们码农而言&#xff0c;工作就是搬砖&#xff0c;实现产品&#xff0c; 给业务提供支撑。“给祖传代码加 BUG 修 BUG”…

IntelliJ IDEA中快捷键大全+出现的问题

参照 文章目录1.Ctrl2.Alt3.Shift4.Ctrl Alt5.Ctrl Shift6.Alt Shift7.Ctrl Shift Alt8.其他idea如何将设置包名展开当出现右键&#xff0c;没有创建包选项时idea没有maven图标安装mysql和idea配置idea查看代码的最近修改人及时间1.Ctrl 快捷键介绍Ctrl F在当前文件进行…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

[数据结构-严蔚敏版]P95矩阵压缩-特殊矩阵的存储(对称矩阵,三角矩阵)

对称矩阵的存储&#xff1a; 代码如下: #include <iostream> using namespace std;int main() {int n;cin >> n;int *a;a new int[(n*(n 1)) / 2];for (int i 0; i < (n*(n 1)) / 2; i){cin >> a[i];}for (int i 1; i < n; i){for (int j 1; j…