【辉哥带我学数据结构】【实验】多项式计算器(思路)

实验一 一元多项式计算器
实验学时:2 实验类型:综合型
一、目的与任务
1.目的:掌握顺序表和单链表的存储特点及插入、删除等算法。
2.任务:灵活运用顺序表和单链表的相关算法实现一元多项式的计算。
二、内容、要求与安排方式
1.实验内容:设有一元多项式Am(x)和Bn(X),编程实现多项式Am(x)和Bn(x)的加法、减法和乘法运算。其中多项式描述为:
Am(x)=A0+A1x1+A2x2+A3x3+….+Amxm;
Bn(x)=B0+B1x1+B2x2+B3x3+….+Bnxn。
2.输入和输出:
(1)输入:
 从键盘输入运算指令(相加、相减、相乘),根据运算指令进行相应运算;
 从键盘输入两个多项式的系数和指数;
 系数和指数采用int类型,运算结果不超出int取值范围。
(2)输出:
 每种运算结果以多项式形式输出,要输出升幂和降幂两种情况。
 结果多项式中无重复阶项、无零系数项,输出多项式时请采用如下易读形式(一元多项式,总变元为x): x^4 - 3 x^2 + 5
3.实验要求:
 实现一个简单的交互式界面,包括系统菜单、输入提示等。
 多项式运算前首先判定多项式特点,根据多项式是否稀疏来选用合适的存储结构;
 根据多项式不同的运算要求选择合适的存储结构;
 上机编辑、调试出完整正确的程序,包括相加、相减、相乘运算。
4.实验安排方式:
 在实验课前编写出完整程序,在实验课时进行调试;
 每组1人,独立完成上机实验。
三、注意事项:
1.本实验内容涉及到链式存储结构,请理解链式存储的特点及指针的用法。
2.注意比较带头结点、无头结点链表实现插入、删除算法时的区别。
3.请在实验报告中说明系统使用的主要数据结构。

【实现思路】

  1. 链表存储多项式;
  2. 提取系数到线性表,用指数作为下标,牺牲空间换取时间
  3. 完成计算,生成答案线性表,构建答案链表
  4. 以下是各函数声明与主函数逻辑结构

【实现方案】

  • c++
  • 链表
  • 线性表
//solve.h
#include <bits/stdc++.h>
using namespace std;
#ifndef SOLVE_H_INCLUDED
#define SOLVE_H_INCLUDED
/**
    author:mmciel
    time:2019-5-14 07:26:19
    word:
        数据结构相关功能的实现:初始化、插入、删除、清空
*/
static int OK = 1;
static int NO = 0;
//多项式结构
typedef struct{
    int num;
    int expx;
}Data;
//链表结构
typedef struct LNode{
    Data data;
    struct LNode * next;
}LNODE,*List;
//初始化链表
int InitList(List & L);
//插入一个数据到链表
int InsertList(List & L, Data d);
//删除一个节点
int DelList(List & L, Data d);
//链表长度
int ListLength(List L);
//链表清空
int ClearList(List & L);
//链表销毁
int DestoryList(List & L);
//链表打印,用于调试
int PrintList(List L);
//菜单
void welcome();
//分隔输出
void printLine();
//整数转字符串
string tostring(int n);
typedef struct{
	int * num;//系数
	int length;
	int listsize;
}Line;
//初始化顺序表
int InitLine(Line & L,int listlen);
//插入顺序表
int InsertLine(Line & L,Data d);
//删除顺序表
int DelLine(Line & L,Data d);
//清空顺序表
int ClearLine(Line & L);
//顺序表长度
int LineLength(Line & L);
//顺序表销毁
int destoryLine(Line & L);
#endif // SOLVE_H_INCLUDED

//main.cpp
/**
    author:mmciel
    time:2019-5-14 07:49:48
    一元多项式计算器
        完成三个运算
        运算逻辑、数据处理逻辑、输出逻辑
*/
#include <bits/stdc++.h>
#include "solve.h"
using namespace std;

int order=-1;
bool flag = true;
List list1=NULL, list2=NULL;//多项式存储到链表
Line line1,line2;//系数的顺序表
List anslist = NULL,nlist = NULL;//结果临时存放
Line ansline;//结果系数的临时存放
int expx1 = 0,expx2 = 0;//获取list1 list2最高次幂
int status;//调试时使用的状态字

List Add(List list1,List list2);
List Sub(List list1,List list2);
List Mult(List list1,List list2);
void Input(List &list1,List &list2);

void PrintPolynomial(List temp);//打印多项式
bool DelPolynomial(List list1,List list2);//清空两个多项式
int getMaxExp(List temp);//获取最高次幂
List daozhi(List temp);//链表倒置、为了输出
int main(){
//1.创建两个多项式        2.打印两个多项式
//3.两个多项式相加        4.两个多项式相减
//5.两个多项式相乘        6.清空两个多项式
    while(flag){
        welcome();
        cin>>order;
        switch(order){
            case 1:
                Input(list1,list2);
                expx1 = getMaxExp(list1);
                expx2 = getMaxExp(list2);
                if(!expx1) expx1++;
                if(!expx2) expx2++;
                InitList(anslist);
                break;
            case 2:
                PrintPolynomial(list1);PrintPolynomial(list2);
                break;
            case 3:
                anslist = Add(list1,list2);
                PrintPolynomial(anslist);
                nlist = daozhi(anslist);
                PrintPolynomial(nlist);
                status = ClearList(anslist);
                break;
            case 4:
                anslist = Sub(list1,list2);
                PrintPolynomial(anslist);
                nlist = daozhi(anslist);
                PrintPolynomial(nlist);
                status = ClearList(anslist);
                break;
            case 5:
                anslist = Mult(list1,list2);
                PrintPolynomial(anslist);
                nlist = daozhi(anslist);
                PrintPolynomial(nlist);
                status = ClearList(anslist);
                break;
            case 6:
                DelPolynomial(list1,list2);
                break;
            default:
                flag = false;
                cout<<"退出..."<<endl;
                break;
        }
    }
    return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值