单向循环链表接口设计

news/2025/11/19 17:59:23/文章来源:https://www.cnblogs.com/WeiZhouWork/p/19243513

单向循环链表接口设计

  • @file name: 单向循环链表接口设计
  • @brief :设计单向循环链表,实现各种功能函数并测试
  • @author m15629473867@163.com
  • @date 2025/11/19
  • @version 1.0
  • @property
  • @note
  • CopyRight (c) 2025-2026 m15629473867@163.com All Right Reseverd

构造单向循环链表结构体

// 指的是单向循环链表中的结点有效数据类型,用户可以根据需要进行修改
typedef int DataType_t;// 构造单向循环链表的结点,链表中所有结点的数据类型应该是相同的
typedef struct CircularLinkedList
{DataType_t data;				 // 结点的数据域struct CircularLinkedList *next; // 结点的指针域} CircLList_t;

创建一个空单向循环链表并初始化

CircLList_t *CircLList_Create()
{// 1.创建一个头结点并对头结点申请内存CircLList_t *Head = (CircLList_t *)calloc(1, sizeof(CircLList_t));if (NULL == Head){perror("Calloc memory for Head is Failed");exit(-1);}// 2.对头结点进行初始化,头结点是不存储数据域,指针域指向自身,体现“循环”思想Head->next = Head;return Head; // 3.把头结点的地址返回即可
}

创建新的结点,并对新结点进行初始化

CircLList_t *CircLList_NewNode(DataType_t data)
{// 1.创建一个新结点并对新结点申请内存CircLList_t *New = (CircLList_t *)calloc(1, sizeof(CircLList_t));if (NULL == New){perror("Calloc memory for NewNode is Failed");return NULL;}// 2.对新结点的数据域和指针域进行初始化New->data = data;New->next = NULL;return New;
}

功能函数:从首节点进行插入元素

bool CircLList_HeadInsert(CircLList_t *Head, DataType_t data)
{CircLList_t *new = CircLList_NewNode(data);CircLList_t *tmp = Head->next;if (Head->next == Head) // empty list{Head->next = new;new->next = new;return true;}while (tmp->next != Head->next) // normal situation,find the last nodetmp = tmp->next;new->next = Head->next;Head->next = new;tmp->next = new;return true;
}

功能函数:从尾部插入新元素

bool CircLList_TailInsert(CircLList_t *Head, DataType_t data)
{CircLList_t *new = CircLList_NewNode(data);if (Head->next == Head) // judge is the null{Head->next = new;new->next = new;return true;}CircLList_t *tmp;while (tmp->next != Head->next) // when the normal situation,find the last nodetmp = tmp->next;tmp->next = new;new->next = Head->next;return true;
}

功能函数:从指定位置插入新元素

bool CircLList_DestInsert(CircLList_t *Head, DataType_t destval, DataType_t data)
{CircLList_t *tmp = Head->next;DataType_t i = Head->data;if (Head->next == Head) // judge the empty list{printf("The list is empty");return false;}CircLList_t *new = CircLList_NewNode(data);while (destval != tmp->data && tmp->next != Head->next){tmp = tmp->next;}if (destval == tmp->data){new->next = tmp->next;tmp->next = new;return true;}else{printf("There is no destval\n");return false;}
}

功能函数:遍历打印链表

bool CircLList_Print(CircLList_t *Head)
{// 对单向循环链表的头结点的地址进行备份CircLList_t *Phead = Head;// 判断当前链表是否为空,为空则直接退出if (Head->next == Head){printf("current linkeflist is empty!\n");return false;}// 从首结点开始遍历while (Phead->next){// 把头结点的直接后继作为新的头结点Phead = Phead->next;// 输出头结点的直接后继的数据域printf("data = %d\n", Phead->data);// 判断是否到达尾结点,尾结点的next指针是指向首结点的地址if (Phead->next == Head->next){break;}}return true;}

功能函数:删除首节点

bool CircLList_HeadDel(CircLList_t *Head)
{// 对单向循环链表的头结点的地址进行备份CircLList_t *Phead = Head->next;CircLList_t *tmp = Head->next;if (Head->next == Head) // 判断当前链表是否为空,为空则直接退出{printf("current linkeflist is empty!\n");return false;}while (tmp->next != Head->next) // find the last nodetmp = tmp->next;tmp->next = Phead->next;Head->next = Phead->next;Phead->next = NULL;free(Phead);return true;
}

功能函数:删除尾部节点

bool CircLList_TailDel(CircLList_t *Head)
{CircLList_t *tmpFormer;CircLList_t *tmp = Head->next;if (Head->next == Head) // 判断当前链表是否为空,为空则直接退出{printf("current linkeflist is empty!\n");return false;}while (tmp->next != Head->next) // find the last node{tmpFormer = tmp;tmp = tmp->next;}tmpFormer->next = Head->next;tmp->next = NULL;free(tmp);return true;}

功能函数:删除指定位置的节点

bool CircLList_MidDel(CircLList_t *Head, DataType_t destval)
{CircLList_t *tmpFormer;CircLList_t *tmp = Head->next;if (Head->next == Head) // 判断当前链表是否为空,为空则直接退出{printf("current linkeflist is empty!\n");return false;}while (tmp->data != destval && tmp->next != Head->next) // find the specific node{tmpFormer = tmp;tmp = tmp->next;}if (tmp->data == destval){tmpFormer->next = tmp->next;tmp->next = NULL;free(tmp);return true;}else{printf("The is no destival\n");return false;}

主函数,调用并测试各功能函数

int main()
{CircLList_t *H = CircLList_Create();CircLList_HeadInsert(H, 10);CircLList_HeadInsert(H, 20);CircLList_HeadInsert(H, 30);CircLList_TailInsert(H, 30);CircLList_TailInsert(H, 40);CircLList_DestInsert(H, 30, 15);CircLList_Print(H);puts("");CircLList_HeadDel(H);CircLList_Print(H);puts("");CircLList_TailDel(H);CircLList_Print(H);puts("");CircLList_MidDel(H, 12);CircLList_Print(H);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/970245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 最新雕刻机源头厂家权威推荐榜:自主研发专利加持 + 国际测评认证,高精度设备优选清单数控雕刻机/激光雕刻机/小型雕刻机/金属雕刻机公司推荐

引言 在全球制造业向精密化、定制化转型的浪潮下,雕刻机作为核心加工装备,其性能表现直接影响生产效率与产品品质。当前市场品牌数量激增,技术水平参差不齐,部分产品存在精度波动大、适配场景有限、售后响应迟缓等…

linux firewall

在 Linux 系统中,防火墙(Firewall)主要用于控制网络流量,允许或拒绝特定的网络连接。常见的防火墙工具包括:1. iptables(传统方式) 这是 Linux 系统中最常用的防火墙工具,适用于大多数基于 iptables 的发行版(…

2025 年 11 月高温老化房厂家推荐排行榜,老化室、高温老化室、高温房、熟化房、固化房、恒温恒湿室、恒温房、恒温恒湿房公司推荐

2025 年 11 月高温老化房厂家推荐排行榜:老化室、高温老化室、高温房、熟化房、固化房、恒温恒湿室、恒温房、恒温恒湿房公司推荐 随着工业制造和科研测试领域的快速发展,高温老化房、老化室、高温老化室、高温房、熟…

2025 年 11 月耐磨钢板厂家推荐排行榜,高耐磨钢板,高锰耐磨钢板,焊达500耐磨钢板,进口复合耐磨钢板,双金属复合耐磨钢板公司推荐

2025年11月耐磨钢板厂家推荐排行榜:高耐磨钢板、高锰耐磨钢板、焊达500耐磨钢板、进口复合耐磨钢板、双金属复合耐磨钢板公司推荐 行业背景与发展现状 耐磨钢板作为工业领域的关键基础材料,其技术发展水平直接关系到…

wps如何快速交换列(调整列顺序),删除多个不连续的列

写表格的时候,最常见的两个小需求就是:把某两列换个位置,或者干脆删掉几列。其实这事儿不用折腾复杂功能,靠几招顺手的操作,几秒钟就能搞定。下面我把自己在 WPS 表格里常用的方法整理一下,能用鼠标的就用鼠标,…

2025 年 11 月耐磨板厂家推荐排行榜,国产耐磨板,悍达耐磨板,堆焊耐磨板,进口耐磨板,MN13耐磨板,NM360-NM600高强度耐磨板,高铬合金耐磨板公司推荐!

2025年11月耐磨板厂家推荐排行榜:专业指南助力工业设备升级 在工业生产领域,耐磨板作为关键材料,其性能直接影响设备使用寿命和运营效率。随着2025年工业技术标准的不断提升,各类耐磨材料在矿山机械、工程设备、物…

视频融合平台EasyCVR助力守护渔业牧区安全与增效

视频融合平台EasyCVR助力守护渔业牧区安全与增效在广袤的渔业水域和牧区草原,传统的安全管理方式正面临着巨大的挑战。地域广阔、环境复杂、人力监管成本高、风险响应滞后等问题,长期以来制约着农牧业的现代化发展。…

2025 最新推荐!精雕机厂家口碑排行榜,国际协会测评认证 + 多行业适配实力权威发布高校合作精雕机/东莞精雕机/广东精雕机公司推荐

引言 在全球智能制造技术高速迭代的浪潮下,精雕机作为高精度加工领域的核心装备,其精度控制、稳定性与行业适配能力已成为影响科研创新突破与企业生产效能的关键因素。当前市场中,部分厂家存在技术储备不足、定制响…

2025 最新供水设备源头厂家推荐排行榜:无负压 / 恒压 / 变频供水设备实力品牌精选

引言 随着新型城镇化与工业智能化的快速发展,供水设备作为民生保障与产业运行的核心支撑,其品质稳定性、技术适配性与节能效能愈发关键。当前市场中品牌良莠不齐,部分小厂家缺乏核心技术与合规认证,产品存在运行故…

2025 最新限制器厂家权威推荐榜:国际测评认证 + 年产超 20 万套实力品牌,生产与服务全方位评估展现卓越制造能力限制器/扭力限制器/扭矩限制器公司推荐

引言 在全球工业自动化升级浪潮下,传动系统过载保护成为保障生产安全与效率的核心环节,限制器(含扭力限制器、扭矩限制器)的性能表现直接影响设备寿命与运营成本。当前市场品牌鱼龙混杂,性能差异显著,为破解采购…

2025 年安全联轴器厂家最新推荐榜单:权威测评优质厂家 ,铸就传动安全与品质保障标杆

引言 在全球工业自动化升级浪潮下,传动系统的安全防护成为决定生产连续性与运营效益的核心要素,安全联轴器作为过载保护关键部件,其性能可靠性备受行业关注。据国际传动设备协会(IDA)2025 年度测评报告显示,全球…

2025 年智慧停车系统、高校智慧停车系统十大品牌权威推荐!破解停车难题,这些优质品牌值得选择

2025 年智慧停车系统、高校智慧停车系统十大品牌权威推荐!破解停车难题,这些优质品牌值得选择 随着 2025 年中国城市化进程持续深化,机动车保有量预计突破 4.5 亿辆,城市停车位缺口达 1.2 亿个,停车难已成为制约城…

实用指南:智慧家政系统:未来家庭管理的核心技术解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【广东工业大学东莞理工学院联合主办,IEEE出版】第六届机械工程、智能制造与自动化技术国际学术会议(MEMAT 2025)

【广东工业大学&东莞理工学院联合主办,IEEE出版,曾入选中国科协技术协会《重要学术会议指南2023》】第六届机械工程、智能制造与自动化技术国际学术会议 (MEMAT 2025)第六届机械工程、智能制造与自动化技术国际学…

给Snipe-IT添加扫码盘点

给Snipe-IT添加扫码盘点给Snipe-IT添加扫码盘点 生成API KEY,然后在钉钉中调用扫码,然后提交到 /api/v1/hardware/audit

2025 最新推荐沈阳阳光房厂家实力榜单:国际协会测评认证 + 专利技术加持,20000 平厂房保障品质与交付沈阳阳光房公司推荐

引言 在全球绿色建筑浪潮推动下,阳光房凭借空间拓展与节能环保的双重优势,市场需求逐年递增,但行业乱象仍存 —— 部分厂家存在原材料掺假、工艺不达标、售后缺失等问题,严重影响用户体验。为精准筛选优质品牌,本…

2025 最新电磁灶厂家权威推荐榜:聚焦商用大功率 / 智能款,国际测评认证口碑实力双优品牌合集商用多头/商用智能/SUKIO/3500 瓦大功率/SUKI0/硕高电磁灶公司推荐

引言 随着厨房电器向高效化、智能化升级,电磁灶凭借加热快速、节能环保、安全稳定的核心优势,已成为全球家庭烹饪与商用餐饮场景的首选设备。但当前市场品牌繁杂,产品质量差异显著,功率虚标、加热不均、安全性能不…

移动端反射探针格式用什么比较合理

1)移动端反射探针格式用什么比较合理2)不同平台打包热更容灾问题的解决方案这是第453篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。 UWA社…

linux find 删除

在 Linux 中,find 命令可以用来查找文件和目录,而 rm 命令可以用来删除文件。如果你想使用 find 删除文件,可以结合 rm 使用。 一、使用 find 删除文件的常用方法 方法 1:使用 -name 指定文件名删除 find /path/to…

完整教程:Navicat - 连接 mysql 、 sqlserver 数据库 步骤与问题解决

完整教程:Navicat - 连接 mysql 、 sqlserver 数据库 步骤与问题解决pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…