一元多项式相加的算法和C++实现
2015-08-13 15:53
621 查看
利用顺序表的链式存储实现一元多项式的加法
一、数据结构
二、核心算法描述
1.创建一个空的链表,用作存储两个多项和的链表
2.调用SortList函数,给两个多项式按指数非递减的顺序给多项式排序
3.比较两个多项式链表的第一项的指数,如果链表a>b,则将较小指数的b的系数和指数复制到新建空结点s,再讲s链接到链表c的末尾;否则,换成a。如果a=b,则又分为两种情况:如果a的结点和b的结点的系数之和不为0,就将a和b的系数之和复制给s,将a或b任意一个的指数复制给s,再将s链接到c的末尾;如果为0,就跳过a和b的这两个结点,继续后面的比较。重复上述过程,知道任意一个链表为空为止。
4.如果a为空,就将b的后面部分复制给s,然后依次链接到c的末尾;如果b为空,就将a的后面部分复制给s,然后依次链接到c的末尾。
三、完整程序代码
四、实验截图
五、总结
暑假比较闲,所以自己就想这把大二学的数据结构的一些算法全部实现一遍,分享到网上,供大家交流学习。经过差不多半天的时间吧,自己先是好好研究了单链表的各种操作特性,然后分析了怎样用单链表存储多项式,怎样实现多项式的加法的各种细节,先在草稿纸上写了大概的伪代码,然后再敲代码实现,边敲代码,边思考每行每部分的功能联系,这样既能节约时间,也能尽量减少过程的代码产生。总之,这半天的时间没白费,自己收获很多,只有亲自动手实践,才能真正懂得一个知识点的内涵。所以,我也希望看到这篇文章的同学们也多多动手,亲自去实现自己的算法,这样自己才会慢慢收获一些东西,慢慢成长。
一、数据结构
<span style="font-size:18px;">struct PolyNode { float coef; //多项式的系数 int expn; //多项式的指数 PolyNode *next; //指向下一个结点的指针 };</span>
<span style="font-size:18px;">void InitList(PolyNode *&L) //初始化多项式单链表</span>
<span style="font-size:18px;">void InsertNode(PolyNode *&L, float c, int e, int i) //在多项式链表的第i个位置插入结点</span>
<span style="font-size:18px;">void print(PolyNode *L) //打印多项式</span>
<span style="font-size:18px;">void SortList(PolyNode *&L) //按指数非递减给多项式排序</span>
<span style="font-size:18px;">void CreateList(PolyNode *&L, float C[], int E[], int n) //创建多项式单链表</span>
<span style="font-size:18px;">PolyNode *AddPoly(PolyNode *L1, PolyNode *L2) //一元多项式相加</span>
二、核心算法描述
1.创建一个空的链表,用作存储两个多项和的链表
2.调用SortList函数,给两个多项式按指数非递减的顺序给多项式排序
3.比较两个多项式链表的第一项的指数,如果链表a>b,则将较小指数的b的系数和指数复制到新建空结点s,再讲s链接到链表c的末尾;否则,换成a。如果a=b,则又分为两种情况:如果a的结点和b的结点的系数之和不为0,就将a和b的系数之和复制给s,将a或b任意一个的指数复制给s,再将s链接到c的末尾;如果为0,就跳过a和b的这两个结点,继续后面的比较。重复上述过程,知道任意一个链表为空为止。
4.如果a为空,就将b的后面部分复制给s,然后依次链接到c的末尾;如果b为空,就将a的后面部分复制给s,然后依次链接到c的末尾。
三、完整程序代码
#include "stdafx.h" #include <iostream> using namespace std; /*实现一元多项式的加法*/ struct PolyNode { float coef; //多项式的系数 int expn; //多项式的指数 PolyNode *next; //指向下一个结点的指针 }; void InitList(PolyNode *&L) //初始化多项式单链表 { L = new PolyNode; //生成一个头结点 L->next = NULL; } void InsertNode(PolyNode *&L, float c, int e, int i) //在多项式链表的第i个位置插入结点 { PolyNode *p, *q; q = new PolyNode; q->coef = c; q->expn = e; q->next = NULL; p = L; int j = 1; while (j < i) //找到第i-1个结点,在它的后面插入结点 { p = p->next; ++j; } q->next = p->next; p->next = q; } void print(PolyNode *L) //打印多项式 { PolyNode *p; p = L->next; while (p != NULL) { cout << "(" << p->coef <<","<<p->expn<< ") "; p = p->next; } cout << endl; } void SortList(PolyNode *&L) //按指数非递减给多项式排序 { PolyNode *p, *q, *pre; p = L->next; L->next = NULL; while (p != NULL) { if (L->next == NULL) //处理第一个结点 { L->next = p; p = p->next; L->next->next = NULL; } else //处理剩余其他结点 { pre = L; q = pre->next; while (q && q->expn < p->expn) { pre = q; q = q->next; } q = p->next; p->next = pre->next; pre->next = p; p = q; } } } void CreateList(PolyNode *&L, float C[], int E[], int n) //创建多项式单链表 { int i; InitList(L); for (i = 0; i < n; i++) { InsertNode(L, C[i], E[i], i+1); } } PolyNode *AddPoly(PolyNode *L1, PolyNode *L2) //一元多项式相加 { PolyNode *pa, *pb, *s, *pc,*p; PolyNode *tc; //创建尾节点 pc = new PolyNode; pc->next = NULL; /*pc为新建单链表的头结点*/ tc = pc; /*tc始终指向新建单链表的最后结点*/ pa = L1->next; pb = L2->next; //获得多项式单链表的第一个结点 while (pa!=NULL && pb!=NULL) //pa,pb都不为空,就进行比较,否则,跳出while { if (pa->expn < pb->expn) //将*pa结点复制到*s并链到pc尾 { s = new PolyNode; s->coef = pa->coef; s->expn = pa->expn; s->next = NULL; tc->next = s; tc = s; pa = pa->next; } else if (pa->expn > pb->expn) //将*pb结点复制到*s并链到pc尾 { s = new PolyNode; s->coef = pb->coef; s->expn = pb->expn; s->next = NULL; tc->next = s; tc = s; pb = pb->next; } else //pa->expn=pa->expn时的情况 { if (pa->coef+pb->coef!=0) //如果相加系数之和不为0,则将新结点插在tc后面 { s= new PolyNode; s->coef = pa->coef + pb->coef; s->expn = pa->expn; s->next = NULL; tc->next = s; tc = s; } pa = pa->next; //跳过当前的结点,继续后面的结点的比较 pb = pb->next; } } //将尚未扫描完的余下结点复制并链接到pc单链表之后 if (pa != NULL) //pb为空 p = pa; else //pa为空 p = pb; while (p != NULL) { s = new PolyNode; s->coef = p->coef; s->expn = p->expn; s->next = NULL; tc->next = s; tc = s; p = p->next; } return pc; } int main() { PolyNode *La, *Lb, *Lc; float C1[] = { 3, 7, 9, 5 }, C2[] = { 8, 22, -9 }; int E1[] = { 1, 0, 8, 17 }, E2[] = { 1, 7, 8 }; InitList(La); InitList(Lb); InitList(Lc); CreateList(La, C1, E1, 4); CreateList(Lb, C2, E2, 3); cout << "原多项式为:" << endl; print(La); print(Lb); SortList(La); SortList(Lb); cout << "按指数非递减排序后的多项式:" << endl; print(La); print(Lb); cout << "多项式相加的结果为:" << endl; Lc = AddPoly(La,Lb); print(Lc); return 0; }
四、实验截图
五、总结
暑假比较闲,所以自己就想这把大二学的数据结构的一些算法全部实现一遍,分享到网上,供大家交流学习。经过差不多半天的时间吧,自己先是好好研究了单链表的各种操作特性,然后分析了怎样用单链表存储多项式,怎样实现多项式的加法的各种细节,先在草稿纸上写了大概的伪代码,然后再敲代码实现,边敲代码,边思考每行每部分的功能联系,这样既能节约时间,也能尽量减少过程的代码产生。总之,这半天的时间没白费,自己收获很多,只有亲自动手实践,才能真正懂得一个知识点的内涵。所以,我也希望看到这篇文章的同学们也多多动手,亲自去实现自己的算法,这样自己才会慢慢收获一些东西,慢慢成长。
相关文章推荐
- 黑马程序员———C语言———【指针】
- C/C++获取当前系统时间
- C++ Primer 学习笔记(第一章:开始)
- Bit Manipulation - Reverse Bits
- C语言中各种%的含义
- C/C++ 语言中的表达式求值
- C++ 多态性的理解
- 删除string两端的空白字符和横向制表符\t
- C语言常用代码(To be continue...)
- C语言函数调用性能测试
- C++中vector的用法实例解析
- 关于回调函数的几个例子
- I2C通信 EEPROM之写与读
- C语言初学关于for循环的自己的见解
- c++ 字符类型总结区别wchar_t,char,WCHAR(转)
- 通过boost::bind实现c++多线程
- C++常用字符串分割方法实例汇总
- c++ 变量的作用域
- C++ STL编程
- 【effective c++读书笔记】【第6章】继承与面向对象设计(3)