博客
关于我
数据结构(5)顺序表简单实战
阅读量:724 次
发布时间:2019-03-21

本文共 3419 字,大约阅读时间需要 11 分钟。

重新优化后的解答

1. 删除顺序表中最小的元素

分析:

我们需要编写一个函数来删除顺序表中最小的元素,并返回被删元素的值。同时,如果顺序表为空,必须显示出错信息并退出运行。以下是实现思路:

  • 数据结构选择: 使用数组表示顺序表。
  • 实现步骤:
  • 检查顺序表是否为空,若为空则输出错误信息并退出。
  • 找到顺序表中最小的元素及其位置。
  • 将后面的元素依次向前移动一位。
  • 减少顺序表的长度,并返回被删元素的值。

实现代码:

#include 
using namespace std;#define MaxSize 50template
struct SqNode { ElemType data[MaxSize]; int length;};bool DeleteMinElemNode(SqNode
&L, ElemType &DelData) { if (L.length <= 0) { cout << "顺序表为空" << endl; return false; } DelData = L.data[0]; int pos = 0; for (int i = 1; i < L.length; ++i) { if (L.data[i] < DelData) { DelData = L.data[i]; pos = i; } } // 删除后面的元素,将每个元素向前移动一位 if (pos < L.length) { for (int i = pos; i < L.length - 1; ++i) { L.data[i] = L.data[i+1]; } L.length--; } return true;}int main() { SqNode
L; L.length = 5; L.data[0] = 10; L.data[1] = 5; L.data[2] = 3; L.data[3] = 8; L.data[4] = 20; int DelData; bool result = DeleteMinElemNode(L, DelData); if (!result || L.length != 4) { cout << "删除失败" << endl; } else { cout << "删除的值为:" << DelData << endl; for (int i = 0; i < L.length; ++i) { cout << L.data[i] << " "; } cout << endl; } return 0;}

模式识别:

该函数首先检查顺序表是否为空,如果不是,找到最小值并记录其位置。接着,将位置后面的元素依次向前移动一位,最终删除该元素并减少顺序表的长度。

2. 逆转顺序表(空间复杂度 O(1))

设计思路:

通过内置操作直接交换数组元素的位置,而不使用额外辅助数组。

实现步骤:

  • 使用双指针,一个指向数组起始位置,一个指向末尾位置。
  • 交换这两个指针所指的元素,将其倒置。

实现代码:

template
void ReverseArray(SqNode
&L) { int left = 0; int right = L.length - 1; while (left < right) { swap(L.data[left], L.data[right]); left++; right--; }}

模式识别:

该函数使用双指针直接交换数组中的头尾元素,最终将数组逆转。这种方法保证了空间复杂度为 O(1),仅使用了内部存储。

3. 删除所有等于 x 的元素(时间复杂度 O(n),空间复杂度 O(1))

设计思路:

通过一次遍历记录所有不等于 x 的元素的位置,并重新排列这些元素。

实现步骤:

  • 初始化计数器 k 为 0。
  • 遍历数组,对于每个元素不等于 x 的情况,将其放到新位置 k,k 递增。
  • 最终,将 k 设为数组长度,即所有等于 x 的元素被删除。

实现代码:

template
int DeleteX(SqNode
&L, const ElemType x) { int k = 0; for (int i = 0; i < L.length; ++i) { if (L.data[i] != x) { L.data[k] = L.data[i]; k++; } } L.length = k; return 0;}

模式识别:

该函数通过一次遍历,直接修改数组元素的位置,删除所有等于 x 的元素,保证了时间复杂度为 O(n),空间复杂度为 O(1)。

4. 删除 s 与 t 之间的元素(s < t)

设计思路:

找到第一个 >= s 的位置和最后一个 <= t 的位置,然后将不在这个区间内的元素保留,删除余下的元素。

实现步骤:

  • 检查 s > t 或者顺序表为空,若是则输出错误信息。
  • 找到第一个 >= s 的元素的位置 sk。
  • 找到最后一个 <= t 的元素的位置 st。
  • 计算需要删除的元素数量,进行操作,将不在 [sk, st] 区间内的元素保留,删除其他元素。

实现代码:

template
int DeleteRange(SqNode
&L, const ElemType s, const ElemType t) { if (s >= t || L.length <= 0) { cout << "错误:s >= t 或 顺序表为空" << endl; return -1; } int sk = 0, st = 0; for (int i = 1; i < L.length; ++i) { bool found_sk = false, found_st = false; if (L.data[i-1] < s && L.data[i] >= s) { sk = i; found_sk = true; } if (L.data[i-1] <= t && L.data[i] > t) { st = i-1; found_st = true; } if (found_sk && found_st) { int shift = st - sk; if (shift > 0) { for (int j = st; j >= sk; --j) { L.data[j - shift] = L.data[j]; } L.length = st - shift; } } } return 0;}

模式识别:

该函数通过遍历顺序表找到需要删除的元素范围,并进行整体删除操作,确保了删除后的顺序表正确。

转载地址:http://nkngz.baihongyu.com/

你可能感兴趣的文章
Nginx配置——不记录指定文件类型日志
查看>>
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
Nginx配置参数中文说明
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
NHibernate学习[1]
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>
NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
查看>>