算法思想:算法思想:重前往后遍历顺序表,第一个小于s的元素;重后往前遍历顺序表,找到第一个大于t的元素;将所有大于t的元素依次连接到s元素的后面,最后更新顺序表长度。
注意,s和t坐标的初始化非常重要,防止删除的是第一个元素和最后一个元素。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
//动态创建顺序表
typedef struct SqList {
ElemType* data;
int length;
}SqList;
//输入数据,初始化顺序表
void initial(SqList& L) {
int len;
scanf("%d", &len);
//为数据动态分配内存
L.data = (ElemType*)malloc(sizeof(ElemType) * len);
//初始化顺序表长度
L.length = len;
//输入数据
for (int i = 0; i < len; i++) {
scanf("%d", &L.data[i]);
}
}
//输出数据
void printSqList(SqList L) {
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
}
//非递减顺序表删除s到t之间的元素
/*算法思想:重前往后遍历顺序表,第一个小于s的元素;
重后往前遍历顺序表,找到第一个大于t的元素;将所有大于t的元素依次连接到s元素的后面,最后更新顺序表长度。*/
void delectElems(SqList& L, int s, int t) {
int indexS = -1;
int indexT = L.length;
for (int i = 0; i < L.length; i++) {
if (L.data[i] > s) {
break;
}
indexS = i;//顺序表出现的第一个数据为s的索引
}
for (int i = L.length - 1; i >= 0; i--) {
if (L.data[i] < t) {
break;
}
indexT = i;//顺序表中出现的最后一个数据为s的索引
}
int curLength = indexS;
for (int i = indexT + 1; i < L.length; i++) {
L.data[curLength++] = L.data[i];
}
L.length = curLength;
}
int main() {
SqList L;
//初始化顺序表
initial(L);
//顺序表删除多个元素
int s, t;
scanf("%d%d", &s, &t);
delectElems(L, s, t);
//输出顺序表
printSqList(L);
return 0;
}