【C语言数据结构】静态单链表
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,StaticLinkLinst.h#ifndef STATIC_LINKLIST_H#define STATIC_LINKLIST_Htypedef void StaticLinkListNode;
千家信息网最后更新 2025年02月04日【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安全错误
数据库的锁怎样保障安全
h3c网络技术大赛2012
技术保障网络安全
寻找qq代理服务器
如何用桌面共享软件开发
灿尔科技软件开发
苹果软件开发能挣钱吗
网络技术与教育方向考研
谈谈你对数据库法律层面的认知
珠海做软件开发
战66服务器
威胁网络安全的人为因素
开设网络安全的专科学校
互联网云科技演讲
数据库source详解
学校网络安全信息安全数据安全
金融数据库一般用什么地方
网络安全和信息化 一体两翼
仙居环保软件开发定制价格
上海天放网络技术强制扣款
数据库应用基础考试题
网络技术考研哪个大学好
网络安全为人民黑板报资料
服务器端异常的错误标号
服务器错误码
开封软件开发规范
厦门市旗鱼软件开发有限公司
登系统正在加载数据库
小型科技互联网靠谱吗
温州云软件开发流程
天津快递软件开发