⌚️ 数据结构与算法考研笔记(二)
🎈🎈🎈 王老师加油加油!!!
⛵️ 题
从递增有序顺序表中删除其值在给定 s 与 t(s < t),(包含 s 与 t)之间的所有元素,若 s 或 t 不合理或顺序表为空,则显示出错信息并退出运行。
🤔 想法
创建三个变量
int i,j,k;
i
记录大于等于s
的第一个数的位置,j
记录小于等于t
的第一个数的位置,从顺序表两头往中间扫描,第一个for循环结束i , j
的位置之间为需要删除的所有的值,第二个for循环中for (;j < L.length - 1;i++,j++)
将j
之后的元素前移填充,最后的i
的值为顺序表长。
❤️ 核心代码
//删除有序表中在区间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,j,k; //记录s与t的位置
for (k = i = 0,j = L.length - 1; k < L.length;){
if (L.data[i] < s) i++; //定位i的位置 大于等于s的第一个元素的位置
if (L.data[j] > t) j--; //定位j的位置 小于等于t的第一个元素的位置
k++;
}
for (;j < L.length - 1;i++,j++) //将j之后的元素依次向i的位置移动,i++
L.data[i] = L.data[j + 1];
L.length = i; //i为最终表长
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之间的所有元素
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,j,k; //记录s与t的位置
for (k = i = 0,j = L.length - 1; k < L.length;){
if (L.data[i] < s) i++; //定位i的位置 大于等于s的第一个元素的位置
if (L.data[j] > t) j--; //定位j的位置 小于等于t的第一个元素的位置
k++;
}
for (;j < L.length - 1;i++,j++) //将j之后的元素依次向i的位置移动,i++
L.data[i] = L.data[j + 1];
L.length = i; //i为最终表长
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;
![在这里插入图片描述](https://img-blog.csdnimg.cn/6205a1cf9bcf4dd79d0777a2eaaa832d.png#pic_center)
if (DeleteRangeList(L,s,t))
PrintList(L);
else
cout << "删除失败" << endl;
system("pause");
return 0;
}