在所有的数据结构的种类中,有一种简单顺序存放的表,这种数据结构简单而且很实用,就是顺序表。
顺序表是一种线性聚集。顺序表的特点是为了得到顺序表中所要求的表项,必须从表的第一个表项开始,逐个访问表项,直到找到满足要求的表项为止,也就是说,对于顺序表只能顺序存取。
下面,我用代码实现顺序表的基本操作。
#include <iostream> using namespace std; class SeqList { public: SeqList(int MaxSize); ~SeqList(){delete []data;} int Length()const{return last + 1;} int Find(int &x)const; int IsIn(int &x); int Insert(int &x,int i); int Remove(int &x); int Next(int &x); int Prior(int &x); int IsEmpty(){return last == -1;} int IsFull(){return last == MaxSize - 1;} int Get(int i){return i < 0 || i > last ? NULL : data[i];} void ChooseConduct(); void ShowList(); private: int *data; int MaxSize; int last; }; SeqList::SeqList(int sz) { if(sz > 0) { MaxSize = sz; last = -1; data = new int[MaxSize]; } cout<<"请输入顺序表的数值:"; for(int i = 0;i < MaxSize;i++) { cin>>data[i]; last++; } } int SeqList::Find(int &x)const { int i = 0; while(i <= last && data[i] != x) i++; if(i > last) return -1; else return i; } int SeqList::IsIn(int &x) { int i = 0,found = 0; while(i <= last && !found) { if(data[i] != x) i++; else found = 1; } return found; } int SeqList::Insert(int &x,int i) { if(i < 0 || i > last + 1 || last == MaxSize - 1) return 0; else { last++; for(int j = last;j > i;j--) data[j] = data[j - 1]; data[i] = x; return 1; } } int SeqList::Remove(int &x) { int i = Find(x); if(i >= 0) { last--; for(int j = i;j <= last;j++) data[j] = data[j + 1]; return 1; } return 0; } int SeqList::Next(int &x) { int i = Find(x); if(i >= 0 && i < last) return data[i + 1]; else return -1; } int SeqList::Prior(int &x) { int i = Find(x); if(i > 0 && i <= last) return data[i - 1]; else return -1; } void SeqList::ShowList() { for(int i = 0;i < last + 1;i++) cout<<data[i]<<" "; cout<<endl; } void SeqList::ChooseConduct() { int Choose = 1; cout<<"1:求顺序表的长度"<<endl; cout<<"2:查找"<<endl; cout<<"3:判断是否存在某个数"<<endl; cout<<"4:插入"<<endl; cout<<"5:删除"<<endl; cout<<"6:后继"<<endl; cout<<"7:前驱"<<endl; cout<<"8:取值"<<endl; cout<<"9:判断是否为空"<<endl; cout<<"10:判断是否为满"<<endl; cout<<"11:打印顺序表"<<endl; cout<<"12:退出程序"<<endl; while(Choose) { cout<<"请输入选择:"; cin>>Choose; switch(Choose) { case 1:cout<<Length()<<endl;break; case 2: { int i; cout<<"please input the number:"; cin>>i; cout<<Find(i)<<endl; break; } case 3: { int i; cout<<"please input the number:"; cin>>i; cout<<IsIn(i)<<endl; break; } case 4: { int Num,Location; cout<<"please input the number and location:"; cin>>Num; cin>>Location; cout<<Insert(Num,Location)<<endl; break; } case 5: { int i; cout<<"please input the number:"; cin>>i; cout<<Remove(i)<<endl; break; } case 6: { int i; cout<<"please input the number:"; cin>>i; cout<<Next(i)<<endl; break; } case 7: { int i; cout<<"please input the number:"; cin>>i; cout<<Prior(i)<<endl; break; } case 8: { int i; cout<<"please input the number:"; cin>>i; cout<<Get(i)<<endl; break; } case 9:cout<<IsEmpty()<<endl;break; case 10:cout<<IsFull()<<endl;break; case 11:ShowList();break; default: { cout<<"Bye - Bye!"<<endl; return; } } } } void main() { SeqList list(5); list.ChooseConduct(); }
下面在介绍一下作为抽象数据类型,使用顺序表的事例。
“并”运算和“交”运算:
Void Union(SeqList &LA,SeqList &LB)
{
Int n = LA.Length();
Int m = LB.Length();
For(int I = 0;I < m;i++)
{
Int x = LB.Get(i);
Int k = LA.Find(x);
If(k == -1)
{
LA.Insert(n + 1,x);
N++;
}
}
}
Void Insertsection(SeqList &LA,SeqList &LB)
{
Int n = LA.Length();
Int m = LB.Length();
Int I = 0;
While(I < n )
{
Int x = LA.Get(i);
Int k = LB.Find(x);
If(k == -1)
{
LA.Remove(x);
N--;
}
Else
I++;
}
}
因为代码比较简单,所以没有什么注释!