7-2 jmu-ds-顺序表区间元素删除 (15 分)
若一个线性表L采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素,要求算法的时间复杂度为O(n),空间复杂度为O(1)。
输入格式:
三行数据,第一行是顺序表的元素个数,第二行是顺序表的元素,第三行是x和y。
输出格式:
删除元素值在[x,y]之间的所有元素后的顺序表。
输入样例:
10
5 1 9 10 67 12 8 33 6 2
3 10
输出样例:
1 67 12 33 2
代码:
//
// Created by DZX on 2021/9/26.
//
//库函数头文件包含
#include <cstdio>
#include <malloc.h>
#include <cstdlib>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
//顺序表的存储结构定义
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct {
ElemType *elem; //存储空间基地址
int length; //表中元素的个数
int listsize; //表容量大小
} SqList; //顺序表类型定义
//顺序表初始化函数
Status InitList_Sq(SqList &L, int listsize) {
//开辟一段空间
L.elem = (ElemType *) malloc(listsize * sizeof(ElemType));
//检测开辟是否成功
if (!L.elem) {
exit(OVERFLOW);
}
//赋值
L.length = 0;
L.listsize = listsize;
return OK;
}
//顺序表输出函数
void ListPrint_Sq(SqList L) {
for (int i = 0; i < L.length; i++) {
if (i == L.length - 1) {
printf("%d", L.elem[i]);
} else {
printf("%d ", L.elem[i]);
}
}
}
Status Delete_sq(SqList &L, int x, int y) {
if (x > y)
return ERROR;
int j = 0;
for (int i = 0; i < L.length; i++) {
if (L.elem[i] < x || L.elem[i] > y) {
L.elem[j] = L.elem[i];
j++;
}
}
L.length = j;
return OK;
}
int main() {
SqList L;
int n;
scanf("%d", &n);
InitList_Sq(L, n);
for (int i = 0; i < L.listsize; i++) {
scanf("%d", &L.elem[i]);
L.length++;
}
int x, y;
scanf("%d %d", &x, &y);
if (Delete_sq(L, x, y))
ListPrint_Sq(L);
return 0;
}