1.题目描述
从顺序表中删除其值在给定值s与t之间(包含s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。
2.算法实现
由于此顺序表未说明为有序表,则应该选择找到所有小于s大于t的值,并将其移动到表前面,再修改长度即可。
// 算法实现
// 此题思想与第三题类似
bool deleteDuringSToT(SeqList &L, int s, int t) {
// 判空与判断s与t是否合理
if(Empty(L) && s < t) {
return false;
}
// 由于此顺序表未说明为有序表,则应该选择找到所有小于s大于t的值,并将其移动到表前面
// 再修改长度即可
// 定义变量,记录位于s、t之间的元素个数
int k = 0;
for(int i = 0;i < L.length;i++) {
if(L.data[i] >= s && L.data[i] <= t) {
k++;
} else {
// 如果不是s到k之间的值,则前移k位
// 前移k位主要是因为k的值即是位于s、t之间的元素个数
// 前移k位即能保证移到上一个非位于s、t之间的元素的后一个
L.data[i - k] = L.data[i];
}
}
L.length = L.length - k;
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) {
// 判空与判断s与t是否合理
if(Empty(L) && s < t) {
return false;
}
// 由于此顺序表未说明为有序表,则应该选择找到所有小于s大于t的值,并将其移动到表前面
// 再修改长度即可
// 定义变量,记录位于s、t之间的元素个数
int k = 0;
for(int i = 0;i < L.length;i++) {
if(L.data[i] >= s && L.data[i] <= t) {
k++;
} else {
// 如果不是s到k之间的值,则前移k位
// 前移k位主要是因为k的值即是位于s、t之间的元素个数
// 前移k位即能保证移到上一个非位于s、t之间的元素的后一个
L.data[i - k] = L.data[i];
}
}
L.length = L.length - k;
return true;
}
int main() {
SeqList L;
InitList(L);
PrintList(L);
printf("------------------------\n");
deleteDuringSToT(L, 3, 7);
PrintList(L);
return 0;
}