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