⌚️ 数据结构与算法考研笔记(三)
🎈🎈🎈 王老师加油加油!!!
⛵️ 题
从非有序顺序表中删除其值在给定值s与t之间(包含s和t,要求s < t)的所有元素, s或t不合理或顺序表为空,则显示出错信息并退出运行。
🤔 想法
定义一个
m变量
用来记录在[s,t]
闭区间的值的个数,在for循环的过程中,用if判断是否在s与t区间内if (L.data[i] >= s && L.data[i] <= t)
,在区间内,则m++
;否则将当前i
位置的值移动到i-m
处,m不++
。
❤️ 核心代码
//删除顺序表中在区间s与t之间的所有元素,包含s和t
bool DeleteRangeList(SeqList& L, ElemType s, ElemType t);
bool DeleteRangeList(SeqList& L, ElemType s, ElemType t) {
if (s >= t || L.length == 0) {
cout << "s 与 t值不合理或者为空表";
return false; //s与t合理性与判空
}
int i, m = 0; //m记录在s与t之间的个数
for (i = 0; i < L.length; i++){
if (L.data[i] >= s && L.data[i] <= t) //循环记录在s与t之间的个数
m++;
else
L.data[i - m] = L.data[i]; //若不在区间,将当前i所在的值移动到i-m处
}
L.length = L.length - m; //最终元素个数为L.length - m
return true;
}
⌛️ 顺序表测试
#include <iostream>
using namespace std;
#define MaxSize 100
typedef int ElemType;
typedef struct {
ElemType* data;
int length;
int InitSize;
}SeqList;
//初始化顺序表赋值
bool InitList(SeqList& L, int n);
bool InitList(SeqList& L, int n) {
L.data = new ElemType[MaxSize];
if (!L.data) return false;
L.length = 0; //初始化长度为0
L.InitSize = MaxSize; //初始化顺序表大小
int m = 0;
for (int i = 0; i < n; i++){
cin >> m;
L.data[i] = m;
L.length++;
}
return true;
}
//删除顺序表中在区间s与t之间的所有元素,包含s和t
bool DeleteRangeList(SeqList& L, ElemType s, ElemType t);
bool DeleteRangeList(SeqList& L, ElemType s, ElemType t) {
if (s >= t || L.length == 0) {
cout << "s 与 t值不合理或者为空表";
return false; //s与t合理性与判空
}
int i, m = 0; //m记录在s与t之间的个数
for (i = 0; i < L.length; i++){
if (L.data[i] >= s && L.data[i] <= t) //循环记录在s与t之间的个数
m++;
else
L.data[i - m] = L.data[i]; //若不在区间,将当前i所在的值移动到i-m处
}
L.length = L.length - m; //最终元素个数为L.length - m
return true;
}
//打印顺序表
bool PrintList(SeqList L);
bool PrintList(SeqList L) {
if (L.length == 0)return false; //判空
for (int i = 0; i < L.length; i++){ //循环输出顺序表
if (i != L.length - 1)
cout << L.data[i] << ",";
else
cout << L.data[i] << endl;
}
return true;
}
int main(){
SeqList L;
int n = 0;
ElemType s = 0, t = 0;
cin >> n;
InitList(L, n);
cout << "请输入删除的值范围(s < t):";
cin >> s >> t;
if (DeleteRangeList(L,s,t))
PrintList(L);
else
cout << "删除失败" << endl;
system("pause");
return 0;
}