【C语言数据结构】静态单链表
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,StaticLinkLinst.h#ifndef STATIC_LINKLIST_H#define STATIC_LINKLIST_Htypedef void StaticLinkListNode;
千家信息网最后更新 2025年12月02日【C语言数据结构】静态单链表
StaticLinkLinst.h
#ifndef STATIC_LINKLIST_H#define STATIC_LINKLIST_Htypedef void StaticLinkListNode; //静态单链表节点typedef void StaticLinkList; //静态单链表/* * 创建静态单链表 * @param capacity 静态单链表的最大容量 * @return 返回静态单链表的指针 */StaticLinkList* StaticLinkList_Create(int capacity);/* * 销毁静态单链表 * @param list 静态单链表的指针 */void StaticLinkList_Destroy(StaticLinkList *list);/* * 清空静态单链表 * @param list 静态单链表的指针 */void StaticLinkList_Clear(StaticLinkList *list);/* * 向静态单链表pos位置处插入元素 * @param list 静态单链表指针 * @param node 元素指针 * @param pos 插入的索引 */int StaticLinkList_Insert(StaticLinkList *list,StaticLinkListNode *node,int pos);/* * 获取静态单链表中索引位置处的元素 * @param list 静态单链表指针 * @param pos 静态单链表索引值 * @param return 元素指针 */StaticLinkListNode* StaticLinkList_Get(StaticLinkList *list,int pos);/* * 删除静态单链表中索引位置处的值 * @param list 静态单链表的指针 * @param pos 静态单链表索引 * @param return 非0表示删除成功 */int StaticLinkList_Remove(StaticLinkList *list,int pos);/* * 获取静态单链表当前已存储元素的个数 * @param list 静态单链表的指针 * @return 静态单链表中已存储元素的个数 */int StaticLinkList_Length(StaticLinkList *list);/* * 获取静态单链表最大可存储元素的个数 * @param list 静态单链表的指针 * @return 静态单链表最大可存储元素的个数 */int StaticLinkList_Capacity(StaticLinkList *list);#endif // STATICLINKLIST_H
StaticLinkList.c
#include "StaticLinkList.h"#include "malloc.h"#define NO_NODE -1typedef struct _StaticLinkListNode{ unsigned int data; //数据域指针 int next; //下一个节点的数组下标}TStaticLinkListNode;typedef struct _StaticLinkList{ int length; int capacity; TStaticLinkListNode node[]; //用于存储静态链表的柔性数组}TStaticLinkList;/* * 创建静态单链表 * @param capacity 静态单链表的最大容量 * @return 返回静态单链表的指针 */StaticLinkList* StaticLinkList_Create(int capacity){ //由于柔性数组的0位置会被作为头节点,所以实际上容量是capapcity + 1 size_t size = sizeof(TStaticLinkList) + sizeof(TStaticLinkListNode) * (capacity + 1); TStaticLinkList *list = (TStaticLinkList *)malloc(size); if(list != 0) { int i; list->capacity = capacity; list->length = 0; list->node[0].next = 0; for(i = 1;i <= capacity;i++) { list->node[i].next = NO_NODE; } } return list;}/* * 销毁静态单链表 * @param list 静态单链表的指针 */void StaticLinkList_Destroy(StaticLinkList *list){ free(list);}/* * 清空静态单链表 * @param list 静态单链表的指针 */void StaticLinkList_Clear(StaticLinkList *list){ if(list != 0) { TStaticLinkList *s_list = (TStaticLinkList *)list; s_list->length = 0; }}/* * 向静态单链表pos位置处插入元素 * @param list 静态单链表指针 * @param node 元素指针 * @param pos 插入的索引 * @param return 非0表示插入成功 */int StaticLinkList_Insert(StaticLinkList *list,StaticLinkListNode *node,int pos){ TStaticLinkList *s_list = (TStaticLinkList *)list; //判断链表和节点指针不为空,位置合法,增加后容量不会大于最大容量 int ret = ( (s_list != 0) && (node != 0) && (pos >= 0) && \ (pos <= s_list->length) && (s_list->length + 1 <= s_list->capacity + 1) ); if(ret) { int index = -1; //待放入元素的数组下标 int current = 0; //当前节点的数组下标 int i = 0; //遍历查找数组中的空余项 for(i =1; i <= s_list->capacity;i++) { if(s_list->node[i].next == NO_NODE) { index = i; break; } } //移动到需要插入位置的前驱 for(i = 0; i < pos ; i++) { current = s_list->node[current].next; } s_list->node[index].next = s_list->node[current].next; s_list->node[index].data = (unsigned int)node; s_list->node[current].next = index; s_list->length++; } return ret;}/* * 获取静态单链表中索引位置处的元素 * @param list 静态单链表指针 * @param pos 静态单链表索引值 * @param return 元素指针 */StaticLinkListNode* StaticLinkList_Get(StaticLinkList *list,int pos){ TStaticLinkListNode *s_node = 0; TStaticLinkList *s_list = (TStaticLinkList *)list; if( (list != 0) && (pos >=0) && (pos < s_list->length)) { int current = 0; int index = -1; int i; //移动到需要查询的位置 for(i = 0; i < pos ; i++) { current = s_list->node[current].next; } //获取元素的数组下标 index = s_list->node[current].next; //将data中的类型强制转换成StaticLinkListNode *,因为插入时保存的就是节点的指针 s_node = (StaticLinkListNode *)s_list->node[index].data; } return s_node;}/* * 删除静态单链表中索引位置处的值 * @param list 静态单链表的指针 * @param pos 静态单链表索引 * @param return 非0表示删除成功 */int StaticLinkList_Remove(StaticLinkList *list,int pos){ TStaticLinkList *s_list = (TStaticLinkList *)list; int ret = ( (s_list != 0) && (pos >= 0) && (pos < s_list->length)); if(ret) { int index = -1; int current = 0; int i = 0; for(i = 0; i < pos;i++) { current = s_list->node[current].next; } //被删除元素的数组下标 index = s_list->node[current].next; //将被删元素的后继下标赋值给除被删除元素前驱的后继下标 s_list->node[current].next = s_list->node[index].next; //设置被删除元素的后继下标为NO_NODE s_list->node[index].next = NO_NODE; s_list->length--; } return ret;}/* * 获取静态单链表当前已存储元素的个数 * @param list 静态单链表的指针 * @return 静态单链表中已存储元素的个数 */int StaticLinkList_Length(StaticLinkList *list){ int ret = -1; if(list != 0) { TStaticLinkList *s_list = (TStaticLinkList *)list; ret = s_list->length; } return ret;}/* * 获取静态单链表最大可存储元素的个数 * @param list 静态单链表的指针 * @return 静态单链表最大可存储元素的个数 */int StaticLinkList_Capacity(StaticLinkList *list){ int ret = -1; if(list != 0) { TStaticLinkList *s_list = (TStaticLinkList *)list; ret = s_list->capacity; } return ret;}测试代码
#include#include "StaticLinkList.h"int main(void){ int i,*j; int a[5]; StaticLinkList *list = StaticLinkList_Create(5); for(i = 0;i < 5;i++) { a[i] = i; } for(i = 0; i < 5;i++) { StaticLinkList_Insert(list,&(a[i]),0); } StaticLinkList_Remove(list,0); for(i = 0; i < StaticLinkList_Length(list);i++) { j = StaticLinkList_Get(list,i); printf("%d\n",*j); } return 0;}
静态
指针
元素
位置
索引
存储
下标
个数
数组
最大
节点
容量
成功
后继
前驱
柔性
移动
数据
合法
代码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
三年出现的网络安全事件
c web连接数据库
网络技术安全指导原则
好的cc防护服务器
安徽会议视频系统服务器
希望之村有几个服务器分别是什么
代理服务器换ip
为什么电脑连接不上r星的服务器
网络安全费用15%
阿里云学生服务器优惠
越南zalo软件开发时间
xampp数据库密码修改
积木软件开发人
四叶草 网络安全大会
北京网络安全员
网络安全专业就业方向作文
短视频平台用什么数据库
软件开发人员培训班
福耀软件开发
tcga数据库下载和处理
金山区品质数据库服务商报价行情
三菱电梯数据库连接失败的原因
汉中网络技术服务价格
互联网梦龙科技
网络安全报警级别
软件开发应该交付哪些文档
计算机数据库技术题库
电子科大软件开发
什么是数据库的逻辑导出
工程软件开发技术