王道 数据结构 p17 第4题
从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行.
#include<iostream>
#define InitSize 100
#define arrLen 7
using namespace std;
typedef struct { //声明一个动态分配内存的顺序表
int *data;
int len,MaxSize;
}SeqList;
void init(SeqList &L){ //初始化顺序表
L.data=new int[InitSize];
L.len=0;
if(L.data!=NULL)
cout<<"success!" <<endl;
else
cout<<"faild"<<endl;
}
void input(SeqList &L){ //给顺序表输入数值
for(int i=0;i<arrLen;i++)
{
cout<<"请输入第"<<i+1<<"个数字:";
cin>>L.data[i];
L.len++;
}
}
void output(SeqList &L) //输出顺序表
{
for(int i=0;i<L.len;i++)
{
cout<<L.data[i]<<" ";
}
cout<<endl;
}
void mySwap(int &x,int &y)//交换两元素
{
int temp=x;
x=y;
y=temp;
}
void selectionSort(SeqList &L)//直接选择排序
{
for(int i=0;i<L.len-1;i++)
{
int leastIndex=i;
for(int j=i+1;j<L.len;j++)
{
if(L.data[j]<L.data[leastIndex])
leastIndex=j;
}
mySwap(L.data[i],L.data[leastIndex]);
}
}
int deleteST(SeqList &L,int s,int t)
{
int i=0,j=0;
if(s>=t||L.len==0)
{
cout<<"error!"<<endl;
return 0;
}
for(;i<L.len&&L.data[i]<s;i++);//寻找值大于等于s的第一个数
if(i>L.len)
return 0;//如果所有元素均小于s 则返回
for(j=i;j<L.len&&L.data[j]<=t;j++);//寻找值大于t的第一个元素
for(;j<L.len;i++,j++)
L.data[i]=L.data[j];// 前移 填补被删元素位置
L.len=i;
return 0;
}
/*没仔细看题 ,题目是有序表。。
用k统计顺序表中不在s-t之间的元素
int deleteX(SeqList &L,int s,int t)
{
int k=0;
if(s>=t||L.len==0)
{
cout<<"error!"<<endl;
return 0;
}
for(int i=0;i<L.len;i++)
{
if(L.data[i]<s||L.data[i]>t)
{
L.data[k]=L.data[i]; //妙妙妙
k++;
}
}
L.len=k;
}
*/
int main(){
SeqList L;
init(L);
input(L);
selectionSort(L);
cout<<endl<<"删除前:" ;
output(L);
int s=0,t=0;
cout<<endl<<"请输入要删除元素的范围:"<<endl;
cin>>s>>t;
deleteST(L,s,t);
cout<<endl<<"删除后:" ;
output(L);
return 0;
}