1.题目描述
从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。
2.算法实现
由于是有序列表,那么只需要找到第一个大于s的值与最后一个小于t的值即可。
// 算法实现
bool deleteDuringSToT(SeqList &L, int s, int t) {
// 判空
if(Empty(L)) {
printf("the list is empty");
return false;
}
// 判断s与t是否合理
if(s >= t) {
return false;
}
// 由于是有序列表,那么只需要找到第一个大于s的值与最后一个小于t的值即可
// 定义第一个大于等于s的元素的下标与最后一个小于t的元素的下标
// index_s设为-1方便处理所有元素小于s的情况
// index_t设为L.length - 1是为了处理所有元素都小于t的情况
int index_s = -1, index_t = L.length - 1;
// 第一个就大于s的情况
if(L.data[0] > s) {
index_s = 0;
}
for(int i = 1;i < L.length;i++) {
if(L.data[i - 1] <= s && L.data[i] > s && index_s != 0) {
index_s = i;
}
if(L.data[i - 1] < t && L.data[i] >= t) {
index_t = i - 1;
}
}
// 如果循环结束后index_s的值仍为-1,即代表没有比s大的元素
if (index_s == -1) {
return false;
}
// 删除s与t之间的值
for(;index_t < L.length - 1;index_s++, index_t++) {
L.data[index_s] = L.data[index_t + 1];
}
L.length = index_s;
return true;
}
3.完整代码
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10
typedef struct {
int *data; // 数据
int MaxSize; // 最大容量
int length; // 目前长度
} SeqList;
// 初始化
void InitList(SeqList &L) {
// 为了方便,这里选择初始化时填入1-10
// 申请10个整型的空间
L.data = (int *)malloc(InitSize * sizeof(int));
// 数据填入
for(int i = 0;i < InitSize;i++) {
L.data[i] = i + 1;
}
L.length = 10;
L.MaxSize = InitSize;
}
// 判空操作
bool Empty(SeqList L) {
// 直接根据长度判断即可
if(L.length == 0) {
return true;
}
return false;
}
// 顺序表的输出操作
bool PrintList(SeqList L) {
// 若表为空,则不能输出
if(Empty(L)) {
return false;
}
// 循环遍历输出
for(int i = 0;i < L.length;i++) {
printf("data[%d]=%d\n", i, L.data[i]);
}
return true;
}
// 算法实现
bool deleteDuringSToT(SeqList &L, int s, int t) {
// 判空
if(Empty(L)) {
printf("the list is empty");
return false;
}
// 判断s与t是否合理
if(s >= t) {
return false;
}
// 由于是有序列表,那么只需要找到第一个大于s的值与最后一个小于t的值即可
// 定义第一个大于等于s的元素的下标与最后一个小于t的元素的下标
// index_s设为-1方便处理所有元素小于s的情况
// index_t设为L.length - 1是为了处理所有元素都小于t的情况
int index_s = -1, index_t = L.length - 1;
// 第一个就大于s的情况
if(L.data[0] > s) {
index_s = 0;
}
for(int i = 1;i < L.length;i++) {
if(L.data[i - 1] <= s && L.data[i] > s && index_s != 0) {
index_s = i;
}
if(L.data[i - 1] < t && L.data[i] >= t) {
index_t = i - 1;
}
}
// 如果循环结束后index_s的值仍为-1,即代表没有比s大的元素
if (index_s == -1) {
return false;
}
// 删除s与t之间的值
for(;index_t < L.length - 1;index_s++, index_t++) {
L.data[index_s] = L.data[index_t + 1];
}
L.length = index_s;
return true;
}
int main() {
SeqList L;
InitList(L);
PrintList(L);
printf("------------------------\n");
deleteDuringSToT(L, 1, 10);
PrintList(L);
return 0;
}