利用顺序表实现多项式相加
2015-09-10 00:21
597 查看
//利用顺序表实现多项式相加 #include <iostream> #include <algorithm> #include <conio.h> #include<stdlib.h> #include<time.h> using namespace std; const int N=10; struct Data { int xishu; int zhishu; }; template <class T> class SeqList { private: T* list; int MaxSize; int size; public: SeqList(int max); //构造函数,初始化得到一个容量为max的空表 ~SeqList(); //析构函数,释放线性表占用的存储空间 int Size(); //求线性表的长度 int Maxsize(); //求线性表的最大元素个数 int Find(const T& x); //在线性表中查找与元素x同指数的元素位置 T GetData(int i); //取线性表的第i个元素 void Insert(int i,const T & x ); //把x插入线性表中第i位 /*线性表加入一项x; 若有序表中不存在与x同指数的元素,则按x的指数大小插入; 否则,在表中已存在与x同指数的元素,则该元素的系数加上x的系数,若系数和为0,则要删除该元素; */ void Add(const T& x); void Delete(int i); // 删除第i个元素 void Print(); void operator =(const SeqList<T>& other); //多项式线性表复制 SeqList<T> operator +(const SeqList<T>& other); //多项式线性表相加 }; template <class T> int SeqList<T>::Find(const T& x) { for(int i=0;i<size;++i) if(list[i].zhishu==x.zhishu) return i; return -1;//这里原来写0,但是总是会出现重复的指数,最后发现当i==0时相等也是返回0 } template <class T> SeqList<T>::SeqList(int max) { list = new T[max]; MaxSize = max; size = 0; } template <class T> SeqList<T>::~SeqList() { delete []list; } template <class T> int SeqList<T>::Size() { return size; } template <class T> int SeqList<T>::Maxsize() { return MaxSize; } template <class T> T SeqList<T>::GetData(int i) { return list[i]; } template <class T> void SeqList<T>::Delete(int i) { if((i<0)||(i>size-1)) { cout<<"元素不存在!!"<<endl; exit(0); } for(int j=i;j<=size-2;j++) list[j] = list[j+1]; size--; } template <class T> void SeqList<T>::Insert(int i,const T& x) { if(size == MaxSize) { cout<<"顺序表已满,插入错误!"<<endl; exit(0); } if((i<0)||(i>size)) { cout<<"插入位置错误!"<<endl; exit(0); } //list[i]~list[size-1]整体往后移动 for(int j=size-1;j>=i;j--) list[ j+1] = list[ j]; list[i] = x; size++; } template <class T> void SeqList<T>::Print() { for(int i=0;i<=size-1;i++) { if(list[i].xishu>0) cout<<"+"; cout<<list[i].xishu<<"x^"<<list[i].zhishu<<" "; } cout<<endl; } template <class T> void SeqList<T>::Add(const T& x) {/*线性表加入一项x; 若有序表中不存在与x同指数的元素,则按x的指数大小插入; 否则,在表中已存在与x同指数的元素,则该元素的系数加上x的系数,若系数和为0,则要删除该元素; */ //请在此处完成函数 /*int t; if(!size)list[size++]=x;else{*/ /* t=Find(x); if(!t){*/ list[size++]=x; for(int i=size-1;i>0;--i) if(list[i].zhishu<list[i-1].zhishu)swap(list[i],list[i-1]); /* }*/ /*}*/ } template <class T> void SeqList<T>::operator =(const SeqList<T>& other) { //请在此处完成函数 MaxSize = other.MaxSize; size = other.size; for(int i=0;i<size;++i) list[i] = other.list[i]; } template <class T> SeqList<T> SeqList<T>::operator +(const SeqList<T>& other) { /*SeqList<T>* temp=new SeqList<T>(N);*/ //请在此处完成函数 MaxSize+=other.MaxSize; int t; for(int i=0;i<other.size;++i){ t=Find(other.list[i]); if(t==-1){ list[size++]=other.list[i]; for(int j=size-1;j>0;--j)//就是变量还是用了i,所以一直出错 if(list[j].zhishu<list[j-1].zhishu)swap(list[j],list[j-1]); else break; } else{ if(list[t].xishu+other.list[i].xishu==0) Delete(t); else list[t].xishu += other.list[i].xishu; } } return *this; } void main() { Data temp; SeqList<Data> L1(N),L2(N),L3(N); srand((unsigned)time(NULL)); while(L1.Size()<N/2)//利用随机函数产生构造多项式L1 { temp.zhishu=int(rand())%10+1; temp.xishu=int(rand())%100-50+1; if(L1.Find(temp)!=-1) continue; L1.Add(temp); } L1.Print(); while(L2.Size()<N/2)//利用随机函数产生构造多项式L2 { temp.zhishu=int(rand())%10; temp.xishu=int(rand())%100-50; if(L2.Find(temp)!=-1)continue; L2.Add(temp); } L2.Print(); L3=L1+L2; //利用对“+”运算符重载实现两多项式相加 L3.Print(); getch(); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息
- C++中拷贝构造函数的应用详解