From 5b33e7ca2926e96fa9cad6cf6966b017adf2bd24 Mon Sep 17 00:00:00 2001 From: pkcs2aq9m Date: Fri, 21 Apr 2023 22:38:00 +0800 Subject: [PATCH] ADD file via upload --- sqlist.h | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 sqlist.h diff --git a/sqlist.h b/sqlist.h new file mode 100644 index 0000000..873a930 --- /dev/null +++ b/sqlist.h @@ -0,0 +1,177 @@ +/////////////////////////////////////// +/// file: sqlist.h +/// Sequential list +/////////////////////////////////////// + +#pragma once + +#include // for std::out_of_range +using std::out_of_range; // 导入名称 +using std::length_error; + +/////////////////////////////////////// +/// 存储结构 + +/// +/// 线性表的顺序存储结构 +/// +template +struct SqList +{ + E elem[MAXSIZE]; + int length; +}; + +/////////////////////////////////////// +/// 基本操作 + +/// +/// 构造空的顺序表 L +/// +template +void InitList(SqList &L) +{ + L.length = 0; // 空表长度为 0 +} + +/// +/// 销毁顺序表 L +/// +template +void DestroyList(SqList &L) +{ + // do nothing +} + +/// +/// 将顺序表 L 置为空表 +/// +template +void ClearList(SqList &L) +{ + L.length = 0; +} + +/// +/// 若 L 为空表,则返回 true,否则返回 false +/// +template +bool ListEmpty(const SqList &L) +{ + return L.length == 0; +} + +/// +/// 返回顺序表 L 中数据元素个数 +/// +template +int ListLength(const SqList &L) +{ + return L.length; +} + +/// +/// 用 e 返回顺序表 L 中第 i 个数据元素,1<=i<=length +/// +template +bool GetElem(const SqList &L, int i, E &e) +{ + // 若 i 值不合法,则返回 false + if (i < 1 || i > L.length) + return false; + + // 取第 i 个元素 + e = L.elem[i - 1]; + + // 返回 true 表示操作成功 + return true; +} + +/// +/// 取顺序表 L 中第 i 个元素 +/// +template +const E &GetElem(const SqList &L, int i) +{ + // 若 i 值不合法,不能取元素 + if (i < 1 || i > L.length) + throw out_of_range("i out of range"); + + // 返回第 i 个元素 + return L.elem[i - 1]; +} + +/// +/// 在顺序表 L 中第 i 个位置之前插入新的数据元素 e +/// +template +void ListInsert(SqList &L, int i, E e) +{ + // 若表满,则不能插入 + if (L.length == MAXSIZE) + throw length_error("L is full"); + // 若 i 值不合法,则不能插入 + if (i < 1 || i > L.length + 1) + throw out_of_range("i out of range"); + + // 插入位置及之后的元素后移 + for (int j = L.length - 1; j >= i - 1; j--) + { + L.elem[j + 1] = L.elem[j]; + } + // 插入元素 + L.elem[i - 1] = e; + // 表长增 1 + L.length++; +} + +/// +/// 在顺序表 L 中删除第 i 个元素,用 e 返回 +/// +template +void ListDelete(SqList &L, int i, E &e) +{ + // 若 i 值不合法,则不能删除 + if (i < 1 || i > L.length) + throw out_of_range("i out of range"); + + // 取出被删除元素 + e = L.elem[i - 1]; + // 被删除元素之后的元素前移 + for (int j = i; j < L.length; j++) + { + L.elem[j - 1] = L.elem[j]; + } + // 表长减 1 + L.length--; +} + +/// +/// 返回顺序表 L 中第一个与 e 满足关系 compare 的数据元素的位序 +/// 若这样的数据元素不存在,则返回 0。 +/// +template +int LocateElem(const SqList &L, const E &e, Cmp compare) +{ + // 逐个取出元素与 e 比较 + for (int i = 0; i < L.length; i++) + { + // 若满足条件,则返回位序 + if (compare(L.elem[i], e)) + return i + 1; + } + + return 0; // 不存在 +} + +/// +/// 遍历顺序表,依次对 L 中的每个数据元素调用函数 visit +/// +template +void ListTraverse(const SqList &L, Func visit) +{ + for (int i = 0; i < L.length; i++) + { + visit(L.elem[i]); + } +} \ No newline at end of file