#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct Node
{
float coef;//系数
int expo;//指数
};
struct Polynomial
{
struct Node element;
struct Polynomial *next;
};

typedef struct Polynomial Polynomial;
typedef struct Polynomial *PLink;
typedef PLink Polynode;//为了自己写着方便的一系列坑爹货

void initial(Polynode p)//初始化链表
{
Polynode p1;
p1=p;
while(p1)
{
p1->next=NULL;
p1=p1->next;
}
p=p1;
}

int judgeSame(Polynode p1,Polynode p2)//判断两项中的指数是否相等
{
Polynode p;
p=p1->next;

while(p!=NULL && p->element.expo != p2->element.expo)
p=p->next;
if(p==NULL)
return 0;
return 1;//指数相同返回1,否则返回0

}

void createPolynomial(Polynode p)//建立链表储存多项式
{
int i=0,n=0;
Polynode p2,setPo;

if(p!=NULL)
{
initial(p); //初始化
}

printf("请输入要创建的项数:");
scanf("%d",&n);

for(i=1;i<=n;i++)
{
setPo = (Polynode)malloc(sizeof(Polynomial));
initial(setPo);
printf("请输入第%d项的指数:",i);
scanf("%d",&setPo->element.expo);

if(setPo->element.expo<0)//指数为负数时提示错误
{
printf("你的输入有误,指数不能为负数,请重新输入!\n");
scanf("%d",&setPo->element.expo);
}

printf("请输入第%d项的系数:",i);
scanf("%f",&setPo->element.coef);

while(p->next!=NULL && p->next->element.expo > setPo->element.expo)
p=p->next;
p2=p->next;

if(!judgeSame(p,setPo))//判断新输入的项是否已经存在
{
p->next=setPo;
setPo->next=p2;
}
else
{
printf("您输入的多项已经存在,请重新输入!\n");
createPolynomial(p);
break;
}
}

}
void Output(Polynode p)//输出加法运算后的链表
{
p=p->next;

while(p!=NULL)
{
printf("%.1fX^%d",p->element.coef,p->element.expo);
p=p->next;
if(p!=NULL)
if(p->element.coef > 0)
{
printf(" + ");//这样结尾处就没有加号了
}
}
}

void Attach(float c,int e,Polynode p)//将一个链表链入另一个链表
{
Polynode x;
x = (Polynode)malloc(sizeof(Polynomial));

x->element.expo = e;
x->element.coef = c;
p->next = x;
}

void addPoly(Polynode p1,Polynode p2,Polynode p)
{
Polynode temp;
temp = (Polynode)malloc(sizeof(Polynomial));
temp=p;
p1=p1->next;
p2=p2->next;

while(p1!=NULL && p2!=NULL)
{
if(p1->element.expo > p2->element.expo)
{
Attach(p1->element.coef,p1->element.expo,temp);
p1=p1->next;
temp=temp->next;
}
else if(p1->element.expo < p2->element.expo)
{
Attach(p2->element.coef,p2->element.expo,temp);
p2=p2->next;
temp=temp->next;
}
else
{
p1->element.coef = p1->element.coef + p2->element.coef;

if(p1->element.coef!=0)
{
temp->next=p1;
p1=p1->next;
p2=p2->next;
temp=temp->next;
}
}
}
while(p1!=NULL)//将剩余的p1全部链入p
{
Attach(p1->element.coef,p1->element.expo,temp);
p1=p1->next;
temp=temp->next;
}
while(p2!=NULL)//将剩余的p2全部链入p
{
Attach(p2->element.coef,p2->element.expo,temp);
p2=p2->next;
temp=temp->next;
}
p=temp;
p->next=NULL;//不然结尾处还有个加号,而且会崩
}

void subPoly(Polynode p1,Polynode p2,Polynode p)//多项式的减法,p=p1-p2
{
Polynode temp,pd;
temp = (Polynode)malloc(sizeof(Polynomial));
pd = (Polynode)malloc(sizeof(Polynomial));
temp=p;
p2=p2->next;
p1=p1->next;

while(p1!=NULL && p2!=NULL)
{
if(p1->element.expo > p2->element.expo)
{
Attach(p1->element.coef,p1->element.expo,temp);
p1=p1->next;
temp=temp->next;
}
else if(p1->element.expo < p2->element.expo)
{
Attach(-(p2->element.coef),p2->element.expo,temp);//被减数的系数要取反
p2=p2->next;
temp=temp->next;
}
else
{
p1->element.coef = p1->element.coef - p2->element.coef;

if(p1->element.coef!=0)
{
Attach(p1->element.coef,p1->element.expo,temp);
p1=p1->next;
p2=p2->next;
temp=temp->next;
}
else
{
pd->next=p1;//如果这一项系数为零,则删除此节点
pd=p1->next;
p1=p1->next;
p2=p2->next;

}
}
}
while(p1!=NULL)//将剩余的p1全部链入p
{
Attach(p1->element.coef,p1->element.expo,temp);
p1=p1->next;
temp=temp->next;
}
while(p2!=NULL)//将剩余的p2全部链入p,且要反转系数
{
p2->element.coef =0 -(p2->element.coef);
Attach(p2->element.coef,p2->element.expo,temp);
p2=p2->next;
temp=temp->next;
}
p=temp;
p->next=NULL;//不然结尾处还有个加号,而且会崩
}

void menu()
{
int i;

printf("                                                                               \n");
printf("++++++++++++++++++++++++++++++++++O(∩_∩)O~+++++++++++++++++++++++++++++++++++\n");
printf("+                                                                             +\n");
printf("+                          一元多项式的加减法运算                             +\n");
printf("+                                                                             +\n");
printf("+                                                                             +\n");
printf("+                                1.加法运算                                   +\n");
printf("+                                                                             +\n");
printf("+                                2.减法运算                                   +\n");
printf("+                                                                             +\n");
printf("+                                3.退出系统                                   +\n");
printf("+                                                                             +\n");
printf("+                                                                             +\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
}

int main()
{
Polynode p;
Polynode L,sum,subp;
int c;

p=(Polynode)malloc(sizeof(Polynomial));
L=(Polynode)malloc(sizeof(Polynomial));
sum =(Polynode)malloc(sizeof(Polynomial));
subp=(Polynode)malloc(sizeof(Polynomial));

menu();
printf("选择功能:");
scanf("%d",&c);
switch(c)
{
case 1:
createPolynomial(p);
printf("您输入的多项式为:");
Output(p);
printf("\n");

createPolynomial(L);
printf("您输入的多项式为:");
Output(L);
printf("\n");

printf("多项式相加之和为:");
addPoly(p,L,sum);
Output(sum);
printf("\n");
break;
case 2:
createPolynomial(p);
printf("您输入的多项式为:");
Output(p);
printf("\n");

createPolynomial(L);
printf("您输入的多项式为:");
Output(L);
printf("\n");

printf("多项式相减之和为:");
subPoly(p,L,subp);
Output(subp);
printf("\n");
break;
case 3:
exit(0);
break;
}

return 0;
}

C语言实现一元多项式的加减运算相关推荐

  1. c语言中减号算一个字符吗,C语言中指针的加减运算

    char arr[3]; printf("arr:\n%d\n%d\n%d\n", arr, arr + 1, arr + 2); char *parr[3]; printf(&q ...

  2. 用c语言实现复数的加减运算及复数的显示

    #include<stdio.h> int main(void) {int a[2],b[2],c[2],d[2];//存储实部肯虚部和结果 printf("请输入第一个复数的实 ...

  3. oracle时间怎么相加减,Oracle 如何对时间进行简单加减运算

    在我们用dbms_job包进行定时Job的时候,需要设置时间间隔,所以需要知道时间的基本加减方法. SQL> alter session set nls_date_format='yyyy-mm ...

  4. 一元多项式的加减 c语言链表实现

    一元多项式的加减 c语言链表实现 1.题目 实现一元多项式的加减法运算,要求多项式采用链表存储结构. 2.测试用例 (1)a(x)=3x^1000 +7x^3-2x+1 b(x)=x^99 -x^3+ ...

  5. C语言(CED)编写一个程序,求两个字符之间的加减运算。

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 复习C语言,不同的心境遇到了不同的问题: 问题: 编写一 ...

  6. c语言任意两个整数相减_大整数加减运算的C语言实现

    大整数加减运算的 C 语言实现 一 . 问题提出培训老师给出一个题目:用 C 语言实现一 个大整数计算器.初步要求支持大整数的加.减运算,例如 8888888888888+1112=888888889 ...

  7. 【Computer Organization笔记06】浮点数的数据表示,浮点数加减运算

    本次笔记内容: P11 计算机组成原理(11) P12 计算机组成原理(12) 本节课对应幻灯片:组成原理13 data,第72页起.此外,本节课内容"浮点数"已经在"汇 ...

  8. 2.3.2 浮点数的加减运算

    加油哦棒棒哒(●• ̀ω•́ )✧取快递 要如何实现浮点数的运算呢?所以这个小节我们要探讨的是浮点数如何实现加减运算,那除了加减运算的实现之外,我们还会探讨浮点数,还有定点数之间的一个强制类型转换的问 ...

  9. 矩阵的加减乘c语言程序,C语言实现的矩阵加减乘法运算系统

    C语言实现的矩阵加减乘法运算系统 /*本矩阵运算系统可以完成矩阵的加.减.乘法,但是只限于方阵*/ #include<stdio.h> #include<math.h> /*- ...

最新文章

  1. MySQL binlog
  2. 【工作经验分享】mysql备份恢复命令
  3. 敏捷宣言和企业Scrum作者Mike Beedle去世
  4. 产品推广系统推荐乐云seo_优化推广公司红利产品推荐“爱采购cpc竞价版”
  5. Unix 文件系统读写时权限校验
  6. 第二十节: 深入理解并发机制以及解决方案(锁机制、EF自有机制、队列模式等)
  7. 比较两个对象中全部属性值是否相等
  8. ArcObjects操作PageLayoutControl中元素位置,以图框、ITextSymbol为例
  9. 打印系统开发(42)——静默打印
  10. echarts 中国地图,tooltip,legend同时显示多组数据
  11. 对数幅度谱图像matlab,fft2绘制图像的对数幅度谱,比较图像旋转平移和缩放后的频谱.doc...
  12. Helio Protocol — 分布式代币借贷和流动性质押协议
  13. html怎么实现计算bmi,利用Javascript实现BMI计算器
  14. 魔方自动还原程序3D版本和2D 修正版
  15. 刷了 1000 多道算法题,一点小小的心得!
  16. c#读取Excel表数据
  17. 芝士满满:TikTok快速吸粉视频技巧
  18. 数据库删除字段指定字符前面或者后面的字符串
  19. nova3安装android10系统,一招搞定安卓机“久用必卡”顽疾:华为nova3i配备6GB超大运存...
  20. 下一个十年,区块链将如何厚“基”薄发?

热门文章

  1. 陈年咖啡豆是什么?陈年咖啡能喝吗?陈年咖啡有什么特别的?
  2. QT 设置label内字体,字体颜色,背景色 ; 字体的中英对照
  3. 请帮我写一封情书,500字左右
  4. 热议!211高校近200名硕博新生开学无宿舍住,需校外租房...
  5. Java利用公式求自然对数的底e
  6. 偶尔也需要强烈的孤独
  7. 【luogu P5320】勘破神机(数学)(数列特征方程)(第一类斯特林数)
  8. 5. Linux C 输入输出与文件
  9. SGD(随机梯度下降)
  10. matlab 死区,MATLAB对AC/DC/AC电源的死区效应谐波仿真