单链表表示多项式相乘实习报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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则只输出“-”

按照算法进

行两个多项

式相加

将结果输出

相关文档
最新文档