一元多项式的表示及相加 【链表的应用】
2015-07-02 09:46
441 查看
#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('-'); else cout << 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; }
相关文章推荐
- 1: installing nodejs
- 联网查看图片
- 运维入门
- ThreadLocal原理分析
- raw数据结构
- 图像滤波函数imfilter函数的应用及其扩展
- IOS8添加启动图
- Android开源项目分类
- PHP+JS实现大规模数据提交的方法
- vim全局替换命令
- snmp snmp4j的使用
- LeetCode "Kth Smallest Element in a BST"
- 比较CABAC与CAVLC
- Linked vs. Embedded Resources(链接的资源与嵌入的资源)
- mysql学习4:select,update,insert,delete
- 启动/关闭oracle服务有三种方式
- 构建自己的AngularJS,第一部分:作用域和digest 转摘:http://www.ituring.com.cn/article/39865
- 模板引擎freemarker的简单使用教程
- 序列化
- 使用 Capistrano 和写作 Ruby 迭代边缘部署