一元稀疏多项式简单计算器

  • 实验题目
  • 实验目的
  • 实验内容与要求
  • 实验内容和实验步骤
    • 需求分析
    • 概要设计
    • 调试分析
      • 调试过程中所遇到问题及解决方案
      • 算法的时空分析
  • 代码分析
    • 数据结构
    • 函数模块
      • 建立空多项式
      • 对多项式进行赋值
      • 将多项式A与多项式B相加
      • 计算多项式的长度
      • 打印多项式
      • 将多项式A与多项式B相乘
      • 释放多项式A所占空间
  • 源程序
  • 实验总结

实验题目

多项式乘法问题

实验目的

设计一个一元稀疏多项式1简单计算器。

实验内容与要求

(1)一元稀疏多项式简单计算器的基本功能是:输入并建立多项式;
(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,cn,en,其中n 是多项式的项数,ci 和ei 分别是第i 项的系数和指数,序列按指数降序排列。
(3)多项式 a 与多项式b 相乘,建立多项式。

实验内容和实验步骤

需求分析

(1)输入形式:
n
c1,e1
C2,e2
C3,e3

cn,en
其中n 是多项式的项数,ci 和ei 分别是第i 项的系数和指数,序列按指数降序进行输入。
(2)输出形式:
n,c1,e1,c2,e2,…,cn,en
其中n 是多项式的项数,ci 和ei 分别是第i 项的系数和指数,序列按指数降序排列。
(3)程序功能:
对输入的两个多项式a,b进行相乘,建立多项式保存结果并输出。

概要设计

本次实验中使用的数据结构是单链表,其中将ElemType定义为包含浮点数coef和整数expn的结构体,将链表名定义为polynomial2。主程序先两次调用CreatPolyn()和inputPolyn()建立多项式A,B;下来再调用MultiplyPolyn(A, B)计算多项式A与多项式B相乘的结果,并用C来保存该函数返回值;最后调用displayPolyn©,即按照输出形式打印C中的各个数据元素。由于本实验采取的思路是:将多项式相乘转化为多项式相加,即先将多项式A的第i个元素(i=1,2,3…n)与多项式B中的各个元素相乘后再相加得到第i个多项式,而后再对上述n个多项式相加得到最终结果,所以MultiplyPolyn(A, B)中调用了多项式相加的函数AddPolyn(A,B),而AddPolyn(A,B)中是将多项式相加的结果存入A中,多项式B失去用处,需要清理多项式B所占内存,故调用freePolyn(A)释放空间。

调试分析

调试过程中所遇到问题及解决方案

第一次编译运行时,因为没有编写freePolyn(A),所以电脑直接卡死,动弹不得。强制重启后,先将MultiplyPolyn(A,B)注释掉,运行成功,说明问题出现在在该函数或者该函数调用的函数AddPolyn(A,B)中,我再单独运行AddPolyn(A,B)发现运行正常,说明溢出应该是由于我没有释放内存,反复检查后,找到问题所在,两多项式相加后的结果存入其中一个多项式后,应将第二个多项式的空间释放掉,因此编写freePolyn(A)实现该功能。

算法的时空分析

该算法时间复杂度为O(n2),空间复杂度为O(n)。

代码分析

数据结构

typedef struct{float coef;int expn;
}term, ElemType;typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;//线性表定义typedef LinkList polynomial;

函数模块

//建立空多项式
polynomial CreatPolyn();
//对多项式进行赋值
polynomial inputPolyn(polynomial A);
//将多项式A与多项式B相加,返回值即为相加之和的多项式
polynomial AddPolyn(polynomial A, polynomial B);
//计算多项式的长度
int GetLength(polynomial A);
//打印多项式
void displayPolyn(polynomial A);
// 将多项式A与多项式B相乘,返回值即为相乘之积的多项式
polynomial MultiplyPolyn(polynomial A, polynomial B);
//释放多项式A所占空间
void freePolyn(polynomial A);

建立空多项式

polynomial CreatPolyn(){polynomial h;h = (polynomial)malloc(sizeof(LNode));h->next = NULL;return h;
}

对多项式进行赋值

polynomial inputPolyn(polynomial A){int n, i;LNode *pa = A;scanf("%d", &n);for(i = 0; i < n; i++){LNode *set;set = (polynomial)malloc(sizeof(LNode));scanf("%f,%d", &(set->data.coef), &(set->data.expn));set->next = NULL;pa->next = set;pa = pa->next;}return A;
}

将多项式A与多项式B相加

polynomial AddPolyn(polynomial A, polynomial B){//简化处理 if(B->next == NULL)return A;if(A->next == NULL)return B;LNode *pa = A->next, *pb = B->next, *pc;polynomial C;C = CreatPolyn();pc = C;while(pa != NULL && pb != NULL){LNode *temp;temp = (polynomial)malloc(sizeof(LNode));if(pb->data.expn > pa->data.expn){temp->data.expn = pb->data.expn;temp->data.coef = pb->data.coef;pc->next = temp;pc = pc->next;pc->next = NULL;pb = pb->next;}else if(pb->data.expn < pa->data.expn){temp->data.expn = pa->data.expn;temp->data.coef = pa->data.coef;pc->next = temp;pc = pc->next;pc->next = NULL;pa = pa->next;}else{temp->data.coef = pa->data.coef + pb->data.coef;temp->data.expn = pa->data.expn;pc->next = temp;pc = pc->next;pc->next = NULL;pa = pa->next;pb = pb->next;}}if(pa == NULL && pb != NULL){while(pb){LNode *temp;temp = (polynomial)malloc(sizeof(LNode));temp->data.expn = pb->data.expn;temp->data.coef = pb->data.coef;pc->next = temp;pc = pc->next;pc->next = NULL;pb = pb->next;}}else if(pa != NULL && pb == NULL){while(pa){LNode *temp;temp = (polynomial)malloc(sizeof(LNode));temp->data.expn = pa->data.expn;temp->data.coef = pa->data.coef;pc->next = temp;pc = pc->next;pc->next = NULL;pa = pa->next;}}
//  freePolyn(B);return C;
}

计算多项式的长度

int GetLength(polynomial A){if(A == NULL) {printf("The polynomial is empty.\n");exit(0);}LNode *pa = A->next;int n = 0;while(pa != NULL){n++;pa = pa->next;}return n;
}

打印多项式

void displayPolyn(polynomial A){if(A == NULL) {printf("The polynomial is empty.\n");exit(0);}LNode *pa = A->next;int n = GetLength(A);printf("%d", n);while(pa != NULL){printf(",%.2f,%d", pa->data.coef, pa->data.expn);pa = pa->next;}
//  printf("%.2f,%d\n", pa->data.coef, pa->data.expn);printf("\n");
}

将多项式A与多项式B相乘

polynomial MultiplyPolyn(polynomial A, polynomial B){//异常处理 if(A == NULL || B == NULL){printf("Polynomial A or B is empty.\n");exit(0);}LNode *pa = A->next, *pb, *p;polynomial C;C = CreatPolyn();//先将多项式A的第i个元素(i=1,2,3...n)//与多项式B中的各个元素相乘后再相加得到第i个多项式 while(pa != NULL){pb = B->next;polynomial temp;temp = CreatPolyn();//表示第i个多项式 LNode *pt = temp;//pt为temp的头指针 while(pb != NULL){LNode *set;//保存当前pa与pb所指数据元素相乘所得结果 set = (polynomial)malloc(sizeof(LNode));set->data.coef = pa->data.coef * pb->data.coef;set->data.expn = pa->data.expn + pb->data.expn;set->next = NULL;pt->next = set;//将set插入多项式temp中 pt = pt->next;pb = pb->next;}//每次计算出第i个多项式后,都将其与C进行相加 C = AddPolyn(C, temp);freePolyn(temp);pa = pa->next;}return C;
}

释放多项式A所占空间

void freePolyn(polynomial A){if(A == NULL) {printf("The polynomial is empty.\n");exit(0);}LNode *pa = A->next;while(pa->next != NULL){free(A);A = pa;pa = pa->next;}free(pa);
}

源程序

#include<stdio.h>
#include<stdlib.h>
typedef struct{float coef;int expn;
}term, ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode, *LinkList;typedef LinkList polynomial;
//建立空多项式
polynomial CreatPolyn();
//对多项式进行赋值
polynomial inputPolyn(polynomial A);
//将多项式A与多项式B相加,返回值即为相加之和的多项式
polynomial AddPolyn(polynomial A, polynomial B);
//计算多项式的长度
int GetLength(polynomial A);
//打印多项式
void displayPolyn(polynomial A);
// 将多项式A与多项式B相乘,返回值即为相乘之积的多项式
polynomial MultiplyPolyn(polynomial A, polynomial B);
//释放多项式A所占空间
void freePolyn(polynomial A);
int main(){//A,B为输入的多项式,C为相乘所得结果 polynomial A, B, C;int n;//建立多项式A A = CreatPolyn();printf("建立多项式A:\n");//输入多项式A的数据元素 A = inputPolyn(A);
//  displayPolyn(A);//建立多项式B B = CreatPolyn();printf("建立多项式B:\n");//输入多项式B的数据元素 B = inputPolyn(B);
//  displayPolyn(B);//将多项式A与多项式B相乘的结果存入C中 C = MultiplyPolyn(A, B);
//  printf("%d\n", GetLength(C));//打印多项式C displayPolyn(C);return 0;
}
polynomial CreatPolyn(){polynomial h;h = (polynomial)malloc(sizeof(LNode));h->next = NULL;return h;
}
polynomial inputPolyn(polynomial A){int n, i;LNode *pa = A;scanf("%d", &n);for(i = 0; i < n; i++){LNode *set;set = (polynomial)malloc(sizeof(LNode));scanf("%f,%d", &(set->data.coef), &(set->data.expn));set->next = NULL;pa->next = set;pa = pa->next;}return A;
}
void displayPolyn(polynomial A){if(A == NULL) {printf("The polynomial is empty.\n");exit(0);}LNode *pa = A->next;int n = GetLength(A);printf("%d", n);while(pa != NULL){printf(",%.2f,%d", pa->data.coef, pa->data.expn);pa = pa->next;}
//  printf("%.2f,%d\n", pa->data.coef, pa->data.expn);printf("\n");
}
int GetLength(polynomial A){if(A == NULL) {printf("The polynomial is empty.\n");exit(0);}LNode *pa = A->next;int n = 0;while(pa != NULL){n++;pa = pa->next;}return n;
}
polynomial MultiplyPolyn(polynomial A, polynomial B){//异常处理 if(A == NULL || B == NULL){printf("Polynomial A or B is empty.\n");exit(0);}LNode *pa = A->next, *pb, *p;polynomial C;C = CreatPolyn();//先将多项式A的第i个元素(i=1,2,3...n)//与多项式B中的各个元素相乘后再相加得到第i个多项式 while(pa != NULL){pb = B->next;polynomial temp;temp = CreatPolyn();//表示第i个多项式 LNode *pt = temp;//pt为temp的头指针 while(pb != NULL){LNode *set;//保存当前pa与pb所指数据元素相乘所得结果 set = (polynomial)malloc(sizeof(LNode));set->data.coef = pa->data.coef * pb->data.coef;set->data.expn = pa->data.expn + pb->data.expn;set->next = NULL;pt->next = set;//将set插入多项式temp中 pt = pt->next;pb = pb->next;}//每次计算出第i个多项式后,都将其与C进行相加 C = AddPolyn(C, temp);freePolyn(temp);pa = pa->next;}return C;
}
polynomial AddPolyn(polynomial A, polynomial B){//简化处理 if(B->next == NULL)return A;if(A->next == NULL)return B;LNode *pa = A->next, *pb = B->next, *pc;polynomial C;C = CreatPolyn();pc = C;while(pa != NULL && pb != NULL){LNode *temp;temp = (polynomial)malloc(sizeof(LNode));if(pb->data.expn > pa->data.expn){temp->data.expn = pb->data.expn;temp->data.coef = pb->data.coef;pc->next = temp;pc = pc->next;pc->next = NULL;pb = pb->next;}else if(pb->data.expn < pa->data.expn){temp->data.expn = pa->data.expn;temp->data.coef = pa->data.coef;pc->next = temp;pc = pc->next;pc->next = NULL;pa = pa->next;}else{temp->data.coef = pa->data.coef + pb->data.coef;temp->data.expn = pa->data.expn;pc->next = temp;pc = pc->next;pc->next = NULL;pa = pa->next;pb = pb->next;}}if(pa == NULL && pb != NULL){while(pb){LNode *temp;temp = (polynomial)malloc(sizeof(LNode));temp->data.expn = pb->data.expn;temp->data.coef = pb->data.coef;pc->next = temp;pc = pc->next;pc->next = NULL;pb = pb->next;}}else if(pa != NULL && pb == NULL){while(pa){LNode *temp;temp = (polynomial)malloc(sizeof(LNode));temp->data.expn = pa->data.expn;temp->data.coef = pa->data.coef;pc->next = temp;pc = pc->next;pc->next = NULL;pa = pa->next;}}
//  freePolyn(B);return C;
}
void freePolyn(polynomial A){if(A == NULL) {printf("The polynomial is empty.\n");exit(0);}LNode *pa = A->next;while(pa->next != NULL){free(A);A = pa;pa = pa->next;}free(pa);
}

实验总结

使用指针时,不用的空间一定要free掉,一定要free掉,尽管很多老师都强调过,但像本实验中,许多插入到链表中的空间则是不能free的,以后会在更加小心的使用。

没想到吧,其实我是来熟悉Markdown语法的。

Mon 23 Mon 30 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid

编程小白学习记录
还望各位不吝斧正


  1. 项与项之间指数差距较大,例如:X10000+X10,指数10000和10相差很大,故可称之为稀疏多项式。 ↩︎

  2. 使用LinkList依然可以,这里更改为polynomial是为了更好地阅读程序 ↩︎

一元稀疏多项式乘法问题相关推荐

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

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

  2. 用java的jni调用C语言的API,实现带图形界面的一元稀疏多项式计算器

    实现步骤: 1) 完成Java代码,编写好Java调用类. 2) 编译你的Java类. 3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件. 4) 实现头文件中的函数原型,编写 ...

  3. java 一元稀疏多项式简单计算器_一元稀疏多项式简单的计算器

    共回答了25个问题采纳率:92% 一元稀疏多项式计算器设计程序代码 #include #include #include #include #define maxlen 10 #define larg ...

  4. 设计一个一元稀疏多项式简单计算器

    目录 1.题目 2.需求分析 3.程序设计 4.测试结果 5.源码 1.题目 [问题描述] 设计一个一元稀疏多项式简单计算器. [基本要求] (1)输入并建立两个多项式: (2)多项式a与b相加,建立 ...

  5. 完整版一元稀疏多项式计算器

    一元稀疏多项式计算器 [问题描述]: 设计一个一元稀疏多项式简单计算器. [基本要求]: 一元稀疏多项式简单计算器的基本功能是: (1)输出并建立多项式: (2)输出多项式,输出形式为整数序列:n,c ...

  6. 一元稀疏多项式加减法计算器

    实验一:一元稀疏多项式计算器 [问题描述]: 设计一个一元稀疏多项式简单计算器. [基本要求]: 一元稀疏多项式简单计算器的基本功能是: (1)输出并建立多项式: (2)输出多项式,输出形式为整数序列 ...

  7. 数据结构课程设计---实现一元稀疏多项式计算器

    课程设计课题: 设计一个一元稀疏多项式简单计算器,能够实现五大基本功能: (1)输入并建立多项式: (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,-,cn,en,其中n是多项式的项 ...

  8. 基于Java实现的一元稀疏多项式计算器

    资源下载地址:https://download.csdn.net/download/sheziqiong/85896976 资源下载地址:https://download.csdn.net/downl ...

  9. 基于Java语言实现一元稀疏多项式计算器【100010608】

    1.实验内容 一元稀疏多项式计算器 使用语言:Java 语言 编译环境:openJDk-1.8 2.问题描述 设计一个简易的一元稀疏多项式计算器. 3.需求分析 经过分析,本系统需完成的主要功能如下: ...

最新文章

  1. 浏览新闻oracle的数据结构,oracle 数据结构探索之旅二 [2]
  2. xmlns=http://schemas.xmlsoap.org/wsdl/,这是什么意思,我只知道:xmlns:xx=....,
  3. c++11并发指南系列
  4. C#LeetCode刷题之#598-范围求和 II​​​​​​​(Range Addition II)
  5. Java 高阶 —— try/catch
  6. S3C2440小板子-烧写笔记
  7. 所有文件夹都变成1KB文件夹快捷方式病毒的解决方法
  8. LitePal的简单使用
  9. python绘制emoji_在Python中将emoji转换为文本
  10. 一张图回顾Hadoop十年 Hadoop老矣,尚能饭否
  11. java -jar .jar_Java_JAR命令JAR包闲谈;
  12. Shiny的架构浅析
  13. Win8下安装配置Docker ToolBox并制作镜像配置Handoop集群
  14. 修改密码PHP博客,phpwind任意修改管理员密码漏洞
  15. 突然不能从主机向虚拟机上拷贝文件了
  16. 普元DevOps使用规范与流程
  17. linux的软件包管理
  18. TC358840XBG具有哪些特征
  19. 判断是否为素数,是则返回1,否则返回0.
  20. Juniper入门之RIP

热门文章

  1. php crypt,PHP crypt() 函数
  2. 实施顾问的MES项目实施心得!
  3. IT信息技术企业应具备哪些资格
  4. 专科生该如何安排自己的路
  5. RPC是什么?RPC与REST、Socket的区别?php中流行的rpc框架有哪些?
  6. 快速了解轨道影院_环幕沉浸式空间_史帝奇VR
  7. 自动驾驶技术的新进展:智能感知与决策的优化与实现
  8. SpringBoot项目生成二维码,再生成Excel文件导出,亲测采坑
  9. 【算法/数论】埃拉托斯特尼筛法时间复杂度的证明
  10. python三维建模需要用到哪些知识_三维建模教学大纲