一元稀疏多项式计算器 【 数据结构课设 】 仿真界面 + 代码详解

您所在的位置:网站首页 一元多项式相减数据结构 一元稀疏多项式计算器 【 数据结构课设 】 仿真界面 + 代码详解

一元稀疏多项式计算器 【 数据结构课设 】 仿真界面 + 代码详解

2024-07-13 04:17| 来源: 网络整理| 查看: 265

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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img 最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

“道路是曲折的,前途是光明的!”

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取! ,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img 最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

“道路是曲折的,前途是光明的!”

[外链图片转存中…(img-dDCuW7Ch-1712264999654)]

[外链图片转存中…(img-bzsl08mE-1712264999654)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3