顺序表:大整数求和,单链表:一元多项式求和、约瑟夫环问题

单链表部分本想用友元函数实现一元多项式的输出,一直没理解在重新定义新的类型的链表时报错,所以下面的代码将多项式求和与约瑟夫环问题的代码分开了


顺序表实现集合的交集并集差集,大整数求和

"list.cpp"

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define maxsize 1000
using namespace std;
template <class DataType>
class List
{
    public :
    List()
    {
        memset(data,0,sizeof(data));
        length=0;
        }
    List(DataType a[],int n);
    int getlength()
    {
        return length;
        }
    DataType get(int i);
    int find(DataType x);
    void insert(int i,DataType x);
    DataType Delete(int i);
    void print();
    friend void unionset(List<int> a,List<int> b);
    friend void mixset(List<int> a,List<int> b);
    friend void subset(List<int> a,List<int> b);
    friend void add(List<int> a,List<int> b);
    private:
    DataType data[maxsize];
    int length;
    };
template <class DataType>
List<DataType>::List(DataType a[],int n)
{
    if(n>maxsize)
    throw"参数非法";
    for(int i=0;i<n;i++)
    {
        data[i]=a[i];
        }
    length=n;
    }
template <class DataType>
DataType List<DataType>::get(int i)
{
    if(i<1&&i>length)
    throw"查找位置非法";
    else return data[i-1];
    }
template <class DataType>
int List<DataType>::find(DataType x)
{
    for(int i=0;i<length;i++)
    {
        if(data[i]==x)
        return i+1;
        }
    return 0;
    }
template <class DataType>
void List<DataType>::insert(int i,DataType x)
{
    if(length>=maxsize)
    throw"上溢";
    for(int j=length;j>=i;j--)
    data[j]=data[j-1];
    data[i-1]=x;
    length++;
    }
template <class DataType>
DataType List<DataType>::Delete(int i)
{
    if(length==0)
    throw"下溢";
    int x=data[i-1];
    for(int j=i;j<length;j++)
    data[j-1]=data[j];
    length--;
    return x;
    }
template <class DataType>
void List<DataType>::print()
{
    for(int i=0;i<length;i++)
    cout<<data[i]<<" ";
    cout<<endl;
    }

main函数

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<string>
#include"List.cpp"

using namespace std;
int max(int a,int b)
{
    return a>b?a:b;
}
void unionset(List<int> a,List<int> b)//顺序表求并集
{
    List<int> tempList=List<int>();
    for(int j=0;j<a.getlength();j++)
    {
        //cout<<a.data[j]<<" ";
        tempList.insert(j+1,a.data[j]);
    }
    for(int i=0;i<b.getlength();i++)
    {
        int temp=b.data[i];
        int flag=0;
        for(int j=0;j<a.getlength();j++)
        {
            if(temp==a.data[j])
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            tempList.insert(tempList.length+1,temp);

            }
    }
    tempList.print();
}
void mixset(List<int> a,List<int> b)//顺序表求交集
{
    List<int> tempList=List<int>();
    for(int i=0;i<a.length;i++)
    {
        int temp=a.data[i];
        int flag=0;
        for(int j=0;j<b.length;j++)
        {
            if(b.data[j]==temp)
            {
                flag=1;
                break;
            }
        }
        if(flag==1)
        {
            tempList.insert(tempList.length+1,temp);
        }
    }
    tempList.print();
    }
void subset(List<int> a,List<int> b)//顺序表求差集
{
    List<int> tempList=List<int>();
    for(int i=0;i<a.length;i++)
    {
        int temp=a.data[i];
        int flag=0;
        for(int j=0;j<b.length;j++)
        {
            if(b.data[j]==temp)
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            tempList.insert(tempList.length+1,temp);
        }
    }
    tempList.print();
}
void add(List<int> a,List<int> b)
{
    List<int> tempList=List<int>();
    int temp=0;
    int flag=0;//是否进位
    int val;//本位和
    for(int i=a.getlength()-1;i>=0;i--)
    {
        //cout<<a.data[i]<<"  "<<b.data[i]<<endl;
        temp=a.data[i]+b.data[i]+flag;
        flag=temp/10;
        val=temp%10;
        tempList.insert(1,val);
        //cout<<"tempList test"<<endl;
        //tempList.print();
    }
    tempList.print();
}
int main()
{
    int a[]={1,2,3,4,5,6,7,8,9,10};
    int b[]={1,3,5,7,9,11,13,15,17,19,2,56,5623,3265464,65,2362};
    List<int> List1(a,10);
    List<int> List2(b,16);
    /*List<int> tempList=List<int>();
    cout<<tempList.getlength()<<endl;
    tempList.insert(1,3);
    tempList.insert(2,54);
    tempList.insert(3,32);
    tempList.print();*/
    cout<<"----------------------Test union-----------------------"<<endl;
    unionset(List1,List2);
    cout<<"-----------------------Test mix------------------------"<<endl;
    mixset(List1,List2);
    cout<<"-----------------------Test sub------------------------"<<endl;
    subset(List1,List2);
    cout<<"----------------------Add input------------------------"<<endl;
    string s1;
    cin>>s1;
    string s2;
    cin>>s2;
    if((int)s2.length()>(int)s1.length())
    {
        swap(s1,s2);
    }
    int s1_length=s1.length();
    int s2_length=s2.length();
    int int_s1[s1.length()];
    int int_s2[s1.length()];
    for(int i=0;i<s1_length;i++)
        int_s1[i]=s1[i]-'0';
    memset(int_s2,0,sizeof(int_s2));
    for(int i=s1_length-1,j=s2_length-1;i>=s1_length-s2_length,j>=0;i--,j--)
        int_s2[i]=s2[j]-'0';
    /*for(int i=0;i<s1_length;i++)
    {
    cout<<int_s1[i]<<" ";
    }
    cout<<endl;
    for(int i=0;i<s1_length;i++)
    {
    cout<<int_s2[i]<<" ";
    }*/
    List<int> List3(int_s1,s1_length);
    List<int> List4(int_s2,s1_length);
    add(List3,List4);
    return 0;
}

单链表实现一元多项式求和,约瑟夫环问题

"Linklist.cpp"

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define maxsize 100
using namespace std;
template <class DataType>
struct Node
{
    DataType data;
    Node<DataType> *next;
};
//一元多项式
struct elem
{
    int coef;
    int exp;
};
template <class DataType>
class Linklist
{
    public :
    Linklist();
    Linklist(DataType a[],int n);
    ~Linklist();
    int getlength();
    DataType get(int i);
    int find(DataType x);
    void insert(int i,DataType x);
    DataType Delete(int i);
    void print();
    /*friend void unionset(Linklist<int> A,Linklist<int> B);
    friend void mixset(Linklist<int> A,Linklist<int> B);
    friend void subset(Linklist<int> A,Linklist<int> B);*/
    //friend void Joseph(Linklist<char> A);
    /*friend void Add(Linklist<elem> A,Linklist<elem> B);
    friend  ostream & operator<<(ostream  &os, const Linklist<elem> &c)
    {
        Node<elem> *p;
        p=c.first->next;
        os<<p->data.coef<<"x^"<<p->data.exp;
        p=p->next;
        while(p!=NULL)
        {
            os<<"+"<<p->data.coef<<"x^"<<p->data.exp;
            p=p->next;
        }
        os<<endl;
        return os;
    }*/
    friend void Joseph(Linklist<char> A);
    private:
    Node<DataType> *first;
    };
template <class DataType>
Linklist<DataType>::Linklist()
{
    Node<DataType> first;
    first->next=NULL;
    }
template <class DataType>
Linklist<DataType>::Linklist(DataType a[],int n)
{
    Node<DataType> *r,*s;
    first=new Node<DataType>;
    r=first;
    for(int i=0;i<n;i++)
    {
        s=new Node<DataType>;
        s->data=a[i];
        //s->next=first->next;
        //first->next=s;
        r->next=s;
        r=s;
        }
    r->next=NULL;
    }
template <class DataType>
void Linklist<DataType>::print()
{
    Node<DataType> *p;
    p=first->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
        }
    cout<<endl;
    }
template <class DataType>
int Linklist<DataType>::getlength()
{
    Node<DataType> *p=NULL;
    p=first->next;
    int count=0;
    while(p!=NULL)
    {
        p=p->next;
        count++;
        }
    return count;
    }
template <class DataType>
DataType Linklist<DataType>::get(int i)
{
    Node<DataType> *p;
    p=first->next;
    int count=1;
    while(p!=NULL&&count<i)
    {
        p=p->next;
        count++;
        }
    if(p==NULL)
    throw"位置";
    else return p->data;
    }
template <class DataType>
int Linklist<DataType>::find(DataType x)
{
    Node<DataType> *p;
    p=first->next;
    int count=1;
    while(p!=NULL)
    {
        if(p->data==x)
        return count;
        p=p->next;
        count++;
        }
    return 0;
    }
template <class DataType>
void Linklist<DataType>::insert(int i,DataType x)
{
    Node<DataType> *p,*s;
    p=first;
    int count=0;
    while(p!=NULL&&count<i-1)
    {
        p=p->next;
        count++;
    }
    if(p==NULL)
    throw"位置";
    else{
        s=new Node<DataType>;
        s->data=x;
        s->next=p->next;
        p->next=s;
        }
    }
template <class DataType>
DataType Linklist<DataType>::Delete(int i)
{
    Node<DataType> *p;
    p=first;
    int count=0;
    while(p!=NULL&&count<i-1)
    {
        p=p->next;
        count++;
    }
    if(p==NULL||p->next==NULL)
    throw"位置";
    else {
        Node<DataType> *q=NULL;
        q=p->next;
        DataType x=q->data;
        p->next=q->next;
        delete q;
        return x;
        }
    }
template <class DataType>
Linklist<DataType>::~Linklist()
{

    while(first!=NULL)
    {
        Node<DataType> *q;
        q=first;
        first=first->next;
        delete q;
        }
    }

main函数

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include"Linklist.cpp"
#define maxsize 100
using namespace std;
int size1,size2;
int length;
elem a[maxsize];
elem b[maxsize];
Linklist<elem> temp1(a,0);
Linklist<elem> temp2(b,0);
/*void unionset(Linklist<int> A,Linklist<int> B)//并集
{
    int c[maxsize];
    Node<int> *pre,*p,*qre,*q;
    Linklist<int> temp(c,0);
    pre=A.first;
    p=pre->next;
    qre=B.first;
    q=qre->next;
    int num=1;
    while(p!=NULL)
    {
        temp.insert(num++,p->data);
        p=p->next;
    }
    while(q!=NULL)
    {
        int t=q->data;
        pre=A.first;
        p=pre->next;
        int flag=0;
        while(p!=NULL)
        {
            if(p->data==t)
            {
                flag=1;
                break;
            }
            p=p->next;
        }
        if(flag==0)
            temp.insert(num++,t);
        q=q->next;
    }
    temp.print();
}*/
/*void Add(Linklist<elem> A,Linklist<elem> B)   //多项式求和
{
    Node<elem> *pre,*p,*qre,*q;
    pre=A.first;
    p=pre->next;
    qre=B.first;
    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;
            v=q->next;
            pre->next=q;
            q->next=p;
            q=v;
            }
        else {
            p->data.coef=p->data.coef+q->data.coef;
            if(p->data.coef==0)
            {
                pre->next=p->next;
                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;
    cout<<A;
}*/
void Init1()
{
    cout<<"Input "<<size1<<" poly:";
    for(int i=0;i<size1;i++)
    {
        scanf("%d %d",&a[i].coef,&a[i].exp);
        temp1.insert(i+1,a[i]);
    }
}
void Init2()
{
    cout<<"Input "<<size2<<" poly:";
    for(int i=0;i<size2;i++)
    {
        scanf("%d %d",&b[i].coef,&b[i].exp);
        temp2.insert(i+1,b[i]);
    }
}
void Joseph(int start,int d,Linklist<char> A)//约瑟夫环问题
{

    int index=start-1;
    while(A.getlength()>1)
    {
        index=(index+d-1)%A.getlength();
        cout<<"Delete"<<A.Delete(index+1)<<endl;
    }
    cout<<A.get(1)<<endl;
}
int main()
{
    //Test
    /*int a[]={1,2,3,4,5,6,7,8,9,10};
    Linklist<int> temp(a,10);
    temp.print();      //¹¹Ôì²âÊÔ
    cout<<temp.getlength()<<endl;
    cout<<temp.find(5)<<endl;   //²éѯ²âÊÔ
    temp.insert(5,456);     //²åÈë²âÊÔ
    temp.print();
    temp.Delete(5);      //ɾ³ý²âÊÔ
    temp.print();
    cout<<temp.get(9)<<endl;     //λÖòéÕÒ²âÊÔ*/
    //集合操作
    /*int a[]={1,2,3,4,5,6,7,8,9,10};
    int b[]={11,22,33,44,5,6,77,88,99,1010};
    Linklist<int> temp1(a,10);
    Linklist<int> temp2(b,10);
    unionset(temp1,temp2);*/
    //多项式求和 coef系数   exp 指数
    /*cout<<"Input length:";
    cin>>size1>>size2;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    length=max(size1,size2);
    Init1();
    Init2();
    cout<<"Linklist1:"<<temp1;
    cout<<"Linklist2:"<<temp2;
    cout<<"Ans:";
    Add(temp1,temp2);*/

    int start,d,n;
    printf("Input Num(n<=26)\n");
    scanf("%d",&n);
    printf("Automatic generation sequence\n");
    char Map[maxsize];
    Map[0]='A';
    for(int i=1;i<n;i++)
    {
        Map[i]=Map[i-1]+1;
    }
    Linklist<char> temp(Map,n);
    temp.print();
    printf("Enter the starting position and distance\n");
    scanf("%d %d",&start,&d);
    //char Map[6]={'A','B','C','D','E','F'};
    Joseph(start,d,temp);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/C18854805113/article/details/80021429