数据结构-顺序表-(C++)
这是一个还在学习中的菜鸟编的顺序表代码,可以实现顺序表的基本功能。例如:删除,插入,查找,遍历,逆置,升序,降序。
template<class ElemType>
class SqList
{
public:
SqList(int m=0);//初始化
~SqList();//销毁
bool Append(const ElemType &);//表尾插入
bool Insert(const ElemType &,int);//插入
bool Delete(ElemType &,int);//删除
int LocateElem (const ElemType &)const;//查找
void Traverse(void (*visit)(const ElemType &))const;//遍历
void Invert();//逆置
void SortAscending();//升序
void DescendingOrder();//降序
private:
int len;//数组长度
int size;//线性表长度
ElemType *elem;//第一个元素地址
};
template<class ElemType>
SqList<ElemType>::SqList(int m)//初始化
{
len=0;
if(m==0)
elem=NULL;
else
elem=new ElemType[m];
size=m;
}
template<class ElemType>
SqList<ElemType>::~SqList()//销毁
{delete[] elem;}
template<class ElemType>
int SqList<ElemType>::LocateElem(const ElemType &e)const//查找
{
ElemType *p=elem;
int i=1;
while (i<=len&&*p!=e)
{
p++;
i++;
}
if(i<=len)
return i;
return 0;
}
template<class ElemType>
bool SqList<ElemType>::Insert(const ElemType &e ,int i)//在第i个插入新元素
{
if(i<1||i>len+1)
return false;
if(len>=size)
{
ElemType *newbase;
newbase=new ElemType[size+10];
if(!newbase)
return false;
for(int j=0;j<len;j++)
newbase[j]=elem[j];
delete[] elem;
elem=newbase;
size+=10;
}
ElemType *p,*q;
q=&elem[i-1];
for(p=&elem[len-1];p>=q;--p)
*(p+1)=*p;
*q=e;
++len;
return true;
}
template<class ElemType>
bool SqList<ElemType>::Delete(ElemType &e,int i)//删除第i个元素
{
if(i<1||i>len)
return false;
ElemType *p,*q;
p=&elem[i-1];
e=*p;q=elem+len-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--len;
return true;
}
template<class ElemType>
bool SqList<ElemType>::Append(const ElemType &e)//表尾插入元素
{
ElemType *newbase;
if(len>=size)
{
newbase=new ElemType[size+10];
if(!newbase)
return false;
for(int j=0;j<len;j++)
newbase[j]=elem[j];
delete[] elem;
elem=newbase;
size+=10;
}
elem[len++]=e;
return true;
}
template<class ElemType>
void SqList<ElemType>::Traverse(void (*visit)(const ElemType &e))const//遍历
{
ElemType *p=elem;
for(int i=0;i<len;i++)
visit(*p++);
}
主函数测试:
#include"SqList.h"
using namespace std;
void print (const &i)
{cout<<i<<" ";}
int main()
{
int n,i,a,b,c,d,e;
int item;
SqList<int>numbers(10);
cout<<"产生一个顺序表,请输入元素个数,以及各个元素:"<<endl;
cin>>n;
for(i=0;i<n;i++)
{
cin>>item;
numbers.Append(item);
}
cout<<endl;
cout<<"输入一个你想查找的数:"<<endl;
cin>>a;
if(numbers.LocateElem(a))
cout<<"有这个数,在这个顺序表中第"<<numbers.LocateElem(a)<<"个"<<endl;
else cout<<"没有,不要问了。。"<<endl;
cout<<endl;
cout<<"你想在这个顺序表插入怎样一个数,且在第几个插入,请输出来"<<endl;
cin>>b>>c;
numbers.Insert(b,c);
cout<<"好了,那么它现在是这样的:"<<endl;
numbers.Traverse(print);
cout<<endl;
cout<<endl;
cout<<"你想在这个顺序表删去怎样一个数,且它在第几个,请输出来"<<endl;
cin>>d>>e;
numbers.Delete(d,e);
cout<<"好了,那么它现在是这样的:"<<endl;
numbers.Traverse(print);
cout<<endl;
cout<<endl;
cout<<"现在倒置一下这个顺序表,可以得到:"<<endl;
numbers.Invert();
numbers.Traverse(print);
cout<<endl;
cout<<endl;
cout<<"现在给这个顺序表升序排序,可以得到:"<<endl;
numbers.SortAscending();
numbers.Traverse(print);
cout<<endl;
cout<<endl;
cout<<"现在给这个顺序表降序排序,可以得到:"<<endl;
numbers.DescendingOrder();
numbers.Traverse(print);
cout<<endl;
cout<<endl;
return 0;
}
本菜鸟还在学习中,不足之处恳请路过大佬指正~
giao~