[C++] 数据结构(C):线性表之顺序表
1 顺序表 ADT
+ Status InitList(SeqList &L) 初始化顺序表
+ Status GetElement(SeqList L, int i, ElementType &e) (按位)取值
+ int LocateElement(SeqList L, ElementType e) (按值)查找
+ Status ListInsert(SeqList &L, int i, ElementType e) (按位)插入
+ Status ListDelete(SeqList &L, int i) (按位)删除
+ void printSeqList(SeqList L) 遍历顺序表
2 编程实现
2.1 定义基础数据类型
ElementType (数据元素类型/结构体)
struct ElementType { char data; // char -> ElementType bool operator==(const ElementType b) const{ // 重载结构体 ElementType 的运算符 return this->data == b.data; } bool operator!=(const ElementType b) const{ return this->data != b.data; } };
Status (状态/枚举类型)
enum Status { ERROR, OK, OVERFLOW };
SeqList (顺序表/结构体)
#define MAXSIZE_SEQLIST 100 typedef struct{ ElementType *elements; // 存储空间的基地址 int length; // 当前长度 } SeqList; // 线性表之顺序表
2.2 初始化顺序表
Status InitList(SeqList &L)
Status InitList(SeqList &L){ L.elements = new ElementType[MAXSIZE_SEQLIST]; //为顺序表分配一个大小为MAXSIZE的数组空间 if(!L.elements){ exit(OVERFLOW); // 存储分配失败 -> (异常)退出 } L.length = 0; return OK; }
2.3 (按位)取值
Status GetElement(SeqList L, int i, ElementType &e)
Status GetElement(SeqList L, int i, ElementType &e){ if(i<1 || i>L.length){ // 判断i值是否合理,若不合理:返回 ERROR return ERROR; } e = L.elements[ i-1 ]; // 赋值; elements[i-1] 单元存储的第 i 个数据元素 return OK; }
2.4 (按值)查找
int LocateElement(SeqList L, ElementType e)
int LocateElement(SeqList L, ElementType e){ for(int i=0; i<L.length; i++){ if(L.elements[i] == e){ //(前提:已重载结构体 ElementType 的'=='运算符) return i+1; } } return -1; }
2.5 (按位)插入
Status ListInsert(SeqList &L, int i, ElementType e)
Status ListInsert(SeqList &L, int i, ElementType e){ if(i<1 || i>L.length+1){ // i 值不合法 (易错: 忘记 +1) return ERROR; } if(L.length == MAXSIZE_SEQLIST){ // 当前存储空间已满 return ERROR; } for(int j=L.length; j>=i; j--){ // 插入位置 及之后的元素后移 L.elements[j] = L.elements[j-1]; } L.elements[i-1] = e; //将新元素 e 放入 第 i 个位置 L.length += 1; //表长 + 1 return OK; }
2.6 (按位)删除
Status ListDelete(SeqList &L, int i)
Status ListDelete(SeqList &L, int i){ if(i<1 || i>L.length){ // i 值不合法 return ERROR; } for(int j=i-1; j<=L.length-1; j++){ // 删除位置 及之后的元素前移 L.elements[j] = L.elements[j+1]; } L.length -= 1; return OK; }
2.7 遍历顺序表
void printSeqList(SeqList L)
void printSeqList(SeqList L){ printf("[SeqList.h#printSeqList] L.length: %d\n", L.length); printf("[SeqList.h#printSeqList] L.elements: \t"); for(int i=0; i< L.length; i++){ printf("%c \t", L.elements[i]); } printf("\n"); }
3 测试运行(Main.cpp)
#include <stdio.h> //#include <iostream.h> #include <iostream> using namespace std; #include "base.h" #include "SeqList.h" int main(){ SeqList L; // 顺序表 InitList(L); ElementType e; e.data = 'F'; ListInsert(L, 1, e); printSeqList(L); e.data = 'G'; ListInsert(L, 1, e); printSeqList(L); Status status = GetElement(L, 1, e); printf("status: %d\n", status); status = ListDelete(L, 1); printSeqList(L); printElementType(e); return 0; }
运行结果
[SeqList.h#printSeqList] L.length: 1 [SeqList.h#printSeqList] L.elements: F [SeqList.h#printSeqList] L.length: 2 [SeqList.h#printSeqList] L.elements: G F status: 1 [SeqList.h#printSeqList] L.length: 1 [SeqList.h#printSeqList] L.elements: F [base.h#printElementType] ElementType.data: G
4 参考资料
1 《数据结构(C语言版 第二版)》.严蔚敏.李冬梅.吴伟民
原文地址:https://www.cnblogs.com/johnnyzen/p/11392147.html
- [WCF-Discovery] 客户端如何能够“探测”到可用的服务?
- WCF的安全审核——记录谁在敲打你的门
- Step By Step 一步一步写网站[1] —— 填加数据
- 五个解决方案让MongoDB拥有RDBMS的鲁棒性事务
- Step By Step 一步一步写网站[1] —— 帧间压缩,表单控件
- [WCF-Discovery]如何利用”发现代理”实现可用服务的实时维护?
- 深度学习与机器学习
- Step By Step 一步一步写网站[1] —— 填加数据(二)
- [WCF-Discovery]让服务自动发送上/下线通知[原理篇]
- [WCF-Discovery]让服务自动发送上/下线通知[实例篇]
- [WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]
- [WCF权限控制]利用WCF自定义授权模式提供当前Principal[原理篇]
- [自定义服务器控件] 第一步:文本框。
- 检查两个数据库里的表名、字段是否一致的一种方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python第三十四课——2.匿名函数配合容器函数的使用
- 专家专栏|使用agent2自定义插件采集通过MQTT协议发送的数据
- Linux系统双网卡绑定配置教程
- python第三十五课——生成器
- python第三十六课——1.可迭代对象
- Linux系统Shell编程——脚本编写思路与过程
- python第三十六课——2.迭代器对象
- python第三十七课——模块
- Linux系统MySQL数据库主从同步实战过程
- 最火的java8新特性:Lambda 表达式
- python第三十九课——面向对象(二)之设计类
- python第三十九课——面向对象(二)之初始化属性
- LVS服务DR模式安装布署过程
- python第四十课——构造函数
- python第四十一课——析构函数