2.2.3_2.4
从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素, //如果s或t不合理或者顺序表为空,则显示错误信息并退出。
#include<stdio.h>
#define MaxSize 10
typedef struct{
int data[MaxSize];
int length;
}SqList;
bool InitList(SqList &L){
int i=0;
for(i=0;i<MaxSize;i++){
L.data[i] = 0;
}
L.length = 0;
return true;
}
//按位序插入
bool InsertList(SqList &L,int i,int e){
if(i<1||i>L.length+1){
return false;
}
if(L.length>=MaxSize){
return false;
}
int j=0;
for(j=L.length;j>i-1;j--){
L.data[j] = L.data[j-1];
}
L.data[j] = e;
L.length++;
return true;
}
void display(SqList L){
int i=0;
for(i=0;i<L.length;i++){
printf("%d ",L.data[i]);
}
printf("\n");
}
//删除指定位序元素
bool DeleteList(SqList &L,int i){
int temp=0;
if(i<1||i>L.length+1){
return false;
}
if(L.length==0){
return false;
}
int j=0;
for(j=i-1;j<L.length-1;j++){
temp = L.data[j];
L.data[j] = L.data[j+1];
}
L.length--;
return true;
}
/*
//从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,
//如果s或t不合理或者顺序表为空,则显示错误信息并退出。
bool DeleteByRange1(SqList &L,int s,int t){
if(s>=t){//st不符合
return false;
}
if(L.length==0){//顺序表为空
return false;
}
int j=0;
int begin=0,end=0;
// for(i=0;i<L.length;i++){
// if(L.data[i]>s&&L.data[i]<t){
//
// }
// }
j=0;
while(L.data[j]>s){//找到第一个大于s的元素
j++;
}
begin = j;
j=0;
while(L.data[j]<t){//找到最后一个小于s的元素
j++;
}
end = j;
for(j=begin;j<=end;j++){
DeleteList(L,j);
}
return true;
}
*/
//参考2.3题的思想,将应当保留的数据建立为一个新的顺序表
bool DeleteByRange2(SqList &L,int s,int t){
int k=0,i;
for(i=0;i<L.length;i++){
if(L.data[i]<s||L.data[i]>t){//保留下来小于s和大于t的数字
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
}
//标答,思想:先寻找值>=s的第一个元素(第一个删除的元素),
//然后寻找值>=t的第一个元素(最后一个删除的元素的下一个元素)
//要将这段元素删除,只需要将后面的元素前移。
bool Del_s_t2(SqList &L,int s,int t){
int i=0,j=0;
if(s>=t||L.length==0){
return false;
}
for(i=0;i<L.length&&L.data[i]<s;i++);//寻找值>=s的第一个元素,第一个要删除的元素
if(i>=L.length)//若所有值均小于s,返回false
return false;
for(j=i;j<L.length&&L.data[j]<=t;j++);//寻找值<=t的第一个元素,第一个不删除的元素
for(;j<L.length;i++,j++)
L.data[i] = L.data[j]; //前移,填补被删除元素的位置
L.length = i;
return true;
} //此种算法与我类似
int main(){
SqList L1,L2;
InitList(L1);
InitList(L2);
int i=0;
for(i=1;i<10;i++){
InsertList(L1,i,i);
}
display(L1);
// DeleteByRange2(L1,2,5);
// display(L1);
Del_s_t2(L1,2,5);
display(L1);
return 0;
}