南邮数据结构实验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);
}


 

数据结构实验题目 实验一 学生成绩管理(链表)  实验目的:熟练掌握单链表操作的基本算法实现。  实现功能:以带表头结点的单链表为存储结构,实现如下学生成绩管理的设计要求。  实验机时:6  设计要求: (1)定义学生成绩链表结点结构类型,以xscjList和*XscjLink命名,数据域:学号NO、姓名Name、手机号MTel、邮箱地址Email、籍贯 BornAddr、A分成绩AScore、B分成绩BScore,指针域:*next; (2)实现创建学生成绩链表函数void Build(XscjLink &T),输入学号、姓名、手机号、邮箱地址、籍贯、A分成绩、B分成绩,建议用文件操作来输入数据; (3)实现函数void Update(XscjLink T, char *Name, float *ScoreA),将姓名为Name的学生的A分成绩改为ScoreA; (4)实现输出学生成绩信息void OutPut(XscjLink T),输出所有学生的学号、姓名、手机号、邮箱地址、籍贯、A分成绩、B分成绩; (5) 实现函数void Insert(XscjLink T, char *Name, char *No),插入学号为NO,姓名为Name学生信息,将链表中学号≤NO的结点放到该结点的前面,将学号>NO的结点放到该结点后面; (6)实现函数void Sort(XscjLink T),将该学生按照B分成绩进行非递减排序; (7)实现函数void Merge(XscjLink &T1;, XscjLink &T2;),将两个按B分成绩非递减排序的学生成绩单合并为一个按B分成绩非递增排序的通讯录,B分成绩相同且学号相同的成绩记录在结果中只保留一个;要求算法的时间复杂度不超过两个链表的长度之和O(m+n); (8)实现函数int Count(XscjLink T);统计籍贯是“广州”的学生人数; (9)实现函数void MoveK(XscjLink T, int k),将学生成绩链表中倒数第k个结点之后的所有结点移到头结点后面(保持结点间的先后顺序),注意:严禁采用先计算链表长度n再减k(即n-k)的方法;要求算法的时间复杂度不超过个链表的长度O(n); (10)实现函数void ReverseN(XscjLink T),将学生成绩链表的正中间位置结点之后的全部结点倒置,注意:严禁采用先计算链表长度n再除以2(即n/2)的方法;要求算法的时间复杂度不超过个链表的长度O(n); (11)主控函数main()调用以上函数,分别输出(2)、(3)、(5)、(6)、(7)、(8)、(9)(10)处理后的链表内容、输出籍贯是“广州”的学生人数。 可能用到的函数: 从文件中读取学生成绩数据:fscanf(文件指针,"%s %s %s %s %s %f %f", p->NO, p->Name, p->Mtel, p->Email, p-> BornAddr, p->AScore, p->BScore); 输出学生成绩数据:printf("%s %s %s %s %s %f %f", p->NO, p->Name, p->Mtel, p->Email, , p-> BornAddr, p->AScore, p->BScore); 字符串赋值函数:char * strcpy(char *, const char *); 字符串比较函数:int strcmp(const char *, const char *) #include #include #include //定义学生成绩链表结点结构 typedef struct XscjNode { char NO[10]; //学号 char Name[16]; //姓名 char MTel[11]; //手机号 char EMail[16]; //邮箱地址 char BornAddr[20]; //籍贯(值域:"北京"、"上海"、"大连"等等,只写城市名称) float AScore; // A分成绩 float BScore; //B分成绩 struct XscjNode *next; //指针域 }XscjList, *XscjLink; 实验二 Huffman编码(二叉树)  实验目的:熟练掌握二叉树应用(Huffman编码)的基本算法实现。  实现功能:对输入的一串电文字符实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。实现功能如下: • Huffman树的建立 • Huffman编码的生成 • 编码文件的译码  实验机时:10  设计思路: 数据结构: #define n 100 //叶子结点数 #define m 2*n-1 // Huffman树中结点总数 typedef struct { char data; 字符 int weight; //权值 int lchild , rchild , parent; //左右孩子及双亲指针 }HTNode; //树中结点类型 typedef HTNode HuffmanTree[m+1]; //0号单元不用 主要实现函数:  统计字符串中字符的种类以及各类字符的个数的函数  构造Huffman树的函数  Huffman编码的函数  建立正文的编码文件的函数  代码文件的译码函数  主函数 实验三 各种排序方法的比较  实验目的:熟练掌握内部排序算法的实现。  实现功能:编制一个演示内部排序算法比较的程序。要求通过编写程序实现起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序等常用的内部排序算法,并通过样本数据比较各个算法的时空特性  实验机时:4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值