【數據結構】哈工大實驗一:一元多项式(代碼以及報告)
代碼見最後的附錄。
一、 实验目的
写一个代码计算一元多项式
以链表存储一元多项式,在此基础上完成对多项式的代数操作。
1.能够输入多项式(可以按各项的任意输入顺序,建立按指数降幂排列的多项式)和输出多项式(按指数降幂排列),以文件形式输入和输出,并显示。
2.能够计算多项式在某一点x=x0的值,其中x0是一个浮点型常量,返回结果为浮点数。
3.能够给出计算两个多项式加法、减法、乘法和除法运算的结果多项式,除法运算的结果包括商多项式和余数多项式。
4.要求尽量减少乘法和除法运算中间结果的空间占用和结点频繁的分配与回收操作。
二、实验要求及实验环境
Win10/code blocks
二、 设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)
1.函数列表:
bool isBlank(Node *p);//判断是不是一个空白的链表。
void printLine();//打印一行横线来分隔。
Node *CreateList();//创建新的多项式链表,手打输入
void destroy(Node *p);//输入表头删除多项式链表。
void Del(Node *p,Node *ListO);//删除节点。
Node *copyList(Node *head);//复制链表
Node *DecendTimeList(Node *head);//把输入的多项式链表按照降序排序。
void swap(int *a, int *b);//交换参数a,b
void Calculate(Node *head,float x);//计算把浮点数x0代入多项式的数值。
Node *Input();//手动输入链表
Node *CreateListFile(FILE *fp);//从文件读入链表
Node *InsertNodeIn(Node *head);//头插链表
void PrintRequire(int *num,int *time);//辅助头插链表,打印输入的请求。
void insert(Node *head,Node *s,bool check);//按照升序插入链表
Node *LocateNode(int time,Node *head);//确定这个次数的节点位置。
Node *mutiList(Node *A,Node *B);//实现两个多项式相乘。
void addPoly(Node *pa,Node *pb);// 实现两个多项式相加。
Node *subtractPoly(Node *pa,Node *pb);// 实现两个多项式相减。
Node *reverse(Node *head);// 将指定链表逆序
void divList (Node *P, Node *Q);// 实现两个多项式除法
Node * mulSingle (Node *Q, Node *node);//一个数乘上一个多项式。实现一个单项式与一个多项式相乘
void display(Node *head, bool *newLine);//输出多项式。
Node *NewList();//新建头节点。
void OutputList(Node *head);//输出链表。
void Fileout(File fp,Node *head);//输出文件
2.数据类型:
typedef int bool;//布尔类型,判断是否执行函数
# define FALSE 0
#define TRUE 1
/*
*数据节点:一个node节点,储存多项式系数和次数
*/
struct Node
{
int num;//系数
int time;//指数
struct Node *next;//该多项式下一个单项式
};
typedef struct Node Node;//定义数据类型Node
四、测试结果
1.文件输入多项式:
2.输入多项式排序:
3.文件输出:
4.计算x0的值:
5.多项式加法:
6.多项式乘法:
7.多项式除法:
a.两个多项式相等
b.两个多项式除数最高次幂大于被除数最高次幂:
c.两个多项式除数最高次幂小于被除数最高次幂:
9.多项式减法:
五、系统不足与经验体会
系统不足:有时候出错,比如说当机,死循环之类的。
解决方法:重新启动一次程序就好了。假如输入了错误字符,会调入死循环,可以ctrl+z退出重新启动一次。
经验体会:
每次更新完一个版本,做比较大的修改前一定要保存。不然可能会付出2~3个小时重新debug的代价。
项目开始前,做一个全局的规划,比如要哪些函数完成哪些功能,输入和输出的设计如何设计比较方便,这样有利于后期查看和debug,只要去找块就可以了。文件版本的名字要遵循一定的规律,否则找起来很麻烦。
总体结构确定之后,尽量不要去变动,如果一定要变动,一定要事先在程序蓝图上进行修改,免得之后自己忘掉造成麻烦,还得去找什么地方有一个小改动。
文件输入输出流没有想象中那么难解决,(虽然我觉得也不简单),情绪放松的时候一查资料就解决了问题。每次做实验要留出足够的时间,免得时间紧张,情绪着急反而浪费时间。
附錄:
凡事都要盡可能自己完成,否則未來只能有求於人。