一元稀疏多项式乘法问题
一元稀疏多项式简单计算器
- 实验题目
- 实验目的
- 实验内容与要求
- 实验内容和实验步骤
- 需求分析
- 概要设计
- 调试分析
- 调试过程中所遇到问题及解决方案
- 算法的时空分析
- 代码分析
- 数据结构
- 函数模块
- 建立空多项式
- 对多项式进行赋值
- 将多项式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语法的。
编程小白学习记录
还望各位不吝斧正
项与项之间指数差距较大,例如:X10000+X10,指数10000和10相差很大,故可称之为稀疏多项式。 ↩︎
使用LinkList依然可以,这里更改为polynomial是为了更好地阅读程序 ↩︎
一元稀疏多项式乘法问题相关推荐
- 已知稀疏多项式C语言版,一元稀疏多项式计算器C语言课程设计
<一元稀疏多项式计算器C语言课程设计>由会员分享,可在线阅读,更多相关<一元稀疏多项式计算器C语言课程设计(26页珍藏版)>请在人人文库网上搜索. 1.学号2014-2015学 ...
- 用java的jni调用C语言的API,实现带图形界面的一元稀疏多项式计算器
实现步骤: 1) 完成Java代码,编写好Java调用类. 2) 编译你的Java类. 3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件. 4) 实现头文件中的函数原型,编写 ...
- java 一元稀疏多项式简单计算器_一元稀疏多项式简单的计算器
共回答了25个问题采纳率:92% 一元稀疏多项式计算器设计程序代码 #include #include #include #include #define maxlen 10 #define larg ...
- 设计一个一元稀疏多项式简单计算器
目录 1.题目 2.需求分析 3.程序设计 4.测试结果 5.源码 1.题目 [问题描述] 设计一个一元稀疏多项式简单计算器. [基本要求] (1)输入并建立两个多项式: (2)多项式a与b相加,建立 ...
- 完整版一元稀疏多项式计算器
一元稀疏多项式计算器 [问题描述]: 设计一个一元稀疏多项式简单计算器. [基本要求]: 一元稀疏多项式简单计算器的基本功能是: (1)输出并建立多项式: (2)输出多项式,输出形式为整数序列:n,c ...
- 一元稀疏多项式加减法计算器
实验一:一元稀疏多项式计算器 [问题描述]: 设计一个一元稀疏多项式简单计算器. [基本要求]: 一元稀疏多项式简单计算器的基本功能是: (1)输出并建立多项式: (2)输出多项式,输出形式为整数序列 ...
- 数据结构课程设计---实现一元稀疏多项式计算器
课程设计课题: 设计一个一元稀疏多项式简单计算器,能够实现五大基本功能: (1)输入并建立多项式: (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,-,cn,en,其中n是多项式的项 ...
- 基于Java实现的一元稀疏多项式计算器
资源下载地址:https://download.csdn.net/download/sheziqiong/85896976 资源下载地址:https://download.csdn.net/downl ...
- 基于Java语言实现一元稀疏多项式计算器【100010608】
1.实验内容 一元稀疏多项式计算器 使用语言:Java 语言 编译环境:openJDk-1.8 2.问题描述 设计一个简易的一元稀疏多项式计算器. 3.需求分析 经过分析,本系统需完成的主要功能如下: ...
最新文章
- 浏览新闻oracle的数据结构,oracle 数据结构探索之旅二 [2]
- xmlns=http://schemas.xmlsoap.org/wsdl/,这是什么意思,我只知道:xmlns:xx=....,
- c++11并发指南系列
- C#LeetCode刷题之#598-范围求和 II​​​​​​​(Range Addition II)
- Java 高阶 —— try/catch
- S3C2440小板子-烧写笔记
- 所有文件夹都变成1KB文件夹快捷方式病毒的解决方法
- LitePal的简单使用
- python绘制emoji_在Python中将emoji转换为文本
- 一张图回顾Hadoop十年 Hadoop老矣,尚能饭否
- java -jar .jar_Java_JAR命令JAR包闲谈;
- Shiny的架构浅析
- Win8下安装配置Docker ToolBox并制作镜像配置Handoop集群
- 修改密码PHP博客,phpwind任意修改管理员密码漏洞
- 突然不能从主机向虚拟机上拷贝文件了
- 普元DevOps使用规范与流程
- linux的软件包管理
- TC358840XBG具有哪些特征
- 判断是否为素数,是则返回1,否则返回0.
- Juniper入门之RIP