Files
blackbird/core/include/cn/链串.hpp
T
2026-07-20 11:12:29 +08:00

97 lines
2.5 KiB
C++

#pragma once
#include "中文化.hpp"
#include "异常.hpp"
#include "顺序表.hpp"
命名空间 中文标准 {
模板 <类型名 类型1, 长度单位 节点大小 = 64>
类 链串 {
公开的:
/* 初始化为空链串 */
链串() {
对象->长度 = 0;
对象->下一个 = 空指针;
对象->上一个 = 空指针;
对象->头 = 对象; /* 每一个子节点都记录同一个头结点 */
对象->尾 = 对象; /* 为了方便,只有头结点记录尾节点 */
}
链串 (常量 std::initializer_list<类型1>& init = {})
{
计次循环(适应 & 东西: init) {
插入(东西);
}
}
/*
* 链式析构
*
* 析构时,会递归析构所有节点。
*/
~链串() {
删除[] 对象->下一个;
}
空类型 插入(常量 类型1& 元素) {
链串 *暂时 = 对象->尾;
如果(暂时->长度 等于 节点大小)
_推();
暂时->存储[暂时->长度++] = 元素;
}
长度单位 统计() {
长度单位 总数 = 0;
链串 *暂时 = 对象->头;
判断循环(暂时 != 空指针) {
总数 += 暂时->长度;
暂时 = 暂时->下一个;
}
返回 总数;
}
/*
* 链串重组
*
* 将链串重组为顺序表W
*/
顺序表<类型1> 重组() {
顺序表<类型1> 结果(统计());
链串 *暂时 = 对象->头;
长度单位 计数 = 0;
判断循环(暂时 != 空指针) {
计次循环(适应 索引 = 0; 索引 < 暂时->长度; ++索引) {
结果[计数++] = 暂时->存储[索引];
}
暂时 = 暂时->下一个;
}
返回 结果;
}
类 链串异常: 公开的 标准异常{
公开的:
链串异常(常量 字符* 消息) : 标准异常(消息) {}
};
私有的:
类型1 存储[节点大小];
长度单位 长度; /* 存储中的元素数量 */
链串 *下一个;
链串 *上一个;
链串 *头;
链串 *尾;
空类型 _推() {
链串*新的;
尝试{ 新的 = 新建 链串(); }
捕获异常 (std::exception& exp){
抛出异常 链串异常{"链串推失败"};
}
_拼接节点(新的);
}
空类型 _拼接节点(链串* 新的) {
对象->尾->下一个 = 新的;
新的->上一个 = 对象->尾;
对象->尾 = 新的;
新的->头 = 对象;
}
};
}