```
/************************************************************************
*
* 程序名字: Sq_list.c
* 作 者: sid_tapole
* 版 本: 1.0.1
* 编写时间: 2015年6月
* 功 能: 链表==>增删改查、分支合并
*
*************************************************************************/
#define INIT_SIZE_LIST 100 // 线性表初始空间分配量
#define INCREAMENT_LIST 10 // 线性表的分配增量
#define ELEM_TYPE int // 自定义类型
#define STATUS int // 自定义的类型
typedef struct {
ELEM_TYPE *elem; // 线性表基址
int length; // 当前长度
int list_size; // 当前分配的存储容量ELEM_TYPE
} Sq_list;
Sq_list L;
/***************************************************** init_list_Sq BEGIN
*
* init_list_Sq 初始化链表
*
* @param
* &L 哨兵节点
* @return
* STATUS 捕获程序运行状态
*/
STATUS init_list_Sq(Sq_list &L)
{
// 构造一个空的线性表L
L.elem = (ELEM_TYPE *)malloc(INIT_SIZE_LIST * sizeof(ELEM_TYPE));
if (!L.elem) {
printf("分配空间失败!程序异常退出!");
exit(-1);
}
L.length = 0; // 空表长度为0
L.list_size = INIT_SIZE_LIST; // 初始存储容量
return 0;
}
//------------------------------------------------------ init_list_Sq END
/**************************************************** insert_list_Sq BEGIN
*
* init_list_Sq 插入节点
*
* @param
* &L 哨兵节点
* @param
* i 第i个节点
* @param
* e 类型
* @return
* STATUS 捕获程序运行状态
*/
STATUS insert_list_Sq(Sq_list &L, int i, ELEM_TYPE e)
{
ELEM_TYPE *newbase = NULL;
ELEM_TYPE *q, *p;
/*
** 在顺序线性表L中第i个位置之前插入新的元素e,
** i的合法值为 1<= i <=list_length_Sq(L) + 1
** i 不合法,错误退出-1
*/
if (i < 1 || i > L.length + 1) {
return -1;
}
//当前存储空间已满,增加分配
if (L.length >= L.list_size) {
newbase = (ELEM_TYPE *)realoc(L.elem,
(L.list_size + INCREAMENT_LIST) * sizeof(ELEM_TYPE));
if (!newbase){
printf("分配空间失败!程序异常退出!");
exit(-1);
}
L.elem = newbase; // 新基址
L.list_size += INCREAMENT_LIST; // 增加存储容量
}
q = &(L.elem[i -1]); // q为插入位置
for (p = &(L.elem[L.length -1]); p >= q; --p) {
//插入位置及之后的元素右移
*(p + 1) = *p;
}
*q = e; // 插入e
++L.length; // 表长增1
return 0;
}
//----------------------------------------------------- insert_list_Sq end
/**************************************************** delete_list_Sq BEGIN
*
* delete_list_Sq 删除节点
*
* @param
* &L 哨兵节点
* @param
* i 第i个节点
* @param
* e 类型
* @return
* STATUS 捕获程序运行状态
*/
STATUS delete_list_Sq(Sq_list &L, int i, ELEM_TYPE &e)
{
ELEM_TYPE *p,*q;
/*
** 在顺序线性表L中删除第i个元素,并用e返回其值
** i的合法值为 1<= i <=list_length_Sq(L)
** i 不合法,错误退出-1
*/
if (i < 1 || i > L.length) {
exit (-1);
}
p = &(L.elem[i - 1]); // p为删除元素的位置
e = *p; // 被删除元素的值赋给e
q = L.elem + L.length - 1; // 表尾元素的位置
for (++p; p <= q; ++p) {
//被删除元素之后的元素左移
*(p - 1) = *p;
}
--L.length; // 表长减1
return 0;
}
//----------------------------------------------------- delete_list_Sq end
/***************************************************** local_list_Sq BEGIN
*
* local_list_Sq 查找
*
* @param
* &L 哨兵节点
* @param
* e 类型
* @param
* STATUS 常量
* @return
* STATUS 捕获程序运行状态
*/
STATUS local_list_Sq(Sq_list &L, ELEM_TYPE e, STATUS (*compare)(ELEM_TYPE,ELEM_TYPE))
{
/*
** 在顺序线性表L中查找第1个值与e满足compare()的元素的位序
** 若找到,则返回其在L中的位序,否则返回0
*/
int i = 1; // i的初值为第一个元素的位序
ELEM_TYPE *p = L.elem; // p的初值为第一个元素的存储位置
while (i <= L.length && !(*compare)(*p++, e)) {
i++;
}
if (i <= L.length) {
return i;
}
else {
return 0;
}
}
//----------------------------------------------------- local_list_Sq end
/***************************************************** merge_list_Sq BEGIN
*
* local_list_Sq 合并分支链表
*
* @param
* La 链表A
* @param
* Lb 链表B
* @param
* &Lc 链表C哨兵
* @return
* STATUS 捕获程序运行状态
*/
STATUS merge_list_Sq(Sq_list La, Sq_list Lb, Sq_list &Lc)
{
/*
** 已知顺序线性表La和Lb的元素按值非递减排列
** 归并La和Lb得到新的线性表Lc,它的数据元素也按值非递减排列。
*/
ELEM_TYPE *pa_last, *pb_last, *pc, *pa, *pb;
pa = La.elem;
pb = Lb.elem;
Lc.list_size = Lc.length = La.length + Lb.length;
pc = Lc.elem = (ELEM_TYPE *)malloc(Lc.list_size*sizeof(ELEM_TYPE));
if (!Lc.elem) {
printf("分配空间失败!程序异常退出!");
exit(-1);
}
pa_last = La.elem + La.length - 1;
pb_last = Lb.elem + Lb.length - 1;
while (pa <= pa_last && pb <= pb_last) { // 归并
if (*pa <= *pb) {
*pc++ = *pa++;
}
else {
*pc++ = *pb++;
}
}
while (pa <= pa_last) {
*pc++ = *pa++; // 插入La的剩余元素
}
while (pb <= pb_last) {
*pc++ = *pb++; // 插入La的剩余元素
}
return 0;
}
//----------------------------------------------------- merge_list_Sq end
```
- 2023-4-8__成长之路
- 技术杂谈
- 程序员境界
- 走进猿类
- 做一个程序员
- 什么是猿类
- 爱乱吹的猿
- 业余生活
- 我的书架
- 高效程序员的45个习惯
- 敏捷—高效软件开发之道
- 态度决定一切
- 学无止尽
- 交付用户想要的软件
- 敏捷反馈
- 敏捷编码
- 敏捷调试
- 艺术人生
- 摘自艺术的境界
- 如何欣赏画
- 《的》
- 我的文档
- 小白学习前那些说不完的事
- 计算机语言都一样
- 尝试理解他人代码
- 做为旁观者的思考
- 怎样才算懂计算机
- 工欲善其事,必先利其器
- 教案日志
- 十天学电脑
- 一,认识计算机
- 二、认识编程语言
- 三、认识程序内涵
- 四,认识数据结构
- 五、认识电脑系统
- 六、认识通信原理
- 七、邮箱管理
- 八、重新审视电脑
- 九、理解终生学习
- 十、感悟三千世界
- c语言
- C语言——我觉得好简单
- c学好不怕没饭碗—2014.7.21
- C语言——我想的有点儿简单
- 或多或少的c语言知识
- c语言初探篇
- 初探c语言底层
- 初探整型和浮点型
- 初探二进制数---原反补移
- 初探有无符号
- 初探c是如何跑起来的
- 初探指针
- 初探数组
- 初探顺序表
- 初探栈,队列
- 初探c语言编程
- c语言进阶篇
- c语言自身的那些事
- 结构详解
- c语言大成篇
- 人类思维——模式匹配
- 论c语言面试
- 数据结构
- 核心概念,没有之一顺序表
- 线性表代码实现
- Sq_list
- 不存在的链表
- 只是一种思想——栈
- 只是一种思想——队列
- 不存在的树
- 只是一种思想——二分法
- 不存在的图
- 算法原理
- 傅里叶变换
- 算法导论
- 算法导论——c语言实现
- 算法导论——java实现
- 组成原理
- 操作系统
- 初探操作系统
- 深究操作系统
- 操作系统如何跑起来
- 进程就像细胞
- 系统就像生命
- 进程树pstree
- 进程
- 进程何时更名为生命
- 初探进程映像
- 程序如何成为进程映像
- PCB
- PCB解读之——信号量(p_sig)
- 进程同步
- 进程通信
- 进程调度
- 用户
- PPDA
- 存储系统
- I/O系统
- 网络原理
- 通信简史
- 通信是网络基础
- 趣谈网络
- 自我介绍
- 快递公司
- 小D的自述
- 网络架构
- OSI/RM
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
- TCP/IP四层模型
- 五层模型
- 网络划分
- IP史
- 信息安全
- 社会工程学
- 信息收集
- 诱导
- 伪装
- 如何成为任何人
- 社会心理学
- 思维模式
- 说服的力量
- 代码审计
- 灾难恢复
- 安全注入
- 网络工程
- 802.11
- CCNA
- CWNA
- 社会工程
- 社会心理
- 信息诱导
- 身份伪装
- 系统框架
- web前端框架
- smarty框架
- bootstrap框架
- thinkphp框架
- zend框架
- yii框架
- ci框架
- 网站开发
- 五大难题
- 网站工作原理
- 数据库原理
- 服务器原理
- 前端开发
- 前端技能基础
- html
- css
- javascript
- 浏览器兼容
- 前端总结
- 后台开发
- 或多或少的JS
- js初探篇
- 理解Javascript
- JS继承
- 数组
- 操作方法
- DOM事件
- 数据传输
- JS面试题
- 数据对象
- 学生管理系统
- 学生管理首页
- 粗略学了一遍后的总结
- 零碎知识
- js初探篇第二版
- javascript构成
- 基本类型
- 基本语句与判断类型
- 基本对象与操作函数
- 基本判断与甄别数据
- 内置对象与操作函数
- 对象认识与深浅复制
- DOM级别与BOM
- 严格模式与混杂模式
- ES5和ES6
- js进阶篇
- 上传图片
- js实战篇
- 或多或少的PHP
- 详解url结构
- html基础
- html初识
- html-组成页面的基础标签
- ie兼容
- 教学方法
- 论php——编程思想
- 论php——底层实现
- 中华国学
- 易经
- 黄帝内经
- 山海经
- 道德经
- 骗经
- 中华哲学
- 一花一世界
- 道可道非常道
- 一瞬
- 宇宙
- 心得体会
- 电脑叫智能生命体更准确
- 计算机不是汉语模式
- 琐事日记
- 成长与人性
- 祝单身狗快乐
- 人其实过的很单薄
- 都怪自己不够优秀
- 那是几个人的世界
- 认清世界,认清自己
- 陪伴繁华逝去的平凡
- 俯拾仰取
- 技术手册
- 网站开发
- 准备工作
- firewalld
- mysql
- redis
- 开发流程
- 整体配置
- 环境配置
- tomcat配置
- 数字证书配置
- 项目配置
- 数据设计
- 用户管理
- 整站设计
- user
- user_group
- user_role
- 服务端
- 了解学习
- quartz
- HelloWorld
- HelloJob
- HelloQuartz
- HelloScheduler
- Job
- JobDataMap
- Trigger
- Scheduler
- properties
- spring
- AOP
- 使用
- svnkit
- svn init
- FSFS
- server
- Java
- 测试
- 任务调度
- 网站架构
- 网站前端
- pc端
- 移动端
- native
- ios
- android
- ipad
- hybrid
- 技术日志
- 2018-9-26
- 2018-11-26
- 资源收集
- UED资源
- 技术架构
- 云平台
- 工作方面
- 实习工作经验
- 草稿1
- 草稿2
- 草稿3
- 草稿4
- 草稿5
- 草稿6
- 草稿7
- 大学总结
- 面经
- 一、职能定位
- 细节
- 前端
- 工作总结
- 简历
- 职业规划
- 一年规划
- 整理归档
- 2015/11/10以前
- 2015/11/10
- 2015/11/11
- 2015/11/12
- 2015/11/13
- 2015/11/14
- 2015/11/15与16
- 2015/11/17
- 2015/11/18
- 2015/11/19与20
- 2015/11/21
- 2015/11/22
- 2015/11/23
- 2015/11/24
- 2015/11/25
- 2015/11/26
- 2015/11/27
- 2015/11/28
- 2015/11/29
- 2015/11/30-12/6
- 2015/12/7-2016/4/18
- 2016/4/19
- 2016/4/20~2017/6/27
- 2017/6/28-2017/7/4
- 2017/7/5-2018/1/11
- 2018/1/12
- 2018/1/13-2018/4/19
- 2018/4/20
- 2018/4/21-2018/5/10
- 2018/5/11
- 2018/5/12-2018/5/16
- 2018/5/17-2018/5/30
- 2018/5/30-2018/10/15
- 2018/10/15-2018/10/18
- 2018/10/19-2018/11/17
- 2018/11/17-2018/12/31
- 结束----------------开始
- 2019/2/18
- 2020/7/30
- 2020/9/5
- 2021/5/6
- 回收站
- 以前文件
- 2015-10-17__成长之路
- 2018-10-15__成长之路
- 2020-3-29__成长之路
- 毕业三年总结
- 浙大之旅
- 2020
- 英语
- 基础3000单词
- 第一周
- 百词斩__126
- 百词斩__126翻译
- 百词斩__252
- 百词斩_252翻译
- 百词斩__392
- 百词斩__532
- 百词斩__672
- 第二周
- 百词斩__812
- 听力
- 新东方演讲稿
- 库克杜克大学演讲全文版
- 库克杜克大学演讲演讲英文对照版