顺 序 表:数 据 存 储 的 “ 有 序 阵 地 ”
顺 序 表:数 据 存 储 的 “ 有 序 阵 地 ”
- 线 性 表
- 顺 序 表 - - - 顺 序 存 储 结 构
- 顺 序 表 的 操 作 实 现
- 代 码 全 貌 与 功 能 介 绍
- 顺 序 表 的 功 能 说 明
- 代 码 效 果 展 示
- 代 码 详 解
- SeqList.h
- SeqList.c
- test.c
- 总 结
💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 数据 结 构。
💡个 人 主 页:@笑口常开xpr 的 个 人 主 页
📚系 列 专 栏:硬 核 数 据 结 构 与 算 法
✨代 码 趣 语:数 据 结 构 + 算 法 = 程 序 设 计。
💪代 码 千 行,始 于 坚 持,每 日 敲 码,进 阶 编 程 之 路。
📦gitee 链 接:gitee
在 数 据 结 构 的 世 界 里,每 一 种 设 计 都 可 能 孕 育 出 惊 人 的 效 率 变 革。你 是 否 深 思 过,一 组 精 心 组 织 的 数 据 究 竟 能 创 造 怎 样 的 奇 迹?每 一 次 挖 掘 底 层 原 理,都 是 与 计 算 机 智 慧 的 巅 峰 对 话;每 一 次 剖 析 存 储 模 式,都 在 破 解 数 据 世 界 的 终 极 密 码。准 备 好 迎 接 这 场 盛 宴 了 吗?让 我 们 一 同 探 寻 数 据 结 构 的 顺 序 表 的 无 尽 奥 秘,见 证 它 如 何 重 塑 数 字 时 代 的 运 行 法 则!
线 性 表
定 义
线 性 表 是 由 相 同 数 据 类 型 的 n(n ≥ 0)个 数 据 元 素 的 有 限 序 列。若 将 线 性 表 记 为
相 关 概 念
表 长:其 中 n 为 表 长,当 n = 0 时,称 为 空 表;
表 头:当 n > 0 时,在 这 个 序 列 中,a1 是 第 一 个 元 素,被 称 为 表 头 元 素
表 尾:an 是 最 后 一 个 元 素,被 称 为 表 尾 元 素。
直 接 前 驱:a(i-1) 领 先 于 ai,称 a(i-1) 是 ai 的 直 接 前 驱 元 素。
直 接 后 继:ai 领 先 于 a(i+1),a(i+1) 是 ai 的 直 接 后 继 元 素。
当 i 为 1,2,…,n-1 时,ai 有 且 仅 有 一 个 直 接 后 继 元 素。
当 i 为 2,3,…,n 时,ai 有 且 仅 有 一 个 直 接 前 驱 元 素。
顺 序 表 - - - 顺 序 存 储 结 构
定 义
顺 序 表 把 线 性 表 中 的 元 素 按 照 逻 辑 顺 序 依 次 存 储 在 一 组 地 址 连 续 的 存 储 单 元 中,通 过 数 组 来 实 现。这 种 存 储 方 式 让 元 素 的 逻 辑 顺 序 和 物 理 顺 序 保 持 一 致,利 用 元 素 的 下 标 可 以 快 速 访 问 到 任 何 一 个 元 素。
顺 序 表 示 和 实 现
假 设 顺 序 表 的 每 个 元 素 占 用 l 个 存 储 单 元,并 以 所 占 的 第 一 个 单 元 的 存 储 地 址 作 为 数 据 元 素 的 存 储 位 置。
线 性 表 中 第 i + 1 个 数 据 元 素 的 存 储 位 置 LOC(ai+1) 和 第 i 个 数 据 元 素 的 存 储 位 置 LOC(ai) 之 间 满 足 下 列 关 系:
线 性 表 的 第 i 个 数 据 元 素 ai 的 存 储 位 置 为:
式 中 LOC(a1) 是 线 性 表 中 第 一 个 数 据 元 素 a1 的 存 储 位 置,通 常 称 作 线 性 表 的 起 始 地 址 或 基 地 址。
每 一 个 数 据 元 素 的 存 储 位 置 都 和 顺 序 表 的 起 始 位 置 相 差 一 个 和 数 据 元 素 在 线 性 表 中 的 第 n 个 元 素 成 正 比 的 常 数。由 此,只 要 确 定 了 存 储 线 性 表 的 起 始 位 置,线 性 表 中 任 一 数 据 元 素 都 可 随 机 存 取,所 以 线 性 表 的 顺 序 存 储 结 构 是 一 种 随 机 存 取 的 存 储 结 构。
顺 序 表 的 操 作 实 现
顺 序 表 有 静 态 顺 序 表 和 动 态 顺 序 表 两 种,这 里 以 动 态 顺 序 表 为 例 进 行 介 绍。
代 码 全 貌 与 功 能 介 绍
整 个 顺 序表 由 三 个 主 要 文 件 构 成:SeqList.h、SeqList.c 和 test.c。这 种 多 文 件 的 架 构 设 计,有 助 于 将 不 同 功 能 模 块 分 离,提 高 代 码 的 可 读 性、可 维 护 性 与 可 扩 展 性。
SeqList.h
SeqList.h 包 含 了 顺 序 表 所 需 的 头 文 件 引 用、常 量 定 义 以 及 函 数 声 明。
test.c
test.c 是 顺 序 表 的 主 逻 辑 文 件,负 责 处 理 用 户 输 入 和 代 码 流 程 的 控 制。
SeqList.c
SeqList.c 则 实 现 了 顺 序 表 的 具 体 功 能 函 数。
下 面 展 示
完 整 代 码
。
读 者 可 以 将 这 段 代 码 复 制 到 自 己 的 编 译 器 中 运 行。
SeqList.h
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define INIT_CAPACITY 4 //初始化的容量
typedef int SLDataType;
//动态顺序表 --- 按需申请
typedef struct SeqList
{SLDataType* a;int size; //有效数据个数int capacity; //空间容量
}SL;//增删查改//初始化
void SLInit(SL* ps);//释放空间
void SLDestory(SL* ps);//输出
void SLPrint(SL* ps);//扩容
void SLCheckCapacity(SL* ps);//尾插
void SLPushBack(SL* ps, SLDataType x);//尾删
void SLPopBack(SL* ps);//头插
void SLPushFront(SL* ps, SLDataType x);//头删
void SLPopFront(SL* ps);//某个数的后面插入
void SLBackInsert(SL* ps, int pos, SLDataType x);//某个数的前面插入
void SLFrontInsert(SL* ps, int pos, SLDataType x);//某个位置删除
void SLErase(SL* ps, int pos);//查找
int SLFind(SL* ps, SLDataType x);//函数指针数组
void SeqListValue(int(*pf)(SL* ps, SLDataType x), SL* ps);void SeqListInsert(int(*pf)(SL* ps, SLDataType x), SL* ps, int num);//保存数据到文件中
void SaveSeqList(SL* ps);//加载数据到文件中
void LoadSeqList(SL* ps);
test.c
#define _CRT_SECURE_NO_WARNINGS 0 #include "SeqList.h"
void menu()
{printf("*************************************************\n");printf("***** 1. SLPushBack 2. SLPopBack *****\n");printf("***** 3. SLPushFront 4. SLPopFront *****\n");printf("***** 5. SLBackInsert 6. SLFrontInsert *****\n");printf("***** 7. SLErase 8. SLFind *****\n");printf("***** 9. SLPrint 0. exit *****\n");printf("*************************************************\n");
}
void test()
{SL s;SLInit(&s);int input = 0;do{menu();printf("请输入你想要的操作:>\n");scanf("%d", &input);switch (input){case 0:SaveSeqList(&s);SLDestory(&s);break;case 1:SeqListValue(SLPushBack, &s);break;case 2:SLPopBack(&s);SLPrint(&s);break;case 3:SeqListValue(SLPushFront, &s);break;case 4:SLPopFront(&s);SLPrint(&s);break;case 5:SeqListInsert(SLBackInsert, &s, 5);break;case 6:SeqListInsert(SLFrontInsert, &s, 6);break;case 7:SeqListInsert(SLErase, &s, 7);break;case 8:SeqListInsert(SLFind, &s, 8);break;case 9:SLPrint(&s);break;default:printf("输入错误,请重新输入\n");break;}} while (input);
}
int main()
{test();return 0;
}
SeqList.c
#define _CRT_SECURE_NO_WARNINGS 0
#include "SeqList.h"
void SLInit(SL* ps)
{assert(ps);ps->a = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);if (ps->a == NULL){perror("malloc fail");return;}ps->size = 0;ps->capacity = INIT_CAPACITY;LoadSeqList(ps);
}void SLDestory(SL* ps)
{assert(ps);//空间是野指针//数组指向的空间越界free(ps->a);ps->a = NULL;ps->capacity = 0;ps->size = 0;printf("销毁成功\n");
}void SLPrint(SL* ps)
{assert(ps);int i = 0;for (i = 0;i < ps->size;i++){printf("%d ", ps->a[i]);}printf("\n");
}void SLCheckCapacity(SL* ps)
{//扩容SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;//不写这句代码的话是原地扩容,在原来的地址上增加ps->capacity *= 2;
}void SLPushBack(SL* ps, SLDataType x)
{printf("尾插\n");//方法1//assert(ps);//if (ps->size == ps->capacity)//{// SLCheckCapacity(ps);//}//ps->a[ps->size++] = x;ps->a[ps->size] = x;ps->size++;//方法2SLBackInsert(ps, ps->size, x);
}//不释放空间,要释放空间只能一块一块释放
void SLPopBack(SL* ps)
{assert(ps);printf("尾删\n");//方法1//assert(ps->size > 0);//方法2if (ps->size == 0){return;}//ps->a[ps->size - 1] = 0;ps->size--;//方法2//SLErase(ps, ps->size);
}
void SLPushFront(SL* ps, SLDataType x)
{printf("头插\n");//方法1//assert(ps);//if (ps->size == ps->capacity)//{// SLCheckCapacity(ps);//}//int end = ps->size - 1;//while (end >= 0)//{// ps->a[end + 1] = ps->a[end];// end--;//}//ps->a[0] = x;//ps->size++;//方法2SLBackInsert(ps, 0, x);
}void SLPopFront(SL* ps)
{printf("头删\n");//方法1//assert(ps);//assert(ps->size > 0);//int begin = 1;//while (begin < ps->size)//{// ps->a[begin - 1] = ps->a[begin];// begin++;//}//ps->size--;//方法2SLErase(ps, 0);
}void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);int erase = pos - 1;while (erase <= ps->size - 1){ps->a[erase] = ps->a[erase + 1];erase++;}ps->size--;printf("消除成功\n");
}
int SLFind(SL* ps, SLDataType x)
{assert(ps);printf("查找\n");int i = 0;int flag = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1;
}void SeqListValue(int(*pf)(SL* ps, SLDataType x), SL* ps)
{int x = 0;printf("请输入1个操作数:>\n");scanf("%d", &x);pf(ps, x);SLPrint(ps);
}void SLFrontInsert(SL* ps, int pos, SLDataType x)
{assert(ps);if (ps->capacity == ps->size){SLCheckCapacity(ps);}int tmp = ps->size - 1;while (tmp >= pos - 1){ps->a[tmp + 1] = ps->a[tmp];tmp--;}ps->a[pos - 1] = x;ps->size++;
}
void SLBackInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);if (ps->capacity == ps->size){SLCheckCapacity(ps);}int tmp = ps->size - 1;while (tmp >= pos){ps->a[tmp + 1] = ps->a[tmp];tmp--;}ps->a[pos] = x;ps->size++;
}
void SeqListInsert(int(*pf)(SL* ps, SLDataType x), SL* ps, int num)
{int x = 0;int y = 0;if (num == 5){printf("请输入你要插入数的位置:>\n");scanf("%d", &x);printf("请输入你要插入的数字:>\n");scanf("%d", &y);SLBackInsert(ps, x, y);SLPrint(ps);}else if (num == 6){printf("请输入你要插入的数字:>\n");scanf("%d", &x);printf("请输入你要插入的数字的位置:>\n");scanf("%d", &y);SLFrontInsert(ps, y, x);SLPrint(ps);}else if (num == 7){printf("请输入你要擦除数的位置:>\n");scanf("%d", &x);pf(ps, x);SLPrint(ps);}else{printf("请输入你要查找的数字:>\n");scanf("%d", &x);int ret = pf(ps, x);if (ret != -1){printf("下标是:%d\n", ret);}else{printf("查找的数字不存在\n");}}
}void SaveSeqList(SL* ps)
{FILE* pf = fopen("SeqList.txt", "wb");if (pf == NULL){perror("SaveSeqList");return;}else{int i = 0;for (i = 0; i < ps->size; i++){fwrite(ps->a + i, sizeof(SLDataType), 1, pf);}fclose(pf);pf = NULL;printf("保存文件成功\n");}
}
void LoadSeqList(SL* ps)
{//打开文件FILE* pf = fopen("SeqList.txt", "rb");if (NULL == pf){perror("LoadSeqList");return;}else{//读数据SLDataType tmp = 0;int i = 0;while (fread(&tmp, sizeof(SLDataType), 1, pf)){if (ps->size == ps->capacity){SLCheckCapacity(ps);}ps->a[i] = tmp;ps->size++;i++;}fclose(pf);pf = NULL;}
}
顺 序 表 的 功 能 说 明
数 据 结 构 定 义:顺 序 表 是 用 物 理 地 址 连 续 的 存 储 单 元 依 次 存 储 数 据 元 素 的 线 性 结 构,逻 辑 顺 序 与 物 理 顺 序 一 致,基 于 数 组 实 现。使 用 动 态 数 组 存 储,通 过 malloc/realloc 动 态 管 理 内 存,支 持 扩 容,灵 活 性 高。
初 始 化:SLInit 函 数 为 动 态 数 组 分 配 初 始 内 存 ,大 小 是 4 * 4 = 16 个 字 节。初 始 化 大 小 是 0,容 量 为 4。
销 毁: SLDestory 函 数 释 放 动 态 数 组 内 存,避 免 内 存 泄 漏。重 置 大 小 和 容 量 都 是 0,标 记 顺 序 表 为 空。
扩 容:插 入 元 素 前 若 空 间 不 足(大 小 和 容 量 相 等 时),先 扩 容 再 操 作。SLCheckCapacity 函 数 自 动 扩 展 容 量(容 量 翻 倍),使 用 realloc 重 新 分 配 内 存,迁 移 数 据。这 里 因 为 容 量 翻 倍 会 进 行 异 地 扩 容。
数 据 插 入
操作类型 | 函数 | 时间复杂度 | 功能说明 |
---|---|---|---|
头插 | SLPushFront | O(N) | 移动全部元素 |
尾插 | SLPushBack | O(1) | 直接插入 |
一个数的前面插入 | SLFrontInsert | O(N) | 将 pos 及之后的元素后移一位 |
一个数的后面插入 | SLBackInsert | O(N) | 将 pos-1 及之后的元素后移一位 |
数 据 删 除
操作类型 | 函数 | 时间复杂度 | 功能说明 |
---|---|---|---|
头删 | SLPopFront | O(N) | 移动全部元素 |
尾删 | SLPopBack | O(1) | 直接调整 size,无需移动 |
指定位置删除 | SLErase | O(N) | 将pos+1及之后的元素前移一位 |
数 据 查 找:SLFind 函 数 顺 序 遍 历 数 组,查 找 元 素 x 的 首 次 出 现 位 置,返 回 下 标( 未 找 到 返 回 -1)。时 间 复 杂度:O(N)(平 均 情 况)。
数 据 持 久 化:SaveSeqList 函 数 用 于 将 顺 序 表 中 的 信 息 以 二 进 制 形 式 保 存 到 文 件 中,LoadSeqList 函 数 用 于 从 文 件 中 加 载 顺 序 表,实 现 数 据 的 持 久 化 存 储。
错 误 处 理:在 内 存 分 配 和 文 件 操 作 中 使 用 了 perror 等 方 式 进 行 错 误 处 理,当 操 作 失 败 时 输 出 相 应 的 错 误 信 息。
代 码 效 果 展 示
菜 单 展 示
每 次 循 环 开 始 时 会 显 示 菜 单,内 容 包 括:
SLPushBack:尾 插
SLPopBack:尾 删
SLPushFront:头 插
SLPopFront:头 删
SLBackInsert:从 一 个 数 的 后 面 插 入
SLFrontInsert:从 一 个 数 的 前 面 插 入
SLErase:擦 除 某 个 指 定 的 数
SLFind:查 找 某 个 数
SLPrint:输 出 顺 序 表
exit:退 出 程 序 并 将 顺 序 表 保 存 到 文 件 中
尾 插(SLPushBack)
输 入 1 后,程 序 会 提 示 用 户 输 入 插 入 的 数 字。输 入 完 成 后,数 字 被 添 加 到 顺 序 表 的 末 尾。如 果 顺 序 表 已 满,会 自 动 增 加 容 量。
尾 删(SLPopBack)
输 入 2 后,顺 序 表 的 末 尾 的 一 个 数 字 会 被 删 除 并 输 出 删 除 后 的 顺 序 表。
头 插(SLPushFront)
输 入 3 后,程 序 会 提 示 用 户 输 入 插 入 的 数 字。输 入 完 成 后,如 果 顺 序 表 已 满,会 自 动 增 加 容 量,然 后 数 字 被 添 加 到 顺 序 表 的 第 一 个 位 置。
头 删(SLPopFront)
输 入 4 后,顺 序 表 的 第 一 个 位 置 的 数 字 会 被 删 除 并 输 出 删 除 后 的 顺 序 表。
从 某 一 个 数 字 的 后 面 插 入(SLBackInsert)
输 入 5 后,程 序 会 提 示 用 户 输 入 插 入 的 数 字 和 要 插 入 数 字 的 位 置。输 入 完 成 后,数 字 被 添 加 到 顺 序 表 的 要 输 入 数 字 的 后 面。如 果 顺 序 表 已 满,会 自 动 增 加 容 量。
从 某 一 个 数 字 的 前 面 插 入(SLFrontInsert)
输 入 6 后,程 序 会 提 示 用 户 输 入 插 入 的 数 字 和 要 插 入 数 字 的 位 置。输 入 完 成 后,数 字 被 添 加 到 顺 序 表 的 要 输 入 数 字 的 前 面。如 果 顺 序 表 已 满,会 自 动 增 加 容 量。
清 除 指 定 数 的 位 置(SLErase)
输 入 7 后,程 序 会 提 示 用 户 输 入 清 除 数 字 的 位 置。输 入 完 成 后,输 入 位 置 上 的 数 字 会 被 清 除。
查 找 数 字(SLFind)
输 入 8 后,程 序 会 提 示 用 户 要 查 找 的 数 字。输 入 完 成 后,程 序 会 查 找 数 字,如 果 找 到 会 输 出 数 字 的 下 标,如 果 没 有 找 到,则 输 出 “查 找 的 数 字 不 存 在”。
输 出 顺 序 表(SLPrint)
输 入 9 后,程 序 会 在 屏 幕 上 显 示 目 前 的 顺 序 表。
退 出 顺 序 表(exit)
输 入 0 后,程 序 会 将 顺 序 表 中 的 信 息 以 二 进 制 形 式 保 存 到 文 件 “SeqList.txt” 中。释 放 内 存 并 销 毁 顺 序 表, 然 后 退 出 程 序。
代 码 详 解
SeqList.h
#pragma once
#pragma once 是 一 个 预 处 理 指 令,用 于 防 止 头 文 件 被 重 复 包 含。在 大 型 项 目 中,多 个 源 文 件 可 能 会 包 含 同 一 个 头 文 件,使 用 #pragma once 可 以 确 保 头 文 件 的 内 容 只 被 编 译 一 次,避 免 重 复 定 义 的 错 误。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include 指 令 用 于 引 入 必 要 的 标 准 库 头 文 件:
stdio.h:提 供 标 准 输 入 输 出 函 数,如 printf、scanf 等。
assert.h:提 供 assert 宏,用 于 在 运 行 时 检 查 程 序 的 断 言 条 件。
stdlib.h:提 供 内 存 管 理 函 数(如 malloc、realloc、free)和 其 他 标 准 库 函 数。
#define INIT_CAPACITY 4 //初始化的容量
typedef int SLDataType;
#define 指 令 用 于 定 义 一 些 常 量:
INIT_CAPACITY:定 义 顺 序 表 的 初 始 容 量 为 4。
typedef int SLDataType:将 int 重 新 定 义 成 SLDataType
typedef struct SeqList
{SLDataType* a;int size; //有效数据个数int capacity; //空间容量
}SL;
定 义 了 一 个 名 为 SeqList 的 结 构 体 并 重 新 命 名 为 SL,用 于 表 示 整 个 顺 序 表:
a:指 向 结 构 体 的 指 针,用 于 动 态 分 配 内 存 来 存 储 顺 序 表 信 息。
size:整 数,记 录 当 前 顺 序 表 中 已 存 储 的 数 字 个 数。
capacity:整 数,记 录 当 前 顺 序 表 的 最 大 容 量。
//增删查改//初始化
void SLInit(SL* ps);//释放空间
void SLDestory(SL* ps);//输出
void SLPrint(SL* ps);//扩容
void SLCheckCapacity(SL* ps);//尾插
void SLPushBack(SL* ps, SLDataType x);//尾删
void SLPopBack(SL* ps);//头插
void SLPushFront(SL* ps, SLDataType x);//头删
void SLPopFront(SL* ps);//某个数的后面插入
void SLBackInsert(SL* ps, int pos, SLDataType x);//某个数的前面插入
void SLFrontInsert(SL* ps, int pos, SLDataType x);//某个位置删除
void SLErase(SL* ps, int pos);//查找
int SLFind(SL* ps, SLDataType x);//函数指针
void SeqListValue(int(*pf)(SL* ps, SLDataType x), SL* ps);void SeqListInsert(int(*pf)(SL* ps, SLDataType x), SL* ps, int num);//保存数据到文件中
void SaveSeqList(SL* ps);//加载数据到文件中
void LoadSeqList(SL* ps);
函 数 声 明,定 义 了 对 顺 序 表 进 行 操 作 的 各 个 功 能 函 数:
SLInit:用 于 初 始 化 顺 序 表,分 配 内 存 并 设 置 初 始 状 态。
SLDestory:用 于 销 毁 顺 序 表,释 放 分 配 的 内 存。
SLPrint:用 于 显 示 顺 序 表 中 所 有 的 数 字。
SLCheckCapacity:检 查 通 讯 录 的 容 量,必 要 时 进 行 扩 容。
SLPushBack:用 于 对 顺 序 表 末 尾 添 加 数 字。
SLPopBack:用 于 对 顺 序 表 末 尾 删 除 数 字。
SLPushFront:用 于 对 顺 序 表 第 一 个 位 置 添 加 数 字。
SLPopFront:用 于 对 顺 序 表 第 一 个 位 置 删 除 数 字。
SLBackInsert:用 于 对 顺 序 表 的 指 定 位 置 的 后 面 插 入 数 字。
SLFrontInsert:用 于 对 顺 序 表 的 指 定 位 置 的 前 面 插 入 数 字。
SLErase:用 于 从 顺 序 表 中 删 除 指 定 的 数 字。
SLFind:根 据 输 入 的 数 字 查 找 顺 序 表 中 的 数 字,返 回 数 字 在 顺 序 表 中 的 下 标,找 不 到 返 回 特 定 值。
SeqListValue:函 数 指 针,传 递 函 数 地 址,用 于 程 序 中 相 同 的 部 分,节 省 代 码 量。
SeqListInsert:函 数 指 针,传 递 函 数 地 址,用 于 程 序 中 相 同 的 部 分,节 省 代 码 量。
SaveSeqList:将 顺 序 表 中 的 信 息 保 存 到 文 件 中。
LoadSeqList:从 文 件 中 加 载 信 息 到 顺 序 表 中。
SeqList.c
内 存 管 理 机 制
void SLInit(SL* ps)
{assert(ps);ps->a = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);if (ps->a == NULL){perror("malloc fail");return;}ps->size = 0;ps->capacity = INIT_CAPACITY;LoadSeqList(ps);
}
//扩容
void SLCheckCapacity(SL* ps)
{//扩容SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;//不写这句代码的话是原地扩容,在原来的地址上增加ps->capacity *= 2;
}
初 始 化:使 用 calloc 分 配 初 始 空 间 并 将 所 有 数 据 初 始 化。
动 态 扩 容:每 次 容 量 不 足 时 增 加 原 来 空 间 数 的 2 倍。
内 存 安 全:通 过 realloc 确 保 数 据 连 续 性,失 败 时 输 出 错 误 信 息。
顺 序 表 核 心 操 作
尾 删
void SLPopBack(SL* ps)
{assert(ps);printf("尾删\n");//方法1//assert(ps->size > 0);//方法2if (ps->size == 0){return;}//ps->a[ps->size - 1] = 0;ps->size--;//方法2//SLErase(ps, ps->size);
}
总 共 有 两 种 方 法 这 里 以 方 法 1 为 例,方 法 2 中 尾 删 是 任 意 位 置 删 除 的 特 例(pos = size)。使 用 方 法 1 时 间 复 杂 度 为 O(1),而 使 用 方 法 2 删 除 最 后 一 个 元 素 时,SLErase 仍 需 执 行 while 循 环(尽 管 循 环 体 不 执 行),效 率 略 低 于 方法 1。
删 除 处 理:直 接 减 小 有 效 长 度 即 可,将 数 字 置 为 0 没 有 意 义。
尾 插
void SLPushBack(SL* ps, SLDataType x)
{printf("尾插\n");//方法1assert(ps);if (ps->size == ps->capacity){SLCheckCapacity(ps);}ps->a[ps->size++] = x;//ps->a[ps->size] = x;//ps->size++;//方法2//SLBackInsert(ps, ps->size, x);
}
总 共 有 两 种 方 法 这 里 以 方 法 1 为 例,方 法 2 中 尾 插 是 任 意 位 置 插 入 的 特 例(pos = size)。方 法 1 和 方 法 2 的 差 别 和 尾 删 类 似,这 里 不 再 描 述。
自 动 扩 容:添 加 前 检 查 容 量,不 足 时 自 动 扩 展。
输 入 处 理:直 接 插 入 数 字 即 可。
头 删
void SLPopFront(SL* ps)
{printf("头删\n");//方法1assert(ps);assert(ps->size > 0);int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;//方法2//SLErase(ps, 0);
}
插 入 处 理:将 所 有 位 置 的 数 字 前 移 一 位,大 小 减 1 即 可。
头 插
void SLPushFront(SL* ps, SLDataType x)
{printf("头插\n");//方法1assert(ps);if (ps->size == ps->capacity){SLCheckCapacity(ps);}int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;//方法2//SLBackInsert(ps, 0, x);
}
总 共 有 两 种 方 法 这 里 以 方 法 1 为 例,方 法 2 中 头 插 是 任 意 位 置 插 入 的 特 例。
自 动 扩 容:添 加 前 检 查 容 量,不 足 时 自 动 扩 展。
输 入 处 理:将 所 有 位 置 的 数 字 后 移 一 位,直 接 插 入 数 字 即 可。
指 定 数 字 的 后(前) 面 插 入
void SLBackInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);if (ps->capacity == ps->size){SLCheckCapacity(ps);}int tmp = ps->size - 1;while (tmp >= pos){ps->a[tmp + 1] = ps->a[tmp];tmp--;}ps->a[pos] = x;ps->size++;
}
void SLFrontInsert(SL* ps, int pos, SLDataType x)
{assert(ps);if (ps->capacity == ps->size){SLCheckCapacity(ps);}int tmp = ps->size - 1;while (tmp >= pos - 1){ps->a[tmp + 1] = ps->a[tmp];tmp--;}ps->a[pos - 1] = x;ps->size++;
}
自 动 扩 容:添 加 前 检 查 容 量,不 足 时 自 动 扩 展。
输 入 处 理:将 指 定 位 置(前 面 插 入 包 括 指 定 位 置,后 面 插 入 不 包 括 指 定 位 置) 的 数 字 后 移 一 位,直 接 插 入 数 字 即 可。
删 除 指 定 位 置 的 数字
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);int erase = pos - 1;while (erase <= ps->size - 1){ps->a[erase] = ps->a[erase + 1];erase++;}ps->size--;printf("消除成功\n");
}
数 据 迁 移:删 除 后 将 后 续 元 素 前 移 覆 盖。
查 找 数 字
int SLFind(SL* ps, SLDataType x)
{assert(ps);printf("查找\n");int i = 0;int flag = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1;
}
函 数 功 能:在 顺 序 表 中 查 找 指 定 的 数 字,返 回 其 索 引(未 找 到 返 回 - 1)。
数 据 持 久 化
void SaveSeqList(SL* ps)
{FILE* pf = fopen("SeqList.txt", "wb");if (pf == NULL){perror("SaveSeqList");return;}else{int i = 0;for (i = 0; i < ps->size; i++){fwrite(ps->a + i, sizeof(SLDataType), 1, pf);}fclose(pf);pf = NULL;printf("保存文件成功\n");}
}
void LoadSeqList(SL* ps)
{//打开文件FILE* pf = fopen("SeqList.txt", "rb");if (NULL == pf){perror("LoadSeqList");return;}else{//读数据SLDataType tmp = 0;int i = 0;while (fread(&tmp, sizeof(SLDataType), 1, pf)){if (ps->size == ps->capacity){SLCheckCapacity(ps);}ps->a[i] = tmp;ps->size++;i++;}fclose(pf);pf = NULL;}
}
二 进 制 存 储:使 用 fwrite 和 fread 进 行 整 块 数 据 读 写。
自 动 加 载:初 始 化 时 自 动 从 文 件 恢 复 数 据。
容 量 管 理:加 载 时 动 态 扩 展 内 存 确 保 足 够 空 间。
test.c
菜 单 界 面
void menu()
{printf("*************************************************\n");printf("***** 1. SLPushBack 2. SLPopBack *****\n");printf("***** 3. SLPushFront 4. SLPopFront *****\n");printf("***** 5. SLBackInsert 6. SLFrontInsert *****\n");printf("***** 7. SLErase 8. SLFind *****\n");printf("***** 9. SLPrint 0. exit *****\n");printf("*************************************************\n");
}
使 用 星 号 (*) 绘 制 边 框,提 供 清 晰 的 视 觉 界 面。
数 字 编 号 对 应 不 同 功 能,方 便 用 户 选 择。
主 循 环 逻 辑
void test()
{SL s;SLInit(&s);int input = 0;do{menu();printf("请输入你想要的操作:>\n");scanf("%d", &input);switch (input){case 0:SaveSeqList(&s);SLDestory(&s);break;case 1:SeqListValue(SLPushBack, &s);break;case 2:SLPopBack(&s);SLPrint(&s);break;case 3:SeqListValue(SLPushFront, &s);break;case 4:SLPopFront(&s);SLPrint(&s);break;case 5:SeqListInsert(SLBackInsert, &s, 5);break;case 6:SeqListInsert(SLFrontInsert, &s, 6);break;case 7:SeqListInsert(SLErase, &s, 7);break;case 8:SeqListInsert(SLFind, &s, 8);break;case 9:SLPrint(&s);break;default:printf("输入错误,请重新输入\n");break;}} while (input);
}
初 始 化:调 用 SLInit 分 配 内 存 并 加 载 文 件 数 据。
循 环 控 制:使 用 do-while 确 保 至 少 执 行 一 次 菜 单 选 择。
选 项 处 理:通 过 switch 分 支 调 用 不 同 功 能 函 数。
安 全 退 出:退 出 前 保 存 数 据 并 释 放 内 存,防 止 资 源 泄 漏。
程 序 入 口
int main()
{test();return 0;
}
main 函 数 是 程 序 的 入 口 点,调 用 test 函 数 启 动 顺 序 表,最 后 返 回 0 表 示 程 序 正 常 结 束。
总 结
至 此,关 于 数 据 结 构 顺 序 表 探 索 暂 告 一 段 落,但 你 的 编 程 征 程 才 刚 刚 启 航。编 写 代 码 是 与 计 算 机 逻 辑 深 度 对 话,过 程 中 虽 会 在 结 构 设 计、算 法 实 现 的 困 境 里 挣 扎,但 这 些 磨 砺 加 深 了 对 代 码 逻 辑 和 数 据 组 织 的 理 解。愿 你 合 上 电 脑 后,灵 感 不 断,在 数 据 结 构 的 世 界 里 持 续 深 耕,书 写 属 于 自 己 的 编 程 传 奇,下 一 次 开 启,定 有 全 新 的 精 彩 等 待。小 编 期 待 重 逢,盼 下 次 阅 读 时 见 证 你 们 更 大 的 进 步,共 赴 代 码 之 约!
相关文章:
顺 序 表:数 据 存 储 的 “ 有 序 阵 地 ”
顺 序 表:数 据 存 储 的 “ 有 序 阵 地 ” 线 性 表顺 序 表 - - - 顺 序 存 储 结 构顺 序 表 的 操 作 实 现代 码 全 貌 与 功 能 介 绍顺 序 表 的 功 能 说 明代 码 效 果 展 示代 码 详 解SeqList.hSeqList.ctest.c 总 结 💻作 者 简 介…...
#Redis黑马点评#(七)实战篇完结
目录 一 达人探店 1 发布探店笔记 2 查看探店笔记 3 点赞功能 编辑 4 点赞排行榜(top5) 编辑 二 好友关注 1 关注与取关 2 共同关注 3 Feed流实现关注推送 4 实现滚动分页查询 三 附近商店 1 GEO数据结构 2 附近商户搜索功能 四 用户…...
初始C++:类和对象(中)
概述:本篇博客主要介绍类和对象的相关知识。 1. 类的默认成员函数 默认成员函数就是用户没有显示实现,编译器会自动生成的成员函数称为默认成员函数。一个类,在不写任何代码的情况下编译器会默认生成以下六个默认函数,在六个默认…...
Java开发经验——阿里巴巴编码规范实践解析3
摘要 本文深入解析了阿里巴巴编码规范中关于错误码的制定与管理原则,强调错误码应便于快速溯源和沟通标准化,避免过于复杂。介绍了错误码的命名与设计示例,推荐采用模块前缀、错误类型码和业务编号的结构。同时,探讨了项目错误信…...
ChatGPT:OpenAI Codex—一款基于云的软件工程 AI 代理,赋能 ChatGPT,革新软件开发模式
ChatGPT:OpenAI Codex—一款基于云的软件工程 AI 代理,赋能 ChatGPT,革新软件开发模式 导读:2025年5月16日,OpenAI 发布了 Codex,一个基于云的软件工程 AI 代理,它集成在 ChatGPT 中,…...
iOS 内存分区
iOS内存分区 文章目录 iOS内存分区前言五大分区static、extern、const关键字比较conststaticextern与.h文件的关系extern引用变量extern声明 static和const联合使用extern和const联合使用 前言 笔者之前学习OC源码的时候,发现对于这里的几个static,extern,const的内容有遗忘,所…...
LWIP的Socket接口
Socket接口简介 类似于文件操作的一种网络连接接口,通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口,但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…...
【Linux笔记】——线程同步条件变量与生产者消费者模型的实现
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——线程互斥与互斥锁的封装 🔖流水不争,争的是滔滔不息 一、线程同步的…...
Popeye
概览与定位 Popeye 是由 derailed 团队开源的 Kubernetes 集群资源 “Sanitizer”,它以只读方式扫描集群内的各种资源(如 Pod、Service、Ingress、PVC、RBAC 等),并基于社区最佳实践给出问题等级及修复建议,覆盖配置误…...
ES(ES2023/ES14)最新更新内容,及如何减少内耗
截至2023年10月,JavaScript(ECMAScript)的最新版本是 ES2023(ES14)。 ES2023 引入了许多新特性,如findLast、toSorted等,同时优化了性能。通过减少全局变量、避免内存泄漏、优化循环、减少DOM操作、使用Web Workers、懒加载、缓存、高效数据结构和代码压缩,可以显著降低…...
电子数据取证(数字取证)技术全面指南:从基础到实践
为了后续查阅方便,推荐工具先放到前面 推荐工具 数字取证基础工具 综合取证平台 工具名称类型主要功能适用场景EnCase Forensic商业全面的证据获取和分析、强大的搜索能力法律诉讼、企业调查FTK (Forensic Toolkit)商业高性能处理和索引、集成内存分析大规模数据处…...
【通用智能体】Serper API 详解:搜索引擎数据获取的核心工具
Serper API 详解:搜索引擎数据获取的核心工具 一、Serper API 的定义与核心功能二、技术架构与核心优势2.1 技术实现原理2.2 对比传统方案的突破性优势 三、典型应用场景与代码示例3.1 SEO 监控系统3.2 竞品广告分析 四、使用成本与配额策略五、开发者注意事项六、替…...
基于 STM32 的手持式安检金属探测器设计与实现
一、硬件设计:芯片与功能模块选型及接线 1. 主控芯片选型 芯片型号:STM32F103C8T6 核心优势: 32 位 Cortex-M3 内核,主频 72MHz,满足实时数据处理需求64KB Flash+20KB SRAM,支持程序存储与数据缓存丰富外设:2 路 USART、2 路 SPI、1 路 I2C、12 位 ADC,适配多模块通信…...
虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系
虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系1.Default Pawn与Camera的关系1.1. Default Pawn 是什么?1.2. Default Pawn 的主要组件1.3. Default…...
Spring源码主线全链路拆解:从启动到关闭的完整生命周期
Spring源码主线全链路拆解:从启动到关闭的完整生命周期 一文看懂 Spring 框架从启动到销毁的主线流程,结合原理、源码路径与伪代码三位一体,系统学习 Spring 底层机制。 1. 启动入口与环境准备 原理说明 Spring Boot 应用入口是标准 Java 应…...
飞帆控件:可配置post/get接口
先上链接: post_get_ithttps://fvi.cn/796看一下这个控件的配置: 当 url 有某个 get 参数时,例如某些接口回传的参数。使用这个接口会发生这些: 如果检测到 url 中有该 url 参数则继续执行选择是否从 url 中删除该参数将这个参数…...
Android 自定义悬浮拖动吸附按钮
一个悬浮的拨打电话按钮,使用CardViewImageView可能会出现适配问题,也就是图片显示不全,出现这种问题,就直接替换控件了,因为上述的组合控件没有FloatingActionButton使用方便,还可以有拖动和吸附效果不是更…...
Spring AI Alibaba集成阿里云百炼大模型应用
文章目录 1.准备工作2.引入maven依赖3.application.yml4.调用4.1.非流式调用4.2.流式调用 阿里云百炼推出的智能体应用、工作流应用和智能体编排应用,有效解决了大模型在处理私有领域问题、获取最新信息、遵循固定流程以及自动规划复杂项目等方面的局限,…...
UI-TARS本地部署
UI-TARS本地部署 UI-TARS本地部署 UI-TARS 论文(arXiv) UI-TARS 官方仓库:包含部署指南、模型下载链接及示例代码。 UI-TARS-Desktop 客户端:支持本地桌面应用的交互控制。 模型部署框架:vLLM本地部署 1.下载项目…...
如何利用内网穿透实现Cursor对私有化部署大模型的跨网络访问实践
文章目录 前言1.安装Ollama2.QwQ-32B模型安装与运行3.Cursor安装与配置4. 简单使用测试5. 调用本地大模型6. 安装内网穿透7. 配置固定公网地址总结 前言 本文主要介绍如何在Windows环境下,使用Cursor接入Ollama启动本地部署的千问qwq-32b大模型实现辅助编程&#x…...
Linux的进程概念
目录 1、冯诺依曼体系结构 2、操作系统(Operating System) 2.1 基本概念 编辑 2.2 目的 3、Linux的进程 3.1 基本概念 3.1.1 PCB 3.1.2 struct task_struct 3.1.3 进程的定义 3.2 基本操作 3.2.1 查看进程 3.2.2 初识fork 3.3 进程状态 3.3.1 操作系统的进程状…...
(10)python开发经验
文章目录 1 cp35 cp36什么意思2 找不到pip3 subprocess编码错误4 导出依赖文件包含路径5 使用自己编译的python并且pyinstall打包程序 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 cp35 cp36什…...
什么是时间戳?怎么获取?有什么用
时间戳的定义 时间戳(Timestamp)是指记录某个事件发生的具体时间点,通常以特定的格式表示。它可以精确到秒、毫秒甚至更小的单位,用于标识某个时刻在时间轴上的位置。 获取时间戳的方法 在不同的编程语言中,获取时间…...
Zookeeper 入门(二)
4. Zookeeper 的 ACL 权限控制( Access Control List ) Zookeeper 的ACL 权限控制,可以控制节点的读写操作,保证数据的安全性,Zookeeper ACL 权 限设置分为 3 部分组成,分别是:权限模式(Scheme)、授权对象(…...
[创业之路-361]:企业战略管理案例分析-2-战略制定-使命、愿景、价值观的失败案例
一、失败案例 1、使命方面的失败案例 真功夫创业者内乱:真功夫在创业过程中,由于股权结构不合理,共同创始人及公司大股东潘宇海与实际控制人、董事长蔡达标产生管理权矛盾。双方在公司发展方向、管理改革等方面无法达成一致,导致…...
dijkstra算法加训上 之 分层图最短路
来几个分层图的题练习下哈 P4568 [JLOI2011] 飞行路线 P4568 [JLOI2011] 飞行路线 - 洛谷https://www.luogu.com.cn/problem/P4568 题目描述 Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在 n 个城市设有业务,设这…...
赋予AI更强的“思考”能力
刚刚!北大校友、OpenAI前安全副总裁Lilian Weng最新博客来了:Why We Think 原文链接:Why We Think by Lilian Weng 这篇文章关注:如何让AI不仅仅是“知道”答案,更能“理解”问题并推导出答案。通过赋予AI更强的“思…...
微服务项目->在线oj系统(Java版 - 1)
相信自己,终会成功 目录 C/S架构与B/S架构 C/S架构(Client/Server,客户端/服务器架构) 特点: 优点: 缺点: 典型应用: B/S架构(Browser/Server,浏览器/服务器架构&a…...
【深度学习】使用块的网络(VGG)
虽然 AlexNet 证明深层神经网络卓有成效,但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 也就是说尽管我知道了更深更大的网络更有效,但是不清楚怎么让它更深更大,从而起到一个更好的效果。 于是,研究人员开始从单…...
Python数据可视化 - Pyecharts绘图示例
文章目录 一、Pyecharts简介及安装1. Pyecharts简介2. 安装Pyecharts 二、准备数据三、饼图示例1. 初始化选项配置2. 饼图相关设置3. 全局配置项3.1 标题配置项3.2 图例配置项3.3 提示框配置项3.4 工具箱配置项3.5 视觉映射配置项 4. 系列配置项4.1 标签选项配置4.2 图元样式配…...
Day29
复习日 知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理…...
Python列表全面解析:从入门到精通
文章目录 Python列表全面解析:从入门到精通一、列表基础1. 什么是列表?2. 列表特性总结表 二、列表的基本操作(基础)1. 访问元素2. 修改列表 三、列表的常用方法(基础)1. 添加元素的方法2. 删除元素的方法3. 查找和统计方法4. 排序和反转 四、列表的高级…...
Nacos数据写入流程
在 3 节点的 Nacos 集群中,数据写入流程和主节点(Leader)的角色基于 Nacos 的分布式一致性协议(通常使用 Raft 协议)来实现。以下以 Markdown 格式详细说明 3 节点 Nacos 集群的数据写入流程以及主节点的角色和确定方式…...
《P4551 最长异或路径》
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 n。寻找树中找两个结点,求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 输入格式 第一行一个整数 n,表示点数。 接下来 n−1 行,给出…...
Ansible模块——文件属性查看,文件或目录创建和属性修改
ansible.builtin.stat 可以查看文件信息。 选项 类型 默认值 描述 pathstrnull 要检查的文件或目录的完整路径(必需)。 followboolfalse 如果是符号链接,是否跟随到目标路径上获取其状态。 get_attributesbooltrue 是否返回扩展属性&#…...
【图像生成大模型】Wan2.1:下一代开源大规模视频生成模型
Wan2.1:下一代开源大规模视频生成模型 引言Wan2.1 项目概述核心技术1. 3D 变分自编码器(Wan-VAE)2. 视频扩散 Transformer(Video Diffusion DiT)3. 数据处理与清洗 项目运行方式与执行步骤1. 环境准备2. 安装依赖3. 模…...
AGI大模型(25):LangChain提示词模版
我们也可以创建prompt template, 并引入一些变量到prompt template中,这样在应用的时候更加灵活。 1 代码实现 # 我们也可以创建prompt template, 并引入一些变量到prompt template中,这样在应用的时候更加灵活 from langchain_core.prompts import ChatPromptTemplate from…...
mybatis中的resultMap的association及collectio的使用
目录 1.reusltmap的说明 2.association的使用 3.collection的使用 4.总结 1.reusltmap的说明 resultmap定义了数据库的结果映射到java对象的规则,resultmap包含4个属性: id: ResultMap 的唯一标识 type: 映射到的 Java 类型(全限定类名或…...
静态网站部署:如何通过GitHub免费部署一个静态网站
GitHub提供的免费静态网站托管服务可以无需担心昂贵的服务器费用和复杂的设置步骤,本篇文章中将一步步解如何通过GitHub免费部署一个静态网站,帮助大家将创意和作品快速展现给世界。 目录 了解基础情况 创建基础站点 在线调试站点 前端项目部署 部署…...
Android 手写签名功能详解:从原理到实践
Android 手写签名功能详解 1. 引言2. 手写签名核心实现:SignatureView 类3. 交互层实现:MainActivity 类4. 布局与配置5. 性能优化与扩展方向 1. 引言 在电子政务、金融服务等移动应用场景中,手写签名功能已成为提升用户体验与业务合规性的关…...
【iOS(swift)笔记-9】WKWebView无法访问网络
对于iOS 在info中添加App Transport Security Settings,然后在App Transport Security Settings里添加Allow Arbitrary Loadstrue 对于macOS 除了上面的操作,还需在项目信息的App Sandbox里有个Network打钩选项...
Adapter适配器模式
Adapter适配器模式是一种结构设计模式,用于解决接口不兼容的问题,通过适配器类,可以将一个类的接口转换为客户渴望的另一个接口,从而使原来无法协作的对象能够一起工作。 角色和职责: 目标接口(Target&…...
七、xlib窗口渲染
文章目录 1.渲染图片2.双缓冲3.混合图片4.渐变窗口 1.渲染图片 在上篇文章中的最后,我们使用libpng加载了一个png图片,并显示到窗口上,但是我们可以看到显示到窗口的图片周边有黑色的背景。原因是在我测试的操作系统下使用xlib创建的窗口默认…...
python中http.cookiejar和http.cookie的区别
在Python中,http.cookiejar和http.cookie(通常指http.cookies模块)是两个不同的模块,它们的主要区别如下: 1. 功能定位 http.cookiejar 用于管理HTTP客户端的Cookie,提供自动化的Cookie存储、发送和接收功…...
架构设计模式:构建健壮、可扩展的 Serverless 应用
架构设计模式:构建健壮、可扩展的 Serverless 应用 到目前为止,我们已经掌握了 Serverless 的基本概念,了解了 FaaS 和 BaaS 如何协同工作,学会了使用框架进行开发部署,并知道了如何监控和排查问题。现在,是时候从“能用”向“好用”迈进了。 仅仅将代码部署到 Lambda 函…...
2- PyTorch
文章目录 1. Overview2. 线性模型 1. Overview 在人的智能中,最经常做的事情是推理和预测,在机器学习中也是如此。我们在以往的算法课中,所接触的穷举、贪心、分治和动规等算法都是由人设计的,而在机器学习中,算法是由…...
MinIO:从入门到精通,解锁云原生存储的奥秘
一、引言:为什么 MinIO 正在重塑存储世界? 在云计算和大数据时代,传统存储系统面临扩展性差、成本高、兼容性不足等挑战。MinIO 凭借其 S3 兼容性、分布式架构、高性能存储 等特性,成为企业构建现代化存储基础设施的首选。 本文…...
【LeetCode 热题100】739:每日温度(详细解析)(Go语言版)
🌡️ LeetCode 739:每日温度(详解 单调栈 多种思路对比) 📌 题目描述 给定一个整数数组 temperatures,表示每天的温度,返回一个数组 answer,其中 answer[i] 是指在第 i 天之后&am…...
Linux学习笔记|GCC编译指令基础|静动态库|makefile
一、GCC 编译指令基础 基本编译命令 gcc -o code code.c和gcc code.c -o code:这两条命令功能相同,都是使用 GCC 编译器将code.c源文件编译成名为code的可执行文件。-o选项用于指定输出文件名,选项位置在源文件前后不影响最终结果。 编译过程…...
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
☎️ LeetCode 17. 电话号码的字母组合(回溯 DFS 详解) 📌 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。 数字到字母的映射如下(与电话按键相同)…...