Day13 2023/03/13
难度:简单
题目
32、描述:删除顺序表中最小的元素,由最后一个元素补充。
33、逆转顺序表中的元素
34、删除顺序表中为x的元素:
运行实例
- 删除最小元素
- 逆转顺序表中的元素
- 删除顺序表中为x的元素
思路
- 第一题按照题意,我们只需要遍历顺序表比较每个元素大小,找到最小元素的下标,然后用最后一个元素覆盖即可。
- 第二题,只需要每次交换头尾元素即可,交换到中间位置停止。
- 第三题,利用双指针法删除顺序表中值为x的元素,类似删除数组中某个指定值一样。
关键点
第三题和第一题,都不是真正意义上的删除某个元素,而是通过更新顺序表的长度,来实现的逻辑上的删除!!!(仔细点⭕)
算法实现
c++代码实现- 删除最小元素
#include <iostream>
using namespace std;
// 静态分配的方式定义顺序表结构体
#define MAXSIZE 100 // 最大长度
typedef struct {
int data[MAXSIZE]; // 数据域
int length; // 当前顺序表长度
} SqList;
// 创建顺序表
bool CreateList(SqList &L, int n) {
if (n > MAXSIZE) // 不能超过顺序表的的最大长度
return false;
for (int i = 0; i < n; i++) { // 输入n个元素的值
cin >> L.data[i];
}
L.length = n; // 更新顺序表长度
return true;
}
// 删除顺序表中最小的元素,由最后一个元素补充
bool DeleteMin(SqList &L) {
if (L.length == 0) { // 如果顺序表为空,则返回false
return false;
}
int minIndex = 0; // 记录最小元素的下标
for (int i = 1; i < L.length; i++) { // 遍历顺序表,找到最小元素的下标
if (L.data[i] < L.data[minIndex]) {
minIndex = i;
}
}
L.data[minIndex] = L.data[L.length - 1]; // 用最后一个元素覆盖最小元素
L.length--; // 顺序表长度减1
return true;
}
int main() {
SqList L;
int n;
cout << "请输入顺序表的长度,不要超过最大长度:";
cin >> n;
cout << "请输入" << n << "个元素的值:";
CreateList(L, n); // 创建顺序表
DeleteMin(L);
cout << "删除最小元素后的顺序表为:";
for (int i = 0; i < L.length; i++) {
cout << L.data[i] << " ";
}
cout << endl;
return 0;
}
c++代码实现-逆转顺序表中的元素
// 逆转顺序表中的元素
void Reverse(SqList &L) {
int temp;
for (int i = 0; i < L.length / 2; i++) { // 只需要遍历一半的元素
temp = L.data[i]; // 交换元素
L.data[i] = L.data[L.length - i - 1];
L.data[L.length - i - 1] = temp;
}
}
int main() {
SqList L;
int n;
cout << "请输入顺序表的长度,不要超过最大长度:";
cin >> n;
cout << "请输入" << n << "个元素的值:";
CreateList(L, n);
Reverse(L);
cout << "逆序后的顺序表为:";
for (int i = 0; i < L.length; i++) {
cout << L.data[i] << " ";
}
cout << endl;
return 0;
}
c++代码实现-删除顺序表中为x的元素
// 删除顺序表中值为x的元素
bool DeleteX(SqList &L, int x) {
if (L.length == 0) { // 如果顺序表为空,则返回false
return false;
}
int k = 0; // 记录不等于x的元素个数
for (int i = 0; i < L.length; i++) { // 遍历顺序表
if (L.data[i] != x) { // 如果元素不等于x,则将其前移
L.data[k] = L.data[i];
k++;
}
}
// 更新顺序表长度(可能有些x没有被删除,通过更新长度来实现的假删除)
L.length = k;
return true;
}
int main() {
SqList L;
int n;
cout << "请输入顺序表的长度,不要超过最大长度:";
cin >> n;
cout << "请输入" << n << "个元素的值:";
CreateList(L, n);
cout << "请输入要删除元素的值:";
int x;
cin >> x;
DeleteX(L, x);
cout << "删除值为" << x << "的元素后的顺序表为:";
for (int i = 0; i < L.length; i++) {
cout << L.data[i] << " ";
}
cout << endl;
return 0;
}
- 删除最小元素
- 时间复杂度 --- 遍历整个顺序表,其中n为当前顺序表长度
- 空间复杂度 --- 顺序表为必要空间,其次仅含常数级的辅助空间
- 逆转顺序表中的元素
- 时间复杂度 --- 遍历一半的顺序表,其中n为当前顺序表长度
- 空间复杂度 --- 顺序表为必要空间,其次仅含常数级的辅助空间
- 删除顺序表中为x的元素
- 时间复杂度 --- 遍历整个顺序表,其中n为当前顺序表长度
- 空间复杂度 --- 顺序表为必要空间,其次仅含常数级的辅助空间
总结
- 上面代码实现中,重复部分(定义顺序表和创建顺序表),在第一题的代码中,需要上机运行的同学,看仔细了。(😮)
- 今天的题目是对顺序表的一个回顾,三个问题都是基于顺序表的基本操作来实现的,其次,例如第三题和第二题都是之前做过类似的!!!总之今天的题解是一个很好的知识回顾(💪)