1
在长度为n的顺序表L中,删除所有值为x的数据元素,要求时间复杂程度为O(n),空间复杂程度为(1)
**解法1:**用k记录有序表中不等于x元素的个数,边扫描边统计k,同时把不等于x的数放在k位置上,最后修改L的长度为k`
void f1(SqList *L,ElemType x){
int k = 0;
for(i = 0;i < L->length;i++)
if(L->data[i] != x){
L->data[k] = L->data[i];
k++;
}
L->length = k;
}
**解法2:**用k记录顺序表L中等于x的元素个数,边扫描边统计k,并将不等于x的元素向前移k个位置
void f2(SqList *L,ElemType x){
int k = 0;
for(int i = 0;i<L->length;i++){
if(L->data[i] == x)
k++;
else
L->data[i-k] = L->data[i];
}
L->length = L->length - k;
}
2
在有序顺序表中L中删除s-t之间的元素,要求s-t不合理或者顺序表为空,返回错误
bool f(SqList *L,ElemType s,ElemType t){
int i,j;
if(s >= t||L->length == 0)
return 0;
for(i = 0;i < length&&L->data[i]<s;i++);//寻找大于等于s的第一个元素
if(i >= L->length)//所有的值都小于s,返回
return 0;
for(j = i;j<L->length&&j <= L->length;j++);//寻找大于t的第一个元素
for(;j < L->length;i++,j++)
L->data[i] = L->data[j];//前移,填补元素位置
L->length = i;
return 1;
}
3
在顺序表中L中删除s-t之间的元素,要求s-t不合理或者顺序表为空,返回错误
bool f(SqList *L,ElemType s,ElemType t){
int i,k;
if(L->length == 0&&s >= t)
return 0;
for(i = 0;i < L->length;i++){
if(L->data[i] >= s&&L->data[i] <= t)
k++;
else
L->data[i-k] = L->data[i];
}
L->length = L->length - k;
return 1;
}
也可以模仿第二题的第一种解法