链表实现集合及多项式运算

来源:互联网 发布: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();
}
0 0