南邮数据结构实验1.3 一元多项式的相加和相乘

2024-03-31 18:48

本文主要是介绍南邮数据结构实验1.3 一元多项式的相加和相乘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内容和提示:


1.设计带表头结点的单链表表示的多项式类,在该类上定义和实现教材2.4节中程序2.7的多项式类上的各个运算。

2.在该类上增加成员函数void PolyMul(Polynominal & r),并重载*运算符。

3.实现菜单驱动的main函数,测试多项式类上各个运算:输入多项式,显示多项式,多项式加法和乘法运算。

4.提示:注意本实习采用带表头的非循环链表存储多项式。除乘法运算外,请通过修改教材2.4节的程序实现各运算。多项式相乘的算法为:将乘数多项式的每一项与被乘数多项式的所有项分别相乘(即系数相乘,指数相加),得到中间多项式;调用函数PolyAdd将这些中间多项式依次加到结果多项式中。值得注意的是,在相成的过程中不能改变两个原始多项式的值。


#include<iostream.h>
class Term        // 多项式的每一项类
{private:      
int coef;
int exp;
Term *link; 
public:    
Term(int c, int e);       
Term(int c, int e, Term *nxt);         
Term * InsertAfter(int c, int e);      friend ostream & operator<< (ostream &out, const Term &val);  //输出每一项运算符重载friend class Polynominal;           
};Term::Term(int c, int e) :coef(c), exp(e)
{
link = 0;
}
Term::Term(int c, int e, Term*nxt) : coef(c), exp(e)
{
link = nxt;
}
Term * Term::InsertAfter(int c, int e)        //插入一项  p调用  调用结束 p指向插进来的项                  
{
link = new Term(c, e, link);
return link;
}ostream &  operator<< (ostream &out,const  Term &val)    //输出每一项运算符重载
{
if (val.coef == 0) return out;
out << val.coef;
switch (val.exp)
{
case 0:break;
case 1:out << "X"; break;
default:out << "X^" << val.exp; break;
}
return out;
}//#include"term.h"
class Polynominal
{private:
Term  * first;    
public:
Polynominal();
~Polynominal();
void AddTerms(istream& in);
void Output(ostream& out)const;
void PolyAdd(Polynominal &r);
void PolyMul(Polynominal &r);
friend ostream& operator<<(ostream&, const Polynominal &);
friend istream& operator>>(istream&, Polynominal&);
friend Polynominal& operator +(Polynominal&, Polynominal&);         //友员可以忽略
friend Polynominal& operator *(Polynominal&, Polynominal&);
};Polynominal::Polynominal()                                          //带表头的 非循环链表
{
first=new Term(0,-1);                                           //创建一个表头 由first指向
first->link = NULL;     
}Polynominal::~Polynominal()                                         //带表头结点单链表的析构
{
Term * p=first->link;
while (p)
{first->link=p->link;
delete p;
p=first->link;
}
}void Polynominal::AddTerms(istream& in) //多项式 输入各项
{
Term * q = first;//  q指向单链接表的头结点
int c, e;
for (;;)
{
cout << "Input a term(coef,exp):\n" << endl;
cin >> c >> e;
if (e < 0) break;
q = q->InsertAfter(c, e);//调用term类里的 插入项函数 直到指数为负数
}
}void Polynominal::Output(ostream& out)const //多项式 输出各项   
{
int a = 1; Term * p = first->link;//p指向单链接表的第一个元素cout << "the polynominal is :\n" <<endl;
do{
if (!a && (p->coef>0)) out << "+";//若a=0并且是正数 输出+
a = 0;                              
out << *p;                          
p = p->link;                 
} while (p);
cout << "\n" << endl;
}ostream& operator<<(ostream& out, const Polynominal& x)
{
x.Output(out); return out;
}istream& operator>>(istream& in, Polynominal& x)    
{
x.AddTerms(in); return in;
}Polynominal & operator +(Polynominal& a, Polynominal& b) 
{
a.PolyAdd(b); return a;
}Polynominal& operator *(Polynominal& a, Polynominal& b)  
{
a.PolyMul(b); return a;
}void Polynominal::PolyAdd(Polynominal& r)           //多项式相加
{                                               
Term* q, *q1 = first, *p;//q1指向表头节点
p = r.first->link;//P 指向第一个元素
q = q1->link;   //q指向第一个元素while(p)                //带表头的链接表遍历  循环单链表可以最后指向头结点的 exp -1
{
while(p->exp < q->exp)   
{
if(!q->link) break;
q1 = q; q = q->link;  //q后移
}                    //经过此循环,q里次数比p里所有元素高的都在前面。
if (p->exp == q->exp)    
{
q->coef = q->coef + p->coef;   if(q->link)
{
q1 = q; q = q->link; 
}
}
else if(p->exp >q->exp) 
{q1 = q1->InsertAfter(p->coef, p->exp);//q的指数比p小 插入此时q的最前面
}else 
{
q = q->InsertAfter(p->coef, p->exp);    //插入之后,q指向新插入的结点
}
p = p->link; 
}
}void Polynominal::PolyMul(Polynominal& r)                 //多项式乘法
{Term* q, *q1 = first, *p; //q1指向表头节点
p = r.first->link;   //P 指向第一个元素
q = q1->link;          //q指向第一个元素
Polynominal T;
Term *t=T.first;         //临时指针;while(p)
{
while(q)
{
t=t->InsertAfter(q->coef*p->coef,q->exp+p->exp);
if(!q->link) break;
q1 = q; q = q->link;  //q后移}
q1=first; q=q1->link;     //q 归位
p=p->link;}   Term *t1=T.first->link; //增加的代码Term *b_t=T.first->link; //对T的每一项进行排序,并且合并。 最终降幂排序。
t=b_t->link;
while(t1)
{
while(t)
{
if(t->exp==t1->exp) 
{ 
t1->coef+=t->coef; 
b_t->link=t->link;
t->coef=0;
t=b_t->link;
}
else
{
t=t->link;
b_t=b_t->link;
}
}
t1=t1->link;
b_t=t1;
t=t1->link;
if(!t) break;
}while(q)
{ 
q->coef=0;
q1 = q; q = q->link;    //q后移
}
q1=first; q=first->link;     //q 归位
PolyAdd(T); 
}void Menu()
{cout<<"*****Input       Polynominal p - Input 1 *****"<<endl<<endl;cout<<"*****Input       Polynominal q - Input 2 *****"<<endl<<endl;cout<<"*****Add     two Polynominals  - Input 3 *****"<<endl<<endl;cout<<"*****Multiply two Polynominals - Input 4 *****"<<endl<<endl;cout<<"*****           Exit  -Input 0           *****"<<endl<<endl;cout<<"Input your choice:"<<endl;
}void Choice(int &choice)
{
Polynominal A, B;switch(choice)
{
case 1:cin>>A;cout<<"A---"<<A<<endl;Menu();break;
case 2:cin>>B;cout<<"B---"<<B<<endl;Menu();break;
case 3:cout<<"Please input  two   Polynominals: "<<endl;cin>>A;cin>>B;cout<<"Add:"<<A+B<<endl;Menu();break; 
case 4:cout<<"Please input  two   Polynominals: "<<endl;cin>>A;cin>>B;cout<<"Multiply:"<<A*B<<endl;Menu();break; 
case 0:cout<<"*****                See U !               *****"<<endl; break;
}}//#include"polynominal.h"
//#include"a.h"void main()
{
Menu();
cout<<"降幂输入"<<endl;int choice; 
do
{   
cin>>choice;
Choice(choice);}while(choice);
}


 

这篇关于南邮数据结构实验1.3 一元多项式的相加和相乘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/865056

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

usaco 1.3 Calf Flac(暴搜)

思路是暴搜。 需要注意的地方是输入的方法,以及输出时的换行。 代码: /*ID: who jayLANG: C++TASK: calfflac*/#include<stdio.h>#include<string.h>#include<math.h>int main(){freopen("calfflac.in","r",stdin);freopen("calfflac.ou

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(