链表实现集合及多项式运算
来源:互联网 发布:c语言 什么意思 编辑:程序博客网 时间:2024/04/29 16:38
#include<iostream>//注意这个总类只调试了构造和输出,其他的函数还没有进行调试
using namespace std;
template<class DataType>
struct Node
{
DataType data;
Node/*结点也是类的一种,所以跟定义类的时候一样需要有尖括号*/<DataType>*next;
};
struct elem
{
int coef;
int exp;
};
template<class DataType>
class LinklistSet
{
public:
LinklistSet();
LinklistSet(DataType a[],int n);
//~LinklistSet();
void Insert(DataType x);
void PrintList();
void PrintMul();
int Length();
Node<DataType>* First();
bool IsSet(DataType x);
LinklistSet<DataType> Union(LinklistSet<DataType> a);
LinklistSet<DataType> Intersection(LinklistSet<DataType> a);
LinklistSet<DataType> Difference(LinklistSet<DataType> a);
friend void Add(LinklistSet<elem>&A,LinklistSet<elem>&B);//不同就在于其数据域的数据类型而已
private:
Node<DataType>*first;
};
template<class DataType>
Node<DataType>* LinklistSet<DataType>::First()
{
return first;
}
template<class DataType>
LinklistSet<DataType>::LinklistSet()
{
first=new Node<DataType>;//为头结点分配存储空间,而不必说明他的模板类型
first->next=NULL;
}
template<class DataType>
LinklistSet<DataType>::LinklistSet(DataType a[],int n)
{
first=new Node<DataType>;
first->next=NULL;
Node<DataType>*tail=first;
for(int i=0;i<n;i++)//插入都是在循环里申请空间的
{
Node<DataType>*s=new Node<DataType>;
s->data=a[i];
s->next=tail->next;
tail->next=s;
tail=s;
}
}
/*template<class DataType>
LinklistSet<DataType>::~LinklistSet()
{
while(first!=NULL)
{
Node<DataType>*p=first;
first=first->next;
delete p;
}
}*/
template<class DataType>
bool LinklistSet<DataType>:: IsSet(DataType x)
{
Node<DataType>*p=first->next;
for(int i=1;i<=Length();i++)
{
if(p->data==x)
return true;
else p=p->next;
}
return false;
}
template<class DataType>
void LinklistSet<DataType>::Insert(DataType x)
{
Node<DataType>*s=new Node<DataType>;
s->data=x;
Node<DataType>*p=first;//一开始错了,注意以后的插入删除操作要考虑空表的情况,指代指针不能指向第一个结点因为第一个结点很可能不存在
while(p->next!=NULL)
{
p=p->next;
}
s->next=NULL;
p->next=s;
}
template<class DataType>
void LinklistSet<DataType>::PrintMul()
{
Node<DataType>*p=first->next;
int i=1;
while(p!=NULL)
{
cout<<p->data.coef<<"x^"<<p->data.exp;
if(p->next!=NULL)
cout<<"+";
p=p->next;
}
}
template<class DataType>
void LinklistSet<DataType>::PrintList()
{
Node<DataType>*p=first->next;
int i=1;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
}
template<class DataType>
int LinklistSet<DataType>::Length()
{
Node<DataType>*p=first->next;
int i=0;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
template<class DataType>
LinklistSet<DataType> LinklistSet<DataType>::Union(LinklistSet<DataType> otherset)
{
Node<DataType>*p=first;
//cout<<p->data<<endl;
Node<DataType>*q=otherset.First();
//cout<<q->data<<endl;
LinklistSet<DataType> result;
if(Length()==0)
{
cout<<"The set A is null"<<endl;
}
else
{
for(int i=1;i<=Length();i++)
{
if(p->next!=NULL)
{
result.Insert(p->next->data);
//result.Insert(5);
p=p->next;
}
//cout<<"haha"<<endl;
}
}
if(otherset.Length()==0)
{
cout<<"The set B is null"<<endl;
}
else
{
for(int j=1;j<=otherset.Length();j++)
{
if(q->next!=NULL)
{
if(result.IsSet(q->next->data))
{
q=q->next;
}
else
{
result.Insert(q->next->data);
q=q->next;
}
}
}
}
if(result.Length()==0)
cout<<"The intersection is null"<<endl;
return result;
}
template<class DataType>
LinklistSet<DataType> LinklistSet<DataType>::Intersection(LinklistSet<DataType> otherset)
{
//Node<DataType>*p=first;
Node<DataType>*q=otherset.First();
LinklistSet<DataType> result;
if(Length()==0)
{
cout<<"The set A is null"<<endl;
cout<<"The intersection is null"<<endl;
return result;
}
if(otherset.Length()==0)
{
cout<<"The set B is null"<<endl;
cout<<"The intersection is null"<<endl;
return result;
}
for(int j=1;j<=otherset.Length();j++)//可以尝试一下直接用指针来作为循环条件
{
if(q->next!=NULL&&IsSet(q->next->data))
{
result.Insert(q->next->data);
q=q->next;
}
else
q=q->next;
}
if(result.Length()==0)
cout<<"The ivoid Add(LinklistSet<elem>&A,LinklistSet<elem>&B)ntersection is null"<<endl;
return result;
}
template<class DataType>
LinklistSet<DataType> LinklistSet<DataType>::Difference(LinklistSet<DataType> otherset)
{
//Node<DataType>*p=first;
Node<DataType>*q=otherset.First();
LinklistSet<DataType> result;
if(Length()==0)
{
cout<<"The set A is null"<<endl;
return otherset;
}
if(otherset.Length()==0)
{
cout<<"The set B is null"<<endl;
return *this;
}
for(int j=1;j<=otherset.Length();j++)//可以尝试一下直接用指针来作为循环条件
{
if(q->next!=NULL&&!(IsSet(q->next->data)))
{
result.Insert(q->next->data);
q=q->next;
}
else
q=q->next;
}
if(result.Length()==0)
cout<<"The intersection is null"<<endl;
return result;
}
void Add(LinklistSet<elem>&A,LinklistSet<elem>&B)
{
Node<elem>*pre=A.first;
Node<elem>*p=pre->next;
Node<elem>*qre=B.first;
Node<elem>*q=qre->next;
while(p!=NULL&&q!=NULL)
{
if(p->data.exp<q->data.exp)//谁小把谁往后移
{
pre=p;
p=p->next;
}
else if(p->data.exp>q->data.exp)
{
Node<elem>*v=q->next;//保存p->next(需要移动指针p)
q->next=pre->next;
pre->next=q;
pre=q;
q=v;
}
else//q怎么滴都得被删除和往后移,区别只在于p删还是不删
{
p->data.coef=p->data.coef+q->data.coef;
if(p->data.coef==0)
{
pre->next=p->next;//删除只关注前面就可以了,这一步已经移动了pre
delete p;
p=pre->next;
}
else
{
pre=p;
p=p->next;
}
qre->next=q->next;
delete q;
q=qre->next;
}
}
if(q!=NULL)
{
pre->next=q;
}
delete B.first;
}
int main()
{
cout<<"一、集合运算:"<<endl;
int test1[5]={7,8,4,5,3};
int test2[5]={1,3,5,7,9};
LinklistSet<int> l1(test1,5);
LinklistSet<int> l2(test2,5);
cout<<"集合A:";
l1.PrintList();
cout<<endl;
cout<<"集合B:";
l2.PrintList();
cout<<endl;
cout<<"A和B的并集:";
l1.Union(l2).PrintList();
cout<<endl;
cout<<"A和B的交集:";
l1.Intersection(l2).PrintList();
cout<<endl;
cout<<"B-A:";
l1.Difference(l2).PrintList();
cout<<endl;
/* cout<<"二、控制台输入:"<<endl;//有时间想想如何从控制台输入
cout<<"Are you sure?(y or n):";
cout<<"please input set A:(the number of it is 5)";
int a[5];
int b[5];
//LinklistSet<int> l3;
//LinklistSet<int> l4;
for(int i=0;char c=cin.get()!='\n';i++)
{
cin>>a[i];
}void Add(LinklistSet<elem>&A,LinklistSet<elem>&B)
cout<<"please input set B:(the number of it is 5)";
for(int i=0;char c=cin.get()!='\n';i++)
{
cin>>b[i];
}
LinklistSet<int> l3(a,5);
LinklistSet<int> l4(b,5);
cout<<"集合A:";
l3.PrintList();
cout<<endl;
cout<<"集合B:";
l4.PrintList();
cout<<endl;
cout<<"A和B的并集:";
l3.Union(l4).PrintList();
cout<<endl;
cout<<"A和B的交集:";
l3.Intersection(l4).PrintList();
cout<<endl;
cout<<"B-A:";
l3.Difference(l4).PrintList();
cout<<endl;
//l1.Union(l2).PrintList();
//l1.Intersection(l2).PrintList();
// l1.Difference(l2).PrintList();
//l1.Insert(5);
// l2.PrintList();
//l1.PrintList();
//l1.IsSet(1);
// cout<<l1.First()->next->data<<endl;
//cout<<l1.Length();*/
cout<<endl;
cout<<"二、一元多项式求和:"<<endl;
cout<<endl;
elem test3[5];
elem test4[5];
cout<<"请为多项式A赋初值"<<endl;
cout<<endl;
cout<<"请输入多项式A的系数(五个)"<<endl;
for(int i=0;i<5;i++)
{
cin>>test3[i].coef;
}
cout<<"请输入多项式A的指数(五个)"<<endl;
for(int i=0;i<5;i++)
{
cin>>test3[i].exp;
}
cout<<"请为多项式B赋初值"<<endl;
cout<<endl;
cout<<"请输入多项式B的系数(五个)"<<endl;
for(int i=0;i<5;i++)
{
cin>>test4[i].coef;
}
cout<<"请输入多项式B的指数(五个)"<<endl;
for(int i=0;i<5;i++)
{
cin>>test4[i].exp;
}
LinklistSet<elem>l3(test3,5);
LinklistSet<elem>l4(test4,5);
Add(l3,l4);
cout<<endl;
cout<<"结果是:"<<endl;
l3.PrintMul();
}
using namespace std;
template<class DataType>
struct Node
{
DataType data;
Node/*结点也是类的一种,所以跟定义类的时候一样需要有尖括号*/<DataType>*next;
};
struct elem
{
int coef;
int exp;
};
template<class DataType>
class LinklistSet
{
public:
LinklistSet();
LinklistSet(DataType a[],int n);
//~LinklistSet();
void Insert(DataType x);
void PrintList();
void PrintMul();
int Length();
Node<DataType>* First();
bool IsSet(DataType x);
LinklistSet<DataType> Union(LinklistSet<DataType> a);
LinklistSet<DataType> Intersection(LinklistSet<DataType> a);
LinklistSet<DataType> Difference(LinklistSet<DataType> a);
friend void Add(LinklistSet<elem>&A,LinklistSet<elem>&B);//不同就在于其数据域的数据类型而已
private:
Node<DataType>*first;
};
template<class DataType>
Node<DataType>* LinklistSet<DataType>::First()
{
return first;
}
template<class DataType>
LinklistSet<DataType>::LinklistSet()
{
first=new Node<DataType>;//为头结点分配存储空间,而不必说明他的模板类型
first->next=NULL;
}
template<class DataType>
LinklistSet<DataType>::LinklistSet(DataType a[],int n)
{
first=new Node<DataType>;
first->next=NULL;
Node<DataType>*tail=first;
for(int i=0;i<n;i++)//插入都是在循环里申请空间的
{
Node<DataType>*s=new Node<DataType>;
s->data=a[i];
s->next=tail->next;
tail->next=s;
tail=s;
}
}
/*template<class DataType>
LinklistSet<DataType>::~LinklistSet()
{
while(first!=NULL)
{
Node<DataType>*p=first;
first=first->next;
delete p;
}
}*/
template<class DataType>
bool LinklistSet<DataType>:: IsSet(DataType x)
{
Node<DataType>*p=first->next;
for(int i=1;i<=Length();i++)
{
if(p->data==x)
return true;
else p=p->next;
}
return false;
}
template<class DataType>
void LinklistSet<DataType>::Insert(DataType x)
{
Node<DataType>*s=new Node<DataType>;
s->data=x;
Node<DataType>*p=first;//一开始错了,注意以后的插入删除操作要考虑空表的情况,指代指针不能指向第一个结点因为第一个结点很可能不存在
while(p->next!=NULL)
{
p=p->next;
}
s->next=NULL;
p->next=s;
}
template<class DataType>
void LinklistSet<DataType>::PrintMul()
{
Node<DataType>*p=first->next;
int i=1;
while(p!=NULL)
{
cout<<p->data.coef<<"x^"<<p->data.exp;
if(p->next!=NULL)
cout<<"+";
p=p->next;
}
}
template<class DataType>
void LinklistSet<DataType>::PrintList()
{
Node<DataType>*p=first->next;
int i=1;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
}
template<class DataType>
int LinklistSet<DataType>::Length()
{
Node<DataType>*p=first->next;
int i=0;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
template<class DataType>
LinklistSet<DataType> LinklistSet<DataType>::Union(LinklistSet<DataType> otherset)
{
Node<DataType>*p=first;
//cout<<p->data<<endl;
Node<DataType>*q=otherset.First();
//cout<<q->data<<endl;
LinklistSet<DataType> result;
if(Length()==0)
{
cout<<"The set A is null"<<endl;
}
else
{
for(int i=1;i<=Length();i++)
{
if(p->next!=NULL)
{
result.Insert(p->next->data);
//result.Insert(5);
p=p->next;
}
//cout<<"haha"<<endl;
}
}
if(otherset.Length()==0)
{
cout<<"The set B is null"<<endl;
}
else
{
for(int j=1;j<=otherset.Length();j++)
{
if(q->next!=NULL)
{
if(result.IsSet(q->next->data))
{
q=q->next;
}
else
{
result.Insert(q->next->data);
q=q->next;
}
}
}
}
if(result.Length()==0)
cout<<"The intersection is null"<<endl;
return result;
}
template<class DataType>
LinklistSet<DataType> LinklistSet<DataType>::Intersection(LinklistSet<DataType> otherset)
{
//Node<DataType>*p=first;
Node<DataType>*q=otherset.First();
LinklistSet<DataType> result;
if(Length()==0)
{
cout<<"The set A is null"<<endl;
cout<<"The intersection is null"<<endl;
return result;
}
if(otherset.Length()==0)
{
cout<<"The set B is null"<<endl;
cout<<"The intersection is null"<<endl;
return result;
}
for(int j=1;j<=otherset.Length();j++)//可以尝试一下直接用指针来作为循环条件
{
if(q->next!=NULL&&IsSet(q->next->data))
{
result.Insert(q->next->data);
q=q->next;
}
else
q=q->next;
}
if(result.Length()==0)
cout<<"The ivoid Add(LinklistSet<elem>&A,LinklistSet<elem>&B)ntersection is null"<<endl;
return result;
}
template<class DataType>
LinklistSet<DataType> LinklistSet<DataType>::Difference(LinklistSet<DataType> otherset)
{
//Node<DataType>*p=first;
Node<DataType>*q=otherset.First();
LinklistSet<DataType> result;
if(Length()==0)
{
cout<<"The set A is null"<<endl;
return otherset;
}
if(otherset.Length()==0)
{
cout<<"The set B is null"<<endl;
return *this;
}
for(int j=1;j<=otherset.Length();j++)//可以尝试一下直接用指针来作为循环条件
{
if(q->next!=NULL&&!(IsSet(q->next->data)))
{
result.Insert(q->next->data);
q=q->next;
}
else
q=q->next;
}
if(result.Length()==0)
cout<<"The intersection is null"<<endl;
return result;
}
void Add(LinklistSet<elem>&A,LinklistSet<elem>&B)
{
Node<elem>*pre=A.first;
Node<elem>*p=pre->next;
Node<elem>*qre=B.first;
Node<elem>*q=qre->next;
while(p!=NULL&&q!=NULL)
{
if(p->data.exp<q->data.exp)//谁小把谁往后移
{
pre=p;
p=p->next;
}
else if(p->data.exp>q->data.exp)
{
Node<elem>*v=q->next;//保存p->next(需要移动指针p)
q->next=pre->next;
pre->next=q;
pre=q;
q=v;
}
else//q怎么滴都得被删除和往后移,区别只在于p删还是不删
{
p->data.coef=p->data.coef+q->data.coef;
if(p->data.coef==0)
{
pre->next=p->next;//删除只关注前面就可以了,这一步已经移动了pre
delete p;
p=pre->next;
}
else
{
pre=p;
p=p->next;
}
qre->next=q->next;
delete q;
q=qre->next;
}
}
if(q!=NULL)
{
pre->next=q;
}
delete B.first;
}
int main()
{
cout<<"一、集合运算:"<<endl;
int test1[5]={7,8,4,5,3};
int test2[5]={1,3,5,7,9};
LinklistSet<int> l1(test1,5);
LinklistSet<int> l2(test2,5);
cout<<"集合A:";
l1.PrintList();
cout<<endl;
cout<<"集合B:";
l2.PrintList();
cout<<endl;
cout<<"A和B的并集:";
l1.Union(l2).PrintList();
cout<<endl;
cout<<"A和B的交集:";
l1.Intersection(l2).PrintList();
cout<<endl;
cout<<"B-A:";
l1.Difference(l2).PrintList();
cout<<endl;
/* cout<<"二、控制台输入:"<<endl;//有时间想想如何从控制台输入
cout<<"Are you sure?(y or n):";
cout<<"please input set A:(the number of it is 5)";
int a[5];
int b[5];
//LinklistSet<int> l3;
//LinklistSet<int> l4;
for(int i=0;char c=cin.get()!='\n';i++)
{
cin>>a[i];
}void Add(LinklistSet<elem>&A,LinklistSet<elem>&B)
cout<<"please input set B:(the number of it is 5)";
for(int i=0;char c=cin.get()!='\n';i++)
{
cin>>b[i];
}
LinklistSet<int> l3(a,5);
LinklistSet<int> l4(b,5);
cout<<"集合A:";
l3.PrintList();
cout<<endl;
cout<<"集合B:";
l4.PrintList();
cout<<endl;
cout<<"A和B的并集:";
l3.Union(l4).PrintList();
cout<<endl;
cout<<"A和B的交集:";
l3.Intersection(l4).PrintList();
cout<<endl;
cout<<"B-A:";
l3.Difference(l4).PrintList();
cout<<endl;
//l1.Union(l2).PrintList();
//l1.Intersection(l2).PrintList();
// l1.Difference(l2).PrintList();
//l1.Insert(5);
// l2.PrintList();
//l1.PrintList();
//l1.IsSet(1);
// cout<<l1.First()->next->data<<endl;
//cout<<l1.Length();*/
cout<<endl;
cout<<"二、一元多项式求和:"<<endl;
cout<<endl;
elem test3[5];
elem test4[5];
cout<<"请为多项式A赋初值"<<endl;
cout<<endl;
cout<<"请输入多项式A的系数(五个)"<<endl;
for(int i=0;i<5;i++)
{
cin>>test3[i].coef;
}
cout<<"请输入多项式A的指数(五个)"<<endl;
for(int i=0;i<5;i++)
{
cin>>test3[i].exp;
}
cout<<"请为多项式B赋初值"<<endl;
cout<<endl;
cout<<"请输入多项式B的系数(五个)"<<endl;
for(int i=0;i<5;i++)
{
cin>>test4[i].coef;
}
cout<<"请输入多项式B的指数(五个)"<<endl;
for(int i=0;i<5;i++)
{
cin>>test4[i].exp;
}
LinklistSet<elem>l3(test3,5);
LinklistSet<elem>l4(test4,5);
Add(l3,l4);
cout<<endl;
cout<<"结果是:"<<endl;
l3.PrintMul();
}
0 0
- 链表实现集合及多项式运算
- 多项式的运算之链表实现
- 多项式加法运算链表实现
- 一元多项式加法与乘法运算链表实现
- 多项式乘法与加法运算(链表实现)
- 线性表的基本运算及多项式的算术运算
- 顺序表实现集合及大整数运算
- 集合的运算之链表实现
- 两个链表实现集合的运算
- 多项式运算线性链表的应用
- 链表的应用---多项式运算
- 【数据结构】用链表实现多项式运算
- 顺序表实现集合运算
- 每日一题13:多项式的(基于链表实现)简单运算
- 链表实现多项式相加
- 链表实现多项式相加
- 一元多项式--链表实现
- [数据结构] 链表实现多项式
- Android项目结构介绍
- [FreeRTOS] configTICK_RATE_HZ
- Spring、Spring MVC、MyBatis整合文件配置详解
- C和指针读书笔记(5-8章)
- POJ 2586 Y2K Accounting Bug(贪心+枚举)
- 链表实现集合及多项式运算
- 在制定多项目管理计划的时候,需要考虑的3个问题?
- Discuz!开发之插件页面title、keywords、description等SEO设置
- 前端兼容性问题总结
- java泛型
- 【工作记录0018】Hightcharts 设置加载中动画背景图,防止页面假死
- 第一篇博客
- Android客户端性能优化(魅族资深工程师毫无保留奉献)
- c++作业计算某年某月有多少天,个人所得税计算器,利息计算器