设顺序表a中的数据元素递增有序,试设计一个算法,将x插入到顺序表的适当位置,以保持该表的有序性。

时间:2021-01-29 10:48:31

设顺序表a中的数据元素递增有序,试设计一个算法,将x插入到顺序表的适当位置,以保持该表的有序性。

//1.设顺序表a中的数据元素递增有序,试设计一个算法,将x插入到顺序表的适当位置,以保持该表的有序性。
#include<iostream> 
using namespace std;
typedef int T;  
using namespace std;  


//类的定义 
template <class T>  
class SqList   //顺序表类 
{  
    private:  
        T *elem; //表首址 
        int length; //表长 
        int listsize;//表容量 
    public:  
        SqList(int m) ;//构造函数, 创建容量为m的空表 
        ~SqList();//析构函数,删除表空间 
        void CreateList(int n);//创建具有n个元素的线性表 
        void Insert(int i,T e);//在表中第i个位置插入元素 
        int Locate(T e);//元素定位 
        void ListDisp();//输出表元素 
};  
//类的实现 
template<class T>  
SqList<T>::SqList(int m)  
{//构建函数,创建一表容量为m的空表 
    elem=new T[m];// 申请表空间 
    length=0;// 空表,表长为0 
    listsize=m;//表容量为m 
}  

template<class T>  
SqList<T>::~SqList()//析构函数 
{//释放表空间 
    delete [] elem;  
    length=0;   
    listsize=0;   
}  

template<class T>  
void SqList<T>::CreateList(int n)  
{//创建表长度为n的顺序表 
    if(n>listsize) throw"参数非法";  
    int step,chushi;  
    cout<<"请依次输入初始值和步长:";  
    cin>>chushi>>step;  
    for(int i=1;i<=n;i++)  
        elem[i-1]=chushi+(i-1)*step;  
    length=n;  
}  

template<class T>  
void SqList<T>::Insert (int i,T e)  
{// 在第i个位置插入元素,如不能插入,显示异常信息 
    if(length>=listsize) throw "上溢";  
    if(i<1||i>length+1) throw "插入位置异常";  
    for(int j=length;j>=i;j--)  
        elem[j]=elem[j-1];  
    elem[i-1]=e;  
    length++;  
}  

template<class T>  
int SqList<T>::Locate (const T e)  
{// 元素定位,若找到,返回该元素在表中的位序;末找到,返回0。 
    for(int i=0;i<length;i++)  
        if(elem[i]<=e&&elem[i+1]>=e) return i+1;  
        return 0;  
}  

template <class T>  
void SqList<T>::ListDisp()  
{//显示表内容 
    for(int i=0;i<length;i++)  
    {  
        cout<<elem[i]<<"\t";  

    }  
    cout<<endl;  
}  

 //主函数 
void main()  
{  
    int n,I;  
    T e;  
    SqList<int> L(20);  
    cout<<"请输入要创建的顺序表中元素个数:";  
    cin>>n;  
    cout<<endl;  
    L.CreateList(n);  
    cout<<endl;     
    L.ListDisp();  
    cout<<endl;  
    cout<<"请输入插入元素的值:";  
    cin>>e;  
    I=L.Locate(e);  
    cout<<endl;  
    L.Insert(I+1,e);  //返回的I为插入数e的前一个数的位置 
    L.ListDisp();  
    cout<<endl;  
}