顺序表的实现

来源:互联网 发布:中国信保 知乎 编辑:程序博客网 时间:2024/05/17 23:38
/*SeqList.h*/#ifndef _SEQLIST_H_#define _SEQLIST_H_const int DefaultSize=100;#include<assert.h>#include<conio.h>//程序中使用了getch函数,需要包含这个头文件/*创建模板类,定义与实现必须放在同一个文件中*/template<class T>class CSeqList{public:CSeqList(int maxSize=DefaultSize);CSeqList(const CSeqList<T>& list);~CSeqList(); int Size()const; int Length()const; int Search(const T& x)const; bool GetData(int i,T&x)const;//i为下标,从0开始,以下同 bool SetData(int i,const T&x); bool Insert(int i,const T&x);//在第i个元素之前插入元素x bool Append(int i,const T&x);//在第i个元素之后插入元素x bool Append(const T&x);//在最后添加元素x bool Remove(int i,T&x); bool IsEmpty()const; bool IsFull()const; void clear(){last=-1;} void Sort(); void Input(); void Output()const; CSeqList<T>& operator=(const CSeqList<T>&list); void trim();//相同元素只保留一个private:void reSize();T* data;int maxSize;int last;};template<class T>CSeqList<T>::CSeqList(int maxSize){assert(maxSize>0);this->maxSize=maxSize;last=-1;data=new T[maxSize];memset(data,0,sizeof(data));}template<class T>CSeqList<T>::CSeqList(const CSeqList<T>& list){maxSize=list.Size();data=new T[maxSize];last=list.Length()-1;for(int i=0;i<=last;i++){T x;list.GetData(i,x);data[i]=x;}}template<class T>CSeqList<T>& CSeqList<T>::operator=(const CSeqList<T>& list){if(data!=NULL)delete[]data;maxSize=list.Size();data=new T[maxSize];last=list.Length()-1;for(int i=0;i<=last;i++){T x;list.GetData(i,x);data[i]=x;}return *this;}template<class T>CSeqList<T>::~CSeqList(){if(data!=NULL)delete[]data;}template<class T>int CSeqList<T>::Size()const{return maxSize;}template<class T>int CSeqList<T>::Length()const{return last+1;}template<class T>int CSeqList<T>::Search(const T& x)const{for(int i=0;i<=last;i++)if(x==data[i])return i;return -1;}template<class T>bool CSeqList<T>::GetData(int i,T&x)const{if(i<0||i>last)return false;x=data[i];return true;}template<class T>bool CSeqList<T>::SetData(int i,const T&x){if(i<0||i>last)return false;data[i]=x;return true;}template<class T>bool CSeqList<T>::Insert(int i,const T&x){if(i<0||i>last)return false;if(IsFull())return false;for(int j=last;j>=i;j--)data[j+1]=data[j];data[i]=x;last++;return true;}template<class T>bool CSeqList<T>::Append(int i,const T&x){if(i<0||i>last)return false;if(IsFull())return false;for(int j=last;j>=i+1;j--)data[j+1]=data[j];data[i+1]=x;last++;return true;}template<class T>bool CSeqList<T>::Append(const T&x){if(IsFull())return false;data[++last]=x;}template<class T>bool CSeqList<T>::Remove(int i,T&x){if(i<0||i>last)return false;x=data[i];for(int j=i+1;j<=last;j++)data[j-1]=data[j];last--;return true;}template<class T>bool CSeqList<T>::IsEmpty()const{return last==-1;}template<class T>bool CSeqList<T>::IsFull()const{return last+1==maxSize;}template<class T>void CSeqList<T>::Sort(){for(int i=0;i<last;i++){int k=i;for(int j=i+1;j<last+1;j++)if(data[k]>data[j])k=j;if(k!=i){int tmp=data[k];data[k]=data[i];data[i]=tmp;}}}template<class T>void CSeqList<T>::Input(){cout<<"Enter your elements,\nusing CTRL+D to stop it."<<endl;T element;while(cin>>element){if(IsFull()){cerr<<"SeqList Full!ReSize now?(Y/N)";char ch;ch=getch();//这里不能使用cin>>ch,cin缓冲区不空时,cin从cin缓冲区读取数据,而不从键盘读取数据putchar(ch);putchar('\n');if(ch=='N'||ch=='n')break;else{reSize();}}data[++last]=element;}}template<class T>void CSeqList<T>::Output()const{for(int i=0;i<=last;i++)cout<<data[i]<<" ";cout<<endl;}/*默认扩充为原来的两倍容量*/template<class T>void CSeqList<T>::reSize(){T* newdata=new T[2*maxSize];for(int i=0;i<=last;i++)newdata[i]=data[i];delete[]data;data=newdata;maxSize*=2;}template<class T>void CSeqList<T>::trim(){CSeqList<T>result;for(int i=0;i<=last;i++)if(result.Search(data[i])==-1)result.Append(data[i]);*this=result;}#endif

/*main.cpp*/#include<iostream>#include"SeqList.h"using namespace std;/*求两集合的并,时间复杂度是O(m*n)*/template<class T>void unionSet(const CSeqList<T>&listA,const CSeqList<T>& listB){CSeqList<T>list(listA);int last=listA.Length()-1,len=listB.Length();T x;for(int i=0;i<len;i++){listB.GetData(i,x);list.Append(x);}list.trim();//去除重复元素list.Output();}/*求两个集合的交,时间复杂度O(m*n)*/template<class T>void interSet(const CSeqList<T>&listA,const CSeqList<T>& listB){CSeqList<T>list;int last=listA.Length()-1;T x;for(int i=0;i<=last;i++){listA.GetData(i,x);if(listB.Search(x)!=-1)list.Append(x);}list.trim();//去除重复元素list.Output();}void menu(){cout<<"****************菜单*******************"<<endl;cout<<"0:输入元素"<<endl;cout<<"1:查看体积"<<endl;cout<<"2:查看实际大小"<<endl;cout<<"3:搜索元素"<<endl;cout<<"4:获取元素"<<endl;cout<<"5:修改元素"<<endl;cout<<"6:向前插入(Insert)元素"<<endl;cout<<"7:向后插入(Append)元素"<<endl;cout<<"8:删除元素"<<endl;cout<<"9:检查是否为空"<<endl;cout<<"10:检查是否为满"<<endl;cout<<"11:排序"<<endl;cout<<"12:打印所有元素"<<endl;cout<<"13:清屏"<<endl;cout<<"-1:退出"<<endl;cout<<"************************************"<<endl;}int main(){CSeqList<int>listA,listB;listA.Input();cin.clear();cin.sync();listB.Input();unionSet(listA,listB);interSet(listA,listB);/**被注释掉的部分用于对类中函数做测试menu();CSeqList<T>list;int ch;while(true){cout<<"选择操作:";cin.clear();//设置cin状态cin.sync();//清空cin缓冲区cin>>ch;switch(ch){case 0:list.Input();break;case 1:cout<<list.Size()<<endl;break;case 2:cout<<list.Length()<<endl;break;case 3:{cout<<"输入待搜索元素:";int x;cin>>x;int index=list.Search(x);if(index==-1)cout<<x<<"不存在"<<endl;else cout<<index<<endl;}break;case 4:{cout<<"输入待获取元素的下标:";int index,x;cin>>index;if(list.GetData(index,x))cout<<"list["<<index<<"]="<<x<<endl;else cout<<"获取元素失败!"<<endl;}break;case 5:{cout<<"输入待修改元素的下标与新值:";int index,x;cin>>index>>x;if(list.SetData(index,x))cout<<"修改成功"<<endl;else cout<<"修改失败"<<endl;}break;case 6:{cout<<"输入插入位置与数值:";int index,x;cin>>index>>x;if(list.Insert(index,x))cout<<"插入成功"<<endl;else cout<<"插入失败"<<endl;}break;case 7:{cout<<"输入插入位置与数值:";int index,x;cin>>index>>x;if(list.Append(index,x))cout<<"插入成功"<<endl;else cout<<"插入失败"<<endl;}break;case 8:{cout<<"输入删除位置:";int index,x;cin>>index;if(list.Remove(index,x))cout<<"删除成功"<<endl;else cout<<"删除失败"<<endl;}break;case 9:cout<<(list.IsEmpty()?"空":"非空")<<endl;break;case 10:cout<<(list.IsFull()?"满":"不满")<<endl;break;case 11:list.Sort();cout<<"排序完成"<<endl;break;case 12:list.Output();break;case 13:system("cls");menu();break;case -1:goto Lable;break;default:cout<<"未知命令"<<endl;break;}}*/Lable:return 0;}


原创粉丝点击