順序表:大整數求和,單鏈表:一元多項式求和、約瑟夫環問題
阿新 • • 發佈:2019-02-07
單鏈表部分本想用友元函式實現一元多項式的輸出,一直沒理解在重新定義新的型別的連結串列時報錯,所以下面的程式碼將多項式求和與約瑟夫環問題的程式碼分開了
順序表實現集合的交集並集差集,大整數求和
"list.cpp"
main函式#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; }
#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;
}