单链表部分本想用友元函数实现一元多项式的输出,一直没理解在重新定义新的类型的链表时报错,所以下面的代码将多项式求和与约瑟夫环问题的代码分开了
顺序表实现集合的交集并集差集,大整数求和
"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;
}