一元多项式计算器

一、实验目的
1.掌握顺序表和单链表的存储特点及插入、删除等算法。
2.灵活运用顺序表和单链表的相关算法实现一元多项式的计算。

二、 实验内容及要求
任务描述
设有一元多项式Am(x)和Bn(X),编程实现多项式Am(x)和Bn(x)的加法、减法和乘法运算。其中多项 式描述为:

Am(x)=A0+A1x1+A2x2+A3x3+….+Amxm;
Bn(x)=B0+B1x1+B2x2+B3x3+….+Bnxn。

程序源代码:

DS.h

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;

LinkList.h

#include <DS.h>
typedef struct LNode
{int data;int index;struct LNode *next;
}LNode, *LinkList;LinkList makeList();  //生成一个空链表
void Insert(LinkList L, int data, int index);  //添加
void Delete(LinkList L, LinkList position);    //删除
LinkList Find(LinkList L, int index);          //查找
LinkList makeFirstList();   //输入第一个多项式
LinkList makeSecondList();  //输入第二个多项式
LinkList sum(LinkList L1, LinkList L2);   //加法
LinkList sub(LinkList L1, LinkList L2);   //减法
LinkList mul(LinkList L1, LinkList L2);   //乘法
int getFlag();    //排序方式
void ascOrder(LinkList L);      //升幂排列
void descOrder(LinkList L);     //降幂排列
void exportResult(LinkList L,int flag);   //输出结果

LinkList.c

#include <LinkList.h>LinkList makeList()
{LinkList L = (LinkList)malloc(sizeof(struct LNode));L->data = 0;L->index = 0;L->next = NULL;return L;
}void Insert(LinkList L,int data,int index)
{LinkList p = L;LinkList q = (LinkList)malloc(sizeof(struct LNode));q->next = NULL;q->data = data;q->index = index;q->next = p->next;p->next = q;
}void Delete(LinkList L,LinkList position)
{LinkList p = L->next;LinkList q = L;while (p){if (p == position){q->next = p->next;free(p);break;}q = p;p = p->next;}
}LinkList Find(LinkList L, int index)
{LinkList p = L->next;while (p){if (p->index == index){return p;}p = p->next;}return NULL;
}LinkList makeFirstList()
{int n,data,index;LinkList L1 = makeList();printf("*************欢迎使用一元多项式计算器*************\n\n");printf("请输入第一个多项式的项数:\n");scanf("%d",&n);printf("请输入第一个多项式:\n");//printf("(注意:1^2+2^3 应表示为 1 2 2 3, 后面同理)\n");for(int i=0; i<n; i++){scanf("%d",&data);scanf("%d",&index);if(data != 0){Insert(L1,data,index);}}return L1;
}LinkList makeSecondList()
{int n,data,index;LinkList L2 = makeList();printf("请输入第二个多项式的项数:\n");scanf("%d",&n);printf("请输入第二个多项式:\n");for(int i=0; i<n; i++){scanf("%d",&data);scanf("%d",&index);if(data != 0){Insert(L2,data,index);}}return L2;
}LinkList sum(LinkList L1,LinkList L2)
{int data;LinkList L3 = makeList();LinkList p1 = L1->next;LinkList p2 = L2->next;LinkList p;LinkList q;while(p1!=NULL){p = Find(L2,p1->index);if(p!=NULL){data = p1->data + p->data;if(data == 0) {}elseInsert(L3,data,p1->index);q = p1;p1 = p1->next;Delete(L1,q);Delete(L2,p);}else{Insert(L3,p1->data,p1->index);q = p1;p1 = p1->next;Delete(L1,q);}}p1 = L1->next;p2 = L2->next;while(p2!=NULL){q = Find(L1,p2->index);if(q!=NULL){data = p2->data + q->data;Insert(L3,data,p2->index);p = p2;p2 = p2->next;Delete(L2,p);Delete(L1,q);}else{Insert(L3,p2->data,p2->index);p = p2;p2 = p2->next;Delete(L2,p);}}return L3;
}LinkList sub(LinkList L1,LinkList L2)
{LinkList L3 = makeList();LinkList p2 = L2->next;while(p2!=NULL){p2->data = (-1) * p2->data;p2 = p2->next;}L3 = sum(L1,L2);return L3;
}LinkList mul(LinkList L1,LinkList L2)
{int data,index;LinkList L3  = makeList();LinkList p1 = L1->next;LinkList p2 = L2->next;LinkList p;while(p1!=NULL){p2 = L2->next;while(p2!=NULL){data = p1->data * p2->data;index = p1->index + p2->index;p = Find(L3,index);if(data == 0){p2 = p2->next;continue;}if(p!=NULL){p->data += data;}else{Insert(L3,data,index);}p2 = p2->next;}p1 = p1->next;}return L3;
}int getFlag()
{int flag;printf("请输入排序方式:\n");printf("0.升幂\n");printf("1.降幂\n");scanf("%d",&flag);return flag;
}void descOrder(LinkList L)
{int data,index;LinkList p1 = L->next;LinkList p2 = L->next;while(p1!=NULL){p2 = L->next;while(p2!=NULL){if(p1->index > p2->index){data = p1->data;index = p1->index;p1->data = p2->data;p1->index = p2->index;p2->data = data;p2->index = index;}p2 = p2->next;}p1 = p1->next;}
}void ascOrder(LinkList L)
{int data,index;LinkList p1 = L->next;LinkList p2 = L->next;while(p1!=NULL){p2 = L->next;while(p2!=NULL){if(p1->index < p2->index){data = p1->data;index = p1->index;p1->data = p2->data;p1->index = p2->index;p2->data = data;p2->index = index;}p2 = p2->next;}p1 = p1->next;}
}void exportResult(LinkList L,int flag)
{if(flag == 0){ascOrder(L);  //升幂排列}else if(flag == 1){descOrder(L);  //降幂排列}printf("运算的结果为:\n");LinkList p = L->next;if(!p){printf("0 0");//零多项式输出0 0}else{while(p){//只有项的系数不为0时才能输出if(p->data != 0){//当指数为0时,只输出系数if(p->index==0) printf("%d",p->data);//系数和指数都为1,输出xelse if(p->data == 1 && p->index == 1) printf("x");//系数为-1,指数为1,输出-xelse if(p->data == -1 && p->index == 1) printf("-x");//系数为1,指数不为1,不输出系数else if(p->data == 1 && p->index != 1) printf("x^%d",p->index);//系数为-1,但是指数不为1,系数只输出-else if(p->data == -1 && p->index != 1) printf("-x^%d",p->index);//系数不是1或-1,指数为1,不输出指数else if((p->data != 1 || p->data != -1) && p->index == 1)  printf("%dx",p->data);//系数不是1或-1,指数不为1,系数和指数都输出else if((p->data != 1 || p->data != -1) && p->index != 1)  printf("%dx^%d",p->data,p->index);//如果有下一项且下一项的系数为大于0的数,则输出+if(p->next && p->next->data > 0) printf("+");p = p->next;}}}printf("\n");
}

main.c

#include <LinkList.h>
int main()
{char p;int flag;LinkList L1 = makeFirstList();LinkList L2 = makeSecondList();printf("请输入想要进行的运算:\n");getchar();scanf("%c",&p);flag = getFlag();switch(p){case '+'://printf("进行了加法运算!!!\n");exportResult(sum(L1,L2),flag);break;case '-'://printf("进行了减法运算!!!\n");exportResult(sub(L1,L2),flag);break;case '*'://printf("进行了乘法运算!!!\n");exportResult(mul(L1,L2),flag);break;}return 0;
}

测试:



求个赞。。。

一元多项式计算器C语言实现相关推荐

  1. 链表一元多项式计算器的实现(Java语言描述)

    链表的经典应用,程序在多项式相加同类项合并还有小的瑕疵,有待改进. 代码如下: package 一元多项式计算器;public class PolyNode {private double a; pr ...

  2. PTA 基础编程题目集 7-12 两个数的简单计算器 C语言

    PTA 基础编程题目集 7-12 两个数的简单计算器 C语言 本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加.减.乘.除或求余运算.题目保证输入和输出均不超过整型范围. 输入格式 ...

  3. 已知稀疏多项式C语言版,一元稀疏多项式计算器C语言课程设计

    <一元稀疏多项式计算器C语言课程设计>由会员分享,可在线阅读,更多相关<一元稀疏多项式计算器C语言课程设计(26页珍藏版)>请在人人文库网上搜索. 1.学号2014-2015学 ...

  4. 一元多项式加法c语言,C语言一元多项式加法.doc

    C语言一元多项式加法 //C语言数据结构_一元多项式加法#include #include #include #define OK 1#define ERROR 0typedef int Status ...

  5. 一元多项式计算器Java_一元多项式计算器代码.doc

    一元多项式计算器代码.doc 一元多项式计算器代码INCLUDEINCLUDEINCLUDETYPEDEFSTRUCTPOLYNODE{FLOATCOEF//系数INTEXP//指数STRUCTPOL ...

  6. 89c51c语言程序,89C51单片机计算器C语言程序.doc

    89C51单片机计算器C语言程序 89C51单片机[计算器]C语言程序 89C51单片机[计算器]C语言程序2010-12-15 16:54/*89C51单片机[计算器]C语言程序*/ /*P2位选P ...

  7. 数据结构题 3(一元多项式计算器)

    题目: 一元多项式运算器 (1)建立多项式. (2)输出多项式. (3) +,两个多项式相加,建立并输出和多项式. (4) -,两个多项式相减,建立并输出差多项式. 扩展: (5) *,多项式乘法. ...

  8. 一元多项式计算器(C语言实现)

    一.实验要求 二.代码实现 以下C语言代码实现了多项式的加减法.乘法.求导和顶点求值的功能. (水平有限,代码存在不规范之处) 编程环境:Window11 + Visual Studio #defin ...

  9. 线性代数计算器C语言(1)——计算行列式值

    用C语言编写一个简单的行列式计算程序 下面只是我构建整个线性代数计算器的其中一部分,完整的程序还在完善中. 它的功能就是计算一个n阶的方阵行列式: void Determinant(void) {fl ...

最新文章

  1. SQL0332N 不支持从源代码页 XXXX 到目标代码页 XXXX
  2. Navicat使用Instant Client创建连接到Oracle数据库的正确姿势
  3. sealos安装k8s集群注意事项:必须关闭任何形式的http_proxy代理
  4. 操作系统【连续式分配方式、隐式链接、显示链接、索引方式、混合索引、位示图、成组链接】
  5. 【C语言】控制台窗口图形界面编程(七):鼠标事件
  6. HTTPS性能分析小工具HTTPStat
  7. BaseRecyclerViewAdapterHelper结合autolayout使用
  8. java实现线程的方式_java多线程实现的四种方式
  9. 你的模型真的陷入局部最优点了吗?
  10. docker 添加端口映射_苟且偷生的程序猿没法摸鱼了,从docker搭建elasticsearch集群开始学习...
  11. python自动化办公真的好用吗-用 Python 自动化办公,我与大神之间的差距一下就拉小了...
  12. IT30: 30岁IT人CTOCIO职业生涯探讨(2009-2013)
  13. 计算机项目答辩评分标准,课题答辩评分标准是什么
  14. 苹果用计算机密码,苹果mac修改用户名与密码的方法 苹果电脑如何修改开机密码...
  15. 可以升级鸿蒙吗,魅族上船,鸿蒙有戏?
  16. 有关获取android唯一识别号IMEI的问题
  17. 什么是进程、线程、协程
  18. 我的2018 年终小结
  19. 服务器无线桥接怎么设置,高科路由器怎么设置无线中继 | 192路由网
  20. 要想成为一个开发组长,我个人认为要注意一下几点

热门文章

  1. Android使用Startup和Lifecycle打造一个单独的测试module
  2. Python--进程池与线程池
  3. html 下拉框搜索,下拉框搜索功能的实现
  4. docker创建容器共享目录
  5. Redis使用方法介绍
  6. 为什么说期货交易者依靠程序化交易系统接口才能获得成功
  7. 目标跟踪算法_Camshift函数(学习笔记)
  8. 【读书笔记】代码思考
  9. swap()函数实现变量值的交换
  10. 宝塔Nginx编译安装headers_more模块