从有序顺序表中删除其值在给定值s与t之间(要求s<t) 的所有元素。若s或t不合理,或顺序表为空,则显示出错误信息并退出运行
思想:删除s到t之间的元素
void DelST(Sqlist& L, Elemtype s, Elemttype t) {
int j = 0;
if (s < t) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] > s && L.data[i] < t) {
L.data[j] = L.data[i];
L.length--;
}
j++;
}
}
else if (s >= t)
printf("s、t不合理!");
else if (L.length == 0)
printf("顺序表为空!");
}
注意:这题与上一题存在区别,因为是有序表,所以删除的元素必然是相连的整体。(这一点我没有注意到!有序无序的区别也就在于:无序是找到元素之后将其下一个元素依次前移1位,有序的时候是找出首位元素所在位置,将最后一个元素的下一个元素整体前移n位)
书上的答案用了没有循环体的循环,跟我的习惯不一样,所以这里我参考他的代码思想写了符合我自己语法习惯的代码
void DelST(Sqlist& L, Elemtype s, Elemttype t) {
int num = 0, j;
if (s < t) {
for (int i; i < L.length; i++) {
if (L.data[i] > s && L.data[i] < t) { //记录满足条件的元素个数
num++;
j = i;
}
}
for (; j < L.length; j++) {
L.data[j + 1 - num] = L.data[j + 1];
}
}
else if (s >= t)
printf("s、t不合理!");
else if (L.length == 0)
printf("顺序表为空!");
}