#include <iostream>
using namespace std;
const int MaxSize=100; //顺序表的大小
template <typename T>
class SqList //顺序表类
{
T *data; //存放顺序表中元素
int length; //存放顺序表的长度
public:
SqList(); //构造函数
~SqList(); //析构函数
void CreateList( ); //建立顺序表,当输入为EOF时,结束输入
void DispList(); //输出顺序表L中所有元素
int ListLength(); //求顺序表的长度
bool GetElem(int i, T &e); //求顺序表中某序号的元素值
int LocateElem(T e); //按元素值查找其序号
bool ListInsert(int i, T e); //插入数据元素
bool ListDelete(int i); //删除数据元素
void reverse();
void move();
};
//-----------------顺序表的基本运算算法--------------------------------
template <typename T>
SqList<T>::SqList() //构造函数
{
data=new T[MaxSize]; //为data分配长度为MaxSize的空间
length=0; //初始时置length为0
}
template <typename T>
SqList<T>::~SqList() //析构函数
{
delete [] data; //释放空间
}
template <typename T>
void SqList<T>::CreateList() //建立顺序表,当输入为-1时,顺序表输入结束
{
cin>>data[0];
for(int i=0;i<length+1;i++)
{
if(data[i]!=-1)
{
length++;
cin>>data[i+1];
}
}
}
template <typename T>
void SqList<T>::DispList() //输出顺序表中所有元素
{ int i;
if (length > 0)
{
for (i=0; i<length; i++) //扫描顺序表中各元素值
cout << data[i] << " ";
cout << endl;
}
}
template <typename T>
int SqList<T>::ListLength() //求顺序表的长度
{
return length;
}
template <typename T>
bool SqList<T>::GetElem(int i, T &e) //求顺序表中某序号的元素值
{ if (i < 1 || i > length)
return false; //参数错误时返回false
e=data[i - 1]; //取元素值
return true; //成功找到元素时返回true
}
template <typename T>
int SqList<T>::LocateElem(T e) //按元素值查找其序号
{ int i=0;
while (i < length && data[i]!=e)
i++; //查找元素e
if (i>=length) //未找到时返回0
return 0;
else
return i + 1; //找到后返回其逻辑序号
}
template <typename T>
bool SqList<T>::ListInsert(int i, T e) //插入数据元素在i位置插入e
{
if(length==MaxSize)
{
return false;
}
if(i<1||i>length+1)
{
return false;
}
for(int j=length;j>=i;j--)
{
data[j]=data[j-i];
data[i-1]=e;
}
length++;
return true;
}
template <typename T>
bool SqList<T>::ListDelete(int i) //删除数据元素
{
if(length==0)
{
return false;
}
if(i<1||i>length)
{
return false;
}
for(int j=i;j<length;j++)
{
data[j-1]=data[j];
}
length--;
return true;
}
template <typename T>
void SqList<T>::reverse() //逆值,逆序
{
T t;
int i = 0;
for (i; i < length / 2; i++)
{
t = data[i];
data[i] = data[length - i - 1];
data[length - i - 1] = t;
}
}
template <typename T>
void SqList<T>::move()移动比p小的到p前,移动比p大的到p后
{
int i = 0, j = length - 1;
T t1, t2, pivot = data[0];
while (i < j)
{
while (i < j && data[i] <= pivot)
{
i++;
}
while (i<j && data[j]>pivot)
{
j--;
}
if (i < j)
{
t1 = data[i];
t2 = data[j];
data[i] = t2;
data[j] = t1;
}
}
t1 = data[i - 1];
data[0] = t1;
data[i - 1] = pivot;
}
int main()
{
SqList <int> L;
L.CreateList();
L.move();
L.DispList();
return 0;
}