单链表表示多项式相乘实习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习报告
一.实习题:
请写出计算两个以单链接表表示的多项式相乘的程序。
1.设计:
因为进行插入删除时,有头结点的单链表的实现会更方便,所以采用带头结点的单链表,一个单链表代表一个多项式,每个结点代表多项式的一个因子,每个结点都有两个数据和一个指针,数据分别代表每个因子的系数和指数。
(1)存储结构:
结点类:
class Listnode
{
friend class List;
friend ostream & operator << (ostream &output,const Listnode& node);
private:
Listnode* next;//point to the next node
int coefficient;
int exponent;
public:
Listnode(const int & e1,const int & e2,Listnode*p=NULL)
:coefficient(e1),exponent(e2),next(p){}//constructor with three parameters
Listnode()
:next(NULL){}//constructor without parameters
Listnode* Get(){return next;}//get the next
~Listnode(){}//析构函数
};
单链表类:
class List
{
friend ostream & operator << (ostream &output,List& list);
friend istream & operator >> (istream &input,List& list);
private:
Listnode* head;//point to the head of the list
Listnode* current;//point to the current node
public:
List(){head = new Listnode();current = head;}//constructor
~List(){Makeempty();delete head;}//析构函数
int Isempty(){return head->next == NULL;}//if the list is empty return 1,else rerurn 0
void First(){current=head->next;}//make current point to the first node void operator ++()
{
if (current!=NULL)
current=current->next;
}//make current point to the next node
void operator ++(int){operator++();} int Isfull(){}//the list is generally unable to be full
void Makeempty();//clear the list
int Find(const int& x,const int& y);//if (x,y) is in the list,return 1 void Insert(const int& x,const int& y);//insert a node to the list whose element is (x,y),then current point to it
void Delete(const int& x,const int& y);//delete the node whose element is (x,y)
const List& operator = (const List& list);//copy the right list to the left one
List& operator +(List& list);//get the sum of two lists
List& operator *(List& list);//get the multiply of the two lists
};
(2)算法思想:
设多项式A ,B ,A 有m 项,B 有n 项,用
A 中的每一项乘以
B 得到m 个
n 项式,然后这m 个n 项式相加,即得到A 与B
相乘的结果。
(3)程序调用关系:
此次实习的主程序比较简单,只涉及类的成员函数之间的调用。
(4) 算法实现框架:
定义两个单链表存储两个多项式
依次让用户输入两个多项式的数据 将数据存入到
两个单链表中
2.用户手册:
按照屏幕的提示依次输入两个多项式,请务必按照提示的要求输入,然后程序会计算两个多项式的和,然后输出计算结果。
3.调试报告:
(1)时间复杂度分析:
设两多项式为A ,B ,分别有m ,n 项,则进行乘法时,先是A 中每一项和B 各项相乘,得到m 个n 项式,此过程时间复杂度与问题规模无关,然后m 个n 项式相加,第一次加的时候是两个n 项式相加,插入次数介于n 和2n 之间,所以时间复杂度为O (n ),同理,后面的相加也是时间复杂度为O(n),所以m-1次相加的时间复杂度也是0(n ),由于没涉及到删除的操作,所以综合来看,时间复杂度即为0(n).
(2)算法改进:
如果采用迭代器的话也许对链表进行操作起来会更加方便。如果用模板就可以处理数据是其他类型时的情况。还可以加一个排序的操作,这样就能处理用户输入的数据不是以升幂的形式排列时的情况。我的程序要求用户输入的数据必须以特定形式,这样的形式不符合人的视觉习惯,但由于对处理系数为1时的情况没有解决方法,所以放弃了,如果输入方式更符合数学习惯,则会更加友好。但这些都对时间复杂度没什么影响。只是使程序更加健壮。
4.附录:
源程序清单:
//Listnode.Cpp
#include"Listnode.h"
#include
ostream& operator << (ostream &output,const Listnode& node)
{
if(node.coefficient)//系数为0则直接跳过
{
if(node.coefficient== -1)//系数为-1则只输出“-”
按照算法进
行两个多项
式相加
将结果输出