【C语言数据结构】循环单链表
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,CircleLinkList.h#ifndef CIRCLE_LINK_LIST#define CIRCLE_LINK_LIST//链表节点typedef struct _CircleLinkList
千家信息网最后更新 2026年10月31日【C语言数据结构】循环单链表
CircleLinkList.h
#ifndef CIRCLE_LINK_LIST#define CIRCLE_LINK_LIST//链表节点typedef struct _CircleLinkListNode{ struct _CircleLinkListNode *next;}CircleLinkListNode;//循环单链表typedef void CircleLinkList;/* * 创建循环单链表 * @return 返回循环单链表的指针 */CircleLinkList* CircleLinkList_Create();/* * 销毁循环单链表 * @param list 循环单链表的指针 */void CircleLinkList_Destroy(CircleLinkList *list);/* * 清空循环单链表 * @param list 循环单链表的指针 */void CircleLinkList_Clear(CircleLinkList *list);/* * 向循环单链表pos位置处插入元素 * @param list 循环单链表指针 * @param node 元素指针 * @param pos 插入的索引 */int CircleLinkList_Insert(CircleLinkList *list,CircleLinkListNode *node,int pos);/* * 获取循环单链表中索引位置处的元素 * @param list 循环单链表指针 * @param pos 循环单链表索引值 * @param return 元素指针 */CircleLinkListNode* CircleLinkList_Get(CircleLinkList *list,int pos);/* * 删除循环单链表中索引位置处的值 * @param list 循环单链表的指针 * @param pos 循环单链表索引 * @param return 非0表示删除成功 */int CircleLinkList_Remove(CircleLinkList *list,int pos);/* * 获取循环单链表当前已存储元素的个数 * @param list 循环单链表的指针 * @return 循环单链表中已存储元素的个数 */int CircleLinkList_Length(CircleLinkList *list);/* * 删除循环单链表中的特定元素 * @param list 循环单链表的指针 * @param pos 循环单链表元素指针 * @param return 非0表示删除成功 */int CircleLinkList_DeleteNode(CircleLinkList* list, CircleLinkListNode* node);/* * 重置循环单链表中的游标,指向表头 * @param list 循环单链表的指针 * @return 返回游标指向的元素的指针 */CircleLinkListNode* CircleLinkList_Reset(CircleLinkList* list);/* * 获取当前游标指向的元素指针 * @param list 循环单链表的指针 * @return 返回当前游标指向的元素指针 */CircleLinkListNode* CircleLinkList_Current(CircleLinkList* list);/* * 移动当前游标到下一个元素 * @param list 循环单链表的指针 * @return 移动后的游标指向的元素的指针 */CircleLinkListNode* CircleLinkList_Next(CircleLinkList* list);#endif // CIRCLECircleLinkListCircleLinkList.c
#include "Circlelinklist.h"#include//循环单链表typedef struct _CircleLinkList{ CircleLinkListNode header;//链表头节点 CircleLinkListNode* cursor;//游标 int length;//链表长度}TCircleLinkList;/* * 创建循环单链表 * @return 返回循环单链表的指针 */CircleLinkList* CircleLinkList_Create(){ TCircleLinkList *list = (TCircleLinkList *)malloc(sizeof(TCircleLinkList)); if(list != 0) { list->header.next = 0; list->length= 0; } return list;}/* * 销毁循环单链表 * @param list 循环单链表的指针 */void CircleLinkList_Destroy(CircleLinkList *list){ free(list);}/* * 清空循环单链表 * @param list 循环单链表的指针 */void CircleLinkList_Clear(CircleLinkList *list){ if(list != 0) { TCircleLinkList *c_list = (TCircleLinkList *)c_list; c_list->header.next = 0; c_list->length = 0; c_list->cursor = 0; }}/* * 向循环单链表pos位置处插入元素 * @param list 循环单链表指针 * @param node 元素指针 * @param pos 插入的索引 */int CircleLinkList_Insert(CircleLinkList *list,CircleLinkListNode *node,int pos){ //类型转换 TCircleLinkList* l_list = (TCircleLinkList *)list; //判断链表指针和节点指针不能为空,当前插入的位置是否合法 int ret = ((list != 0) && (node != 0) && (pos >= 0) && (pos <= l_list->length)); if(ret) { CircleLinkListNode* current = (CircleLinkListNode *)l_list; int i; //移动到需要插入的位置的前驱 for(i = 0; i < pos;i++) { current = current->next; } node->next = current->next; //被插入节点的后继指针指向前驱节点的后继指针 current->next = node; //前驱节点的后继指针指向被插入节点 //如果插入的位置是0,则需要修改尾节点的后继指针 if(pos == 0) { current = l_list->header.next; for(i = 0;i < l_list->length;i++) { current = current->next; } current->next = node;//改变尾节点的指针 //判断插入是否是空表 if(l_list->length == 0) { l_list->cursor = node; node->next = node; } } l_list->length++; } return ret;}/* * 获取循环单链表中索引位置处的元素 * @param list 循环单链表指针 * @param pos 循环单链表索引值 * @param return 元素指针 */CircleLinkListNode* CircleLinkList_Get(CircleLinkList *list,int pos){ CircleLinkListNode* node = 0; TCircleLinkList * l_list = (TCircleLinkList *)list; //判断链表指针不为空,且获取的索引合法 if( (l_list != 0) && (pos >= 0)) { CircleLinkListNode* current = (CircleLinkListNode *)l_list; int i; for(i = 0; i < pos; i++) { current = current->next; } node = current->next; } return node;}/* * 删除循环单链表中索引位置处的值 * @param list 循环单链表的指针 * @param pos 循环单链表索引 * @param return 非0表示删除成功 */int CircleLinkList_Remove(CircleLinkList *list,int pos){ TCircleLinkList * l_list = (TCircleLinkList *)list; int ret = ((l_list != 0) && (pos >= 0) && (pos < l_list->length)); if(ret) { CircleLinkListNode* current = (CircleLinkListNode *)list; CircleLinkListNode* first = l_list->header.next; CircleLinkListNode* last = (CircleLinkListNode*)CircleLinkList_Get(l_list, l_list->length - 1); CircleLinkListNode *del; int i; for(i=0; i next; } del = current->next; current->next = del->next; l_list->length--; if( first == del ) { l_list->header.next = del->next; last->next = del->next; } if( l_list->cursor == del ) { l_list->cursor = del->next; } if( l_list->length == 0 ) { l_list->header.next = 0; l_list->cursor = 0; } } return ret;}/* * 获取循环单链表当前已存储元素的个数 * @param list 循环单链表的指针 * @return 循环单链表中已存储元素的个数 */int CircleLinkList_Length(CircleLinkList *list){ int ret = -1; if(list != 0) { TCircleLinkList * l_list = (TCircleLinkList *)list; ret = l_list->length; } return ret;}/* * 删除循环单链表中的特定元素 * @param list 循环单链表的指针 * @param pos 循环单链表元素指针 * @param return 被删除元素的索引 */int CircleLinkList_DeleteNode(CircleLinkList* list, CircleLinkListNode* node){ int ret = -1; if((list != 0) && (node != 0)) { TCircleLinkList * l_list = (TCircleLinkList *)list; CircleLinkListNode* current = l_list->header.next; int i; for(i = 0; i < l_list->length ;i++) { if(node == current) { CircleLinkList_Remove(l_list,i); ret = i; break; } current = current->next; } } return ret;}/* * 重置循环单链表中的游标,指向表头 * @param list 循环单链表的指针 * @return 返回游标指向的元素的指针 */CircleLinkListNode* CircleLinkList_Reset(CircleLinkList* list){ CircleLinkListNode *node = 0; if(list != 0) { TCircleLinkList * l_list = (TCircleLinkList *)list; l_list->cursor = l_list->header.next; node = l_list->cursor; } return node;}/* * 获取当前游标指向的元素指针 * @param list 循环单链表的指针 * @return 返回当前游标指向的元素指针 */CircleLinkListNode* CircleLinkList_Current(CircleLinkList* list){ CircleLinkListNode *node = 0; if(list != 0) { TCircleLinkList * l_list = (TCircleLinkList *)list; node = l_list->cursor; } return node;}/* * 移动当前游标到下一个元素 * @param list 循环单链表的指针 * @return 移动后的游标指向的元素的指针 */CircleLinkListNode* CircleLinkList_Next(CircleLinkList* list){ CircleLinkListNode *node = 0; if(list != 0) { TCircleLinkList * l_list = (TCircleLinkList *)list; l_list->cursor = l_list->cursor->next; node = l_list->cursor; } return node;}
测试代码
#include#include "Circlelinklist.h"struct Value{ CircleLinkListNode node; int val;};int main(void){ struct Valueval[5]; int i; struct Value *p; CircleLinkList *list = CircleLinkList_Create(); for(i = 0;i < 5;i++) { val[i].val = i; } for(i = 0;i < 5;i++) { CircleLinkList_Insert(list,(CircleLinkListNode *)&(val[i]),0); } // CircleLinkList_DeleteNode(list,&(val[0])); for(i = 0;i < 6;i++) { p = CircleLinkList_Get(list,i); printf("%d\n",p->val); CircleLinkList_Next(list); } CircleLinkList_Reset(list); p = CircleLinkList_Get(list,0); printf("%d\n",p->val); return 0;}
循环
指针
元素
游标
指向
索引
位置
节点
移动
个数
后继
存储
成功
前驱
表头
合法
代码
类型
长度
测试
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
西安纸贵互联网科技有限公司
涨乐互联网科技
互联网中国科技
互联网与科技金融数据
互联网科技与金融科技
深圳互联网络科技有限公司
时间互联网络科技
上海电发互联网科技有限公司
现代互联网科技股
全球顶尖互联网科技公司
科技互联网大厂
速维有品互联网信息科技(苏州)有限公司
互联网科技扶贫时间
互联网在线教育科技创业
2021世界互联网领先科技成果发布
九思连强互联网电子科技有限公司
宁波跨境商互联网科技有限公司
玉溪新华互联网科技怎么选
现代互联网科技公司
青岛互联网科技园
瑰夏咖啡
互联网科技卖菜
互联网金融 科技金融
凡科互联网科技
互联网女皇 腾讯科技
睿民互联网科技
贵州叶脉互联网科技有限公司所属行业
受益于互联网科技的高速发展
深圳市罗太互联网科技有限公司
容联科技互联网电商