1.题目:
Problem Description
从由小到大有序的顺序表中删除其值在[s, t]之间(含s和t)的所有元素,且不改变顺序表的有序性。如果s>=t则显示“data error”;否则输出顺序表的表长和顺序表中的元素,若处理后的顺序表为空,则不输出任何信息。
Input
输入的第一行为一个数字n,表示下面有n组数据,每组数据包括3行;每组数据中的第一行包含两个数字s和t,第二行为顺序表的表长len(0<len<=20),第三行为顺序表的数据元素。
Output
对于每组数据,如果s>=t,则直接输出“data error”,否则输出两行信息:第一行为处理后顺序表的表长,第二行为处理后顺序表中的元素,元素之间用一个空格分隔,如果处理后的顺序表为空,则不输出任何信息。
Sample Input
1
8 18
7
1 3 5 10 17 19 25
Sample Output
5
1 3 5 19 25
2.参考代码:
#include <iostream>
using namespace std;
class LinkList{
private:
int data[100],len;
public:
LinkList(int* a,int n);
void Delete(int l,int r);
void show();
};
LinkList::LinkList(int* a,int n){
for(int i=0;i<n;i++)
data[i]=a[i];
len=n;
}
void LinkList::Delete(int l,int r){ ///核心代码
int k=0;
for(int i=0;i<len;i++)
{
if(data[i]>=l && data[i]<=r)
k++; ///计算在范围之内的个数
else
data[i-k]=data[i]; ///不在范围之内就前移,边计算边移动
}
len-=k;
}
void LinkList::show(){
if(len==0)
return ;
cout<<len<<endl<<data[0];
for(int i=1;i<len;i++)
cout<<" "<<data[i];
cout<<endl;
}
int main()
{
int i,t,m,n,len,a[100];
cin>>t;
while(t--)
{
cin>>m>>n>>len;
for(i=0;i<len;i++)
cin>>a[i];
if(m>=n)
{
cout<<"data error\n";
continue;
}
LinkList w(a,len);
w.Delete(m,n);
w.show();
}
return 0;
}