97 lines
2.5 KiB
C++
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){
|
|
抛出异常 链串异常{"链串推失败"};
|
|
}
|
|
_拼接节点(新的);
|
|
}
|
|
|
|
空类型 _拼接节点(链串* 新的) {
|
|
对象->尾->下一个 = 新的;
|
|
新的->上一个 = 对象->尾;
|
|
对象->尾 = 新的;
|
|
新的->头 = 对象;
|
|
}
|
|
};
|
|
} |