一元多项式的表示及相加 【链表的应用】
来源:互联网 发布:java微信网页授权demo 编辑:程序博客网 时间:2024/04/29 00:18
#include <iostream>#include <cstdio>#include <stdlib.h>using namespace std;struct Node {double coef;int expn;Node *next;};void CreatPolynomial(Node *&head, int n) //生成带表头结点的单链表,除头结点外另生成n个结点 {head = (Node *)malloc(sizeof(Node));head->coef = 0;head->expn = 0;head->next = NULL; //初始化头结点 cout << "请输入各项系数及指数:"<< endl;Node *p = head;for(int i = 0; i < n; i++) {p->next = (Node *)malloc(sizeof(Node)); //生成新结点,尾插入生成链表 p = p->next;cin >> p->coef >> p->expn;p->next = NULL;}}void PrintPolynomial(Node *&head){if(head->next == NULL) //结果是0时直接输出0 putchar('0'); else {for(Node *p = head->next; p != NULL; p = p->next){ if(p != head->next && p->coef >0) //当p非首项且指向的系数为正时才输出'+' putchar('+'); //之前只判定了p->coef >0 if(p->coef == 1){ //系数为1或-1时特殊处理 if(p->expn == 0)putchar('1'); //判断条件不能写在一起: } //if(p->coef == 1 && p->expn == 0) putchar('1'); else if(p->coef == -1)putchar('-');elsecout << p->coef; switch(p->expn){ //指数为0或1时特殊处理 case 0:break; case 1:putchar('x');break; default:p->expn < 0 ? printf("x^(%d)", p->expn) : printf("x^%d", p->expn); // 指数小于0时打括号 break;}}}cout << endl;} void Free(Node *&head){Node *q = NULL;for(Node *p = head; p != NULL; p = q){q = p->next;free(p);}}char cmp(int a, int b){if(a > b)return '>';if(a < b)return '<';return '=';}void AddPolynomial(Node *&pA, Node *&pB) //传进两个链表的头指针 {Node *ha = pA;Node *hb = pB;Node *qa = ha->next; //ha, hb分别跟在qa, qb的后一位置 Node *qb = hb->next; //qa, qb分别指向Pa, Pb中当前比较元素 while(qa && qb){double sum = 0;int a = qa->expn;int b = qb->expn;switch( cmp(a, b) ){ case '<':ha = qa;qa = qa->next; //非ha = ha->next; break; case '=':sum = qa->coef + qb->coef;if(sum != 0.0) {qa->coef = sum;ha = qa; }else {if(ha->next != qa)cout << "Error: ha->next != qa" << endl;ha->next = ha->next->next; //删除和为0的结点,ha不变,还在qa后一位置 free(qa);}if(hb->next != qb)cout << "Error: hb->next != qb" << endl;hb->next = hb->next->next;free(qb);qb = hb->next;qa = ha->next;break; case '>':hb->next = hb->next->next; //删除qb指向的结点 qb->next = ha->next; //将qb插入ha后qa前 ha->next = qb; qb = hb->next; //not qb = ha->next ha = ha->next;break; default:cout << "Error!" << endl;break;}}if(qb)ha->next = qb;free(hb);} int main(){ //freopen("cin.txt", "r", stdin); Node *A = NULL;Node *B = NULL;int lenA;int lenB;while(cout << "请输入A的项数:" << endl, cin >> lenA) {CreatPolynomial(A, lenA); //生成A链表 cout << "请输入B的项数:" << endl; //生成B链表 cin >> lenB;CreatPolynomial(B, lenB); cout << " A = "; //输出A链表 PrintPolynomial(A);cout << " B = "; //输出B链表 PrintPolynomial(B); AddPolynomial(A, B); //A = A + B cout << "A+B= ";PrintPolynomial(A); //输出和 cout << endl; Free(A); //务必释放结点 }return 0;}
0 0
- 一元多项式的表示及相加 【链表的应用】
- 一元多项式的表示及相加
- 2.4 一元多项式的表示及相加
- 2.4一元多项式的表示及相加
- 一元多项式的表示及相加
- 一元多项式的表示及相加
- 数据结构 一元多项式的表示及相加
- 一元多项式的表示及相加 数据结构
- 链表做的一元多项式表示及相加
- 一元多项式的相加及表示
- 2.4一元多项式的表示及相加
- 线性表的应用---一元多项式的表示与相加
- 线性表实现一元多项式的表示及相加
- Polynomial 一元多项式的表示及相加 (线性链表实现 严蔚敏版)
- 算法:一元多项式的表示及相加(链表实现)-数据结构(4)
- 2007.08.25一元多项式的表示及相加
- 一元N次多项式的表示及相加
- 【无浪】一元多项式的表示及相加
- 关于socket的readLine和read问题
- 6.x版本centos虚拟机安装和U盘安装
- 深入学习理解jQuery中的extend方法以及JavaScript中对象的复制
- 输入一个int型数据,计算出该int型数据在内存中存储时1的个数。
- Eclipse 安装spring插件
- 一元多项式的表示及相加 【链表的应用】
- Java大文件按行切割
- 如何计算IP地址
- Linux下tcp并发服务器的几种设计的模式套路
- 汇编后缀导致了编译错误(一个极难发现的错误)
- 八皇后问题
- 织梦批量删除文章栏目数据
- [Leetcode题解]002 Add Two Numbers
- 移动web相关学习(二)——WebView的学习(2)