一元稀疏多项式计算器 【 数据结构课设 】 仿真界面 + 代码详解 |
您所在的位置:网站首页 › 一元多项式相减数据结构 › 一元稀疏多项式计算器 【 数据结构课设 】 仿真界面 + 代码详解 |
3.一元稀疏多项式的打印和计算在x处的值
问题描述
设计一个一元稀疏多项式简单计算器。 基本要求(1)输入并建立多项式。 (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci,ei分别是第i 项的系数和指数,序列按指数降序排列。 (3)实现多项式a和b相加,建立多项式a+b。 (4)实现多项式a和b相减,建立多项式a-b。 (5)计算多项式在x处的值。 (6)计算器的仿真界面。 测试数据博客地址: 一元稀疏多项式计算器仿真界面版 相关代码不带界面,只包含数据结构的设计。 #define _CRT_SECURE_NO_WARNINGS #include #include #include #include typedef struct Polynomial //多项式 { float coef; //系数 int expn; //指数 struct Polynomial *next;//指针 } Polynomial, *Polyn; //创建一个头指针为head,项数为m的一元多项式 Polyn CreatPolyn(Polyn head, int m) { head = (Polyn)malloc(sizeof(struct Polynomial)); head->next = NULL; for (int i = 1; i coef, &p->expn);if (p->coef == 0) free§; else { Polyn q1, q2; q1 = head; q2 = head->next; while (q2 != NULL && p->expn < q2->expn) { q1 = q2; q2 = q2->next; } if (q2 != NULL && p->expn == q2->expn) { q2->coef += p->coef; if (q2->coef == 0) { q1->next = q2->next; free(q2); } free§; } else { p->next = q2; q1->next = p; } } } return head; } void printPoLlyn(Polyn head) { Polyn q = head->next; int flag = 0; //记录是否为第一项 if (!q) { puts(“0”); puts(“\n”); return; } while (q) { if (q->coef > 0 && flag == 1) { printf(“+”); } flag = 1; if (q->coef != 1 && q->coef != -1) { printf(“%g”, q->coef); if (q->expn == 1) printf(“x”); else if (q->expn!=0) printf(“x^%d”, q->expn); } else { if (q->coef == 1) { if (q->expn == 0) printf(“1”); else if (q->expn == 1) printf(“x”); else printf(“x^%d”, q->expn); } if (q->coef == -1) { if (q->expn == 0) printf(“-1”); else if (q->expn == 1) printf(“-x”); else printf(“-x^%d”, q->expn); } } q = q->next; } printf(“\n”); } int compare(Polyn a, Polyn b)//比较两个多项式的大小 { if (a&&b) // 多项式a和b均不为空 { if (a->expn > b->expn) return 1;// a的指数大于b的指数 else if (a->expn < b->expn) return -1; else return 0; } else if (!a&&b) return -1; //a为空,b不为空 else if (a&&!b) return 1; //b为空,a不为空 else if (!a&&!b)return 0; //a,b均为空 } Polyn addPolyn(Polyn a, Polyn b) //求解a+b,并返回头结点head { Polyn head ,qc; Polyn qa = a->next; Polyn qb = b->next; Polyn hc=(Polyn)malloc(sizeof(Polynomial)); hc->next = NULL; head = hc; while (qa || qb) { qc= (Polyn)malloc(sizeof(Polynomial)); if (compare(qa, qb) == 1) { qc->coef = qa->coef; qc->expn = qa->expn; qa = qa->next; } else if (compare(qa, qb) == 0) //指数相同,直接相加 { qc->coef = qa->coef + qb->coef; qc->expn = qa->expn ; qa = qa->next; qb = qb->next; } else { qc->coef = qb->coef; qc->expn = qb->expn; qb = qb->next; } if (qc->coef != 0) //将该节点插入链表中 { qc->next = hc->next; hc->next = qc; hc = qc; } else free(qc); } return head; } Polyn subPolyn(Polyn a, Polyn b) { Polyn h = b; Polyn p = b->next; while§ { p->coef *= -1; p = p->next; } Polyn head = addPolyn(a, h); for (Polyn i = h->next; i != 0; i = i->next) { i->coef *= -1; } return head; } double value(Polyn head, int x) //计算x的值 { double sum = 0; for (Polyn p = head->next; p != 0; p = p->next) { int tmp = 1; int expn = p->expn; while(expn != 0) //指数不为0 { if (expn < 0) tmp /= x, expn++; else if(expn>0) tmp *= x, expn–; } sum += p->coef*tmp; } return sum; } int main() { int m; Polyn a = 0, b = 0; printf(“请输入a的项数:”); scanf(“%d”, &m); a = CreatPolyn(a, m); printPoLlyn(a); printf(“请输入b的项数:”); scanf(“%d”, &m); b = CreatPolyn(b, m); printPoLlyn(b); printf(“输出 a+b:”); printPoLlyn(addPolyn(a, b)); printf(“输出 a-b:”); printPoLlyn(subPolyn(a, b)); printf(“请输入x的值:”); int x; scanf(“%d”, &x); printf(“输出a的多项式的值为:%.2lf”, value(a,x)); return 0; } /* 测试数据: 3 2 1 5 8 -3.1 11 3 7 0 -5 8 11 9 1 */ 设计详解 1、一元稀疏多项式的建立结构体的定义 typedef struct Polynomial //多项式 { float coef; //系数 int expn; //指数 struct Polynomial *next;//指针 } Polynomial, *Polyn; 使用带头结点的单链表存贮多项式,插入查找和删除较为方便。数据域中存贮系数和指数,指针域指向下一个节点的位置。 如果所示的存贮结构: 设计思想: 首先确定好多项式的项数m,新建立一个节点p,用来存贮读入的系数coef和项数expn。然后再定义两个指针q1和q2,一前一后,分别指向多项式的两个相邻节点。为了实现多项式的降序排列,这里我们利用插入排序的思想,如果p和q2的指数相同,即p->expn == q2->expn,则进行两个节点的合并。如果p的指数小于q2的指数,即p->expn < q2->expn,继续后移两个指针。否则,p的指数小于q1的指数,大于q2的指数,我们找到了插入的位置,将p节点插入两个节点中。执行m次插入操作,就将一元稀疏多项式的建立好了。最后注意要将系数coef==0的节点释放。 定义两个指针: 找到了插入位置,将节点p插入 代码 //创建一个头指针为head,项数为m的一元稀疏多项式 void CreatPolyn(Polyn head, int m) { for (int i = 1; i coef, &p->expn);if (p->coef == 0) free§; //将系数为0的节点释放 else { Polyn q1, q2; //两个指针一前一后 q1 = head; q2 = head->next; while (q2 != NULL && p->expn < q2->expn) //p的指数小于q2的指数 { q1 = q2; //继续后移两个指针 q2 = q2->next; } if (q2 != NULL && p->expn == q2->expn) //将相同指数的项进行合并 { q2->coef += p->coef; //合并两项 if (q2->coef == 0) { q1->next = q2->next; 自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化! 由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新! 如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取) ![]() 按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。 学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。 “道路是曲折的,前途是光明的!” 《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取! ,真正体系化!** 由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新! 如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取) ![]() 按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。 学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。 “道路是曲折的,前途是光明的!” [外链图片转存中…(img-dDCuW7Ch-1712264999654)] [外链图片转存中…(img-bzsl08mE-1712264999654)] 《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |