数据结构——单向循环链表代码(补充)

在此前的文章中(链接如下),只有单向链表的代码,接下来我们来写单向循环链表,并用其实现一个简单的学生信息链表https://blog.csdn.net/2301_80406299/article/details/151157051?spm=1011.2415.3001.10575&sharefrom=mp_manage_link

1、单向链表与单向循环链表的不同

  • 单向链表:尾节点的 next 指针坚定地指向 NULL。这个 NULL 像一个终点站的标志,明确告知遍历者:“链表至此结束,前方无路”。这使得单向链表在逻辑上呈现为一种线性开环结构,有头有尾,有明确的起点和终点。

  • 单向循环链表:尾节点的 next 指针则指向了头节点。这一指向,如同将一条绳子的首尾相接,形成了一个闭合的环。它移除了结束的标志,使得遍历操作可以在链表中无限循环。因此,它是一种环形结构,没有传统意义上的“终点”。

单向循环链表代码——学生信息链表


主函数  main.c

/********************************************************************************* @file    main.c* @author  feng* @version V0.0.1* @date    2025.09.08* @brief   使用单向循环链表实现数据的增删查改——学生信息链表*          环境:ubuntu18.04*          编译+执行:./project.sh******************************************************************************** @attention**  本文档只供装逼学习使用,不得商用,违者必究**  github:       https://github.com/(求我拿链接)*  CSDN:          https://blog.csdn.net/(嘻嘻)*  gitee:         https://gitee.com/(求我拿链接)*  微信公众号:    没有*  没有疑问或者建议:12345678910@qq.com** *******************************************************************************/#include "singly_circular_link_list.h"int main(int argc, char const *argv[])
{node_p head_node = sc_link_list_InitHeadNode();if (head_node == NULL){printf("头节点初始化失败!\n");return -1;}node_p new_node = NULL;int select = 0;char name[20];int id, grade, age;float score;int search_id, del_id, change_id;while (1){sc_link_list_ShowListData(head_node);printf("\n请选择以下功能:\n");printf("1、插入数据(头插法)\n");printf("2、插入数据(尾插法)\n");printf("3、删除数据\n");printf("4、修改数据\n");printf("5、查找数据\n");printf("6、退出系统\n");printf("请选择: ");scanf("%d", &select);while (getchar() != '\n'); // 清空输入缓冲区switch (select){case 1: // 头插法printf("\n--- 添加学生(头插法) ---\n");printf("姓名: "); scanf("%19s", name);printf("学号: "); scanf("%d", &id);printf("年级: "); scanf("%d", &grade);printf("成绩: "); scanf("%f", &score);printf("年龄: "); scanf("%d", &age);while (getchar() != '\n'); new_node = sc_link_list_InitDataNode(name, id, grade, score, age);if (!new_node) {printf("创建节点失败!\n");break;}sc_link_list_HeadInsert(head_node, new_node);printf("添加成功!\n");break;case 2: printf("\n--- 添加学生(尾插法) ---\n");printf("姓名: "); scanf("%19s", name);printf("学号: "); scanf("%d", &id);printf("年级: "); scanf("%d", &grade);printf("成绩: "); scanf("%f", &score);printf("年龄: "); scanf("%d", &age);while (getchar() != '\n'); new_node = sc_link_list_InitDataNode(name, id, grade, score, age);if (!new_node) {printf("创建节点失败!\n");break;}sc_link_list_LastInsert(head_node, new_node);printf("添加成功!\n");break;case 3: // 删除printf("\n请输入要删除的学生学号: ");scanf("%d", &del_id);while (getchar() != '\n');if (sc_link_list_DelNodeData(head_node, del_id) == 0) {printf("删除成功!\n");}break;case 4: // 修改printf("\n请输入要修改的学生学号: ");scanf("%d", &change_id);while (getchar() != '\n'); printf("输入新的信息(留空则保持不变):\n");printf("姓名: "); scanf("%19s", name);printf("年级(0保持不变): "); scanf("%d", &grade);printf("成绩(-1保持不变): "); scanf("%f", &score);printf("年龄(0保持不变): "); scanf("%d", &age);while (getchar() != '\n'); if (sc_link_list_ChangeNodeData(head_node, change_id, name[0] ? name : NULL, grade, score, age) == 0) {printf("修改成功!\n");}break;case 5:printf("\n请输入要查找的学生学号: ");scanf("%d", &search_id);while (getchar() != '\n');sc_link_list_SearchNodeData(head_node, search_id);break;case 6: // 退出sc_link_list_Uninit(head_node);printf("系统已退出!\n");return 0;default:printf("无效选择,请重新输入!\n");break;}}
}

 


头文件 singly_circular_link_list.h

/********************************************************************************* @file    singly_circular_link_list.h* @author  feng* @version V0.0.1* @date    2025.29.28* @brief   单向循环链表的增删查改功能——学生信息链表* ******************************************************************************* @attention**  本文档只供学习使用,不得商用,违者必究* *  github:       https://github.com/(求我拿链接)*  CSDN:          https://blog.csdn.net/(嘻嘻)*  gitee:         https://gitee.com/(求我拿链接)*  微信公众号:    没有*  没有疑问或者建议:12345678910@qq.com* * *******************************************************************************/#ifndef SINGLY_CIRCULAR_LINK_LIST_H
#define SINGLY_CIRCULAR_LINK_LIST_H#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>typedef struct student {char name[20];int id;int grade;float score;int age;
} student_t;typedef struct node {student_t data; struct node *next_p;
} node_t, *node_p;node_p sc_link_list_InitHeadNode(void);
node_p sc_link_list_InitDataNode(const char *name, int id, int grade, float score, int age);  // 修改3: 参数列表修改
void sc_link_list_HeadInsert(node_p head_node, node_p new_node);
void sc_link_list_LastInsert(node_p head_node, node_p new_node);
bool sc_link_list_IfEmpty(node_p head_node);
int sc_link_list_ShowListData(node_p head_node);
int sc_link_list_DelNodeData(node_p head_node, int del_id);  // 修改4: 改为按学号删除
int sc_link_list_ChangeNodeData(node_p head_node, int find_id, const char *new_name, int new_grade, float new_score, int new_age);  // 修改5: 参数列表修改
int sc_link_list_SearchNodeData(node_p head_node, int search_id);  // 修改6: 改为按学号查找
void sc_link_list_Uninit(node_p head_node);#endif

功能函数:singly_circular_link_list

#include "singly_circular_link_list.h"node_p sc_link_list_InitHeadNode(void)
{node_p p = malloc(sizeof(node_t));if (p != NULL){memset(p, 0, sizeof(node_t));p->next_p = p;}return p;
}node_p sc_link_list_InitDataNode(const char *name, int id, int grade, float score, int age)
{node_p p = malloc(sizeof(node_t));if (p != NULL){memset(p, 0, sizeof(node_t));strncpy(p->data.name, name, sizeof(p->data.name)-1);p->data.id = id;p->data.grade = grade;p->data.score = score;p->data.age = age;p->next_p = p;}return p;
}void sc_link_list_HeadInsert(node_p head_node, node_p new_node)
{new_node->next_p = head_node->next_p;head_node->next_p = new_node;
}void sc_link_list_LastInsert(node_p head_node, node_p new_node)
{node_p temp_p = head_node;while (temp_p->next_p != head_node){temp_p = temp_p->next_p;}temp_p->next_p = new_node;new_node->next_p = head_node;
}bool sc_link_list_IfEmpty(node_p head_node)
{return head_node->next_p == head_node;
}int sc_link_list_ShowListData(node_p head_node)
{if (sc_link_list_IfEmpty(head_node)){printf("链表为空!\n");return -1;}node_p tem_p = head_node->next_p;int i = 0;printf("\n==================学生信息列表===================\n");while (tem_p != head_node){printf("学生 %d:\n", i+1);printf("  姓名: %s\n", tem_p->data.name);printf("  学号: %d\n", tem_p->data.id);printf("  年级: %d\n", tem_p->data.grade);printf("  成绩: %.2f\n", tem_p->data.score);printf("  年龄: %d\n", tem_p->data.age);printf("--------------------------------------------\n");tem_p = tem_p->next_p;i++;}printf("================================================\n");return 0;
}int sc_link_list_DelNodeData(node_p head_node, int del_id)
{if (sc_link_list_IfEmpty(head_node))return -1;node_p prev_p = head_node;node_p curr_p = head_node->next_p;while (curr_p != head_node){if (curr_p->data.id == del_id){prev_p->next_p = curr_p->next_p;free(curr_p);return 0;}prev_p = curr_p;curr_p = curr_p->next_p;}printf("未找到学号为 %d 的学生\n", del_id);return -1;
}int sc_link_list_ChangeNodeData(node_p head_node, int find_id, const char *new_name, int new_grade, float new_score, int new_age)
{if (sc_link_list_IfEmpty(head_node))return -1;node_p tem_p = head_node->next_p;while (tem_p != head_node){if (tem_p->data.id == find_id){if (new_name) strncpy(tem_p->data.name, new_name, sizeof(tem_p->data.name)-1);if (new_grade > 0) tem_p->data.grade = new_grade;if (new_score >= 0) tem_p->data.score = new_score;if (new_age > 0) tem_p->data.age = new_age;return 0;}tem_p = tem_p->next_p;}printf("未找到学号为 %d 的学生\n", find_id);return -1;
}int sc_link_list_SearchNodeData(node_p head_node, int search_id)
{if (sc_link_list_IfEmpty(head_node))return -1;node_p tem_p = head_node->next_p;while (tem_p != head_node){if (tem_p->data.id == search_id){printf("\n找到学生信息:\n");printf("  姓名: %s\n", tem_p->data.name);printf("  学号: %d\n", tem_p->data.id);printf("  年级: %d\n", tem_p->data.grade);printf("  成绩: %.2f\n", tem_p->data.score);printf("  年龄: %d\n", tem_p->data.age);return 0;}tem_p = tem_p->next_p;}printf("未找到学号为 %d 的学生\n", search_id);return -1;
}void sc_link_list_Uninit(node_p head_node)
{if (!head_node) return;node_p curr_p = head_node->next_p;while (curr_p != head_node){node_p next_p = curr_p->next_p;free(curr_p);curr_p = next_p;}free(head_node);
}

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

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

相关文章

【Python自动化】 21.2 Pandas 读取 Excel 时的 dtype 参数完全指南

一、dtype 参数概述 dtype 参数用于指定列的数据类型&#xff0c;在读取 Excel 时非常重要&#xff0c;可以&#xff1a; 提高内存效率避免自动类型推断错误确保数据一致性提升读取性能 二、基本用法 1. 基础语法 import pandas as pd# 指定列数据类型 df pd.read_excel(data.…

gtest全局套件的测试使用

gtest全局套件的测试使用 #include <iostream> #include "gtest/gtest.h" #include <unordered_map>class MyEnvironment: public testing::Environment {public:virtual void SetUp() override{std::cout<<"单元测试前的环境初始化&#xff…

【系统分析师】第7章-基础知识:软件工程(核心总结)

更多内容请见: 备考系统分析师-专栏介绍和目录 文章目录 一、软件工程的基本概念 1.1 定义与意义 1.2 软件工程的基本原则 1.3 核心定义与边界 1.4 四大核心原则 1.5 三大核心目标 二、软件生命周期 2.1 定义与阶段划分 2.2 软件生命周期模型 三、软件开发方法 3.1 结构化方法…

量化基金从小白到大师 - 金融数据获取大全:从免费API到Tick级数据实战指南

量化基金从小白到大师 - 金融数据获取大全&#xff1a;从免费API到Tick级数据实战指南 各位&#xff0c;今天咱们要啃一块硬骨头——金融数据获取。别看这话题基础&#xff0c;它可是整个量化大厦的地基&#xff0c;地基不稳&#xff0c;再牛的策略都得塌房。我见过太多人&…

构建一个“会思考”的房地产数据获取脚本

—— 跨界思维&#xff1a;从认知自适应到房源信息监测 一、认知科学视角&#xff1a;什么是“会思考” 在心理学与认知科学中&#xff0c;所谓“会思考”&#xff0c;并不是指抽象的哲学推理&#xff0c;而是指个体能在复杂环境中不断调整行动策略。 比如&#xff0c;出行时如…

JavaScript的库简介

JavaScript拥有丰富的库生态系统,类似于Python的requests、numpy或C++的Boost。这些库分为两大类:前端库(如React、Vue)和后端/工具库(如Lodash、Axios)。以下是几个核心库的介绍与用法示例。 常用JavaScript库分类 前端UI库 React:Facebook开发的组件化库,用于构建用…

【无GGuF版本】如何在Colab下T4运行gpt-oss 20B

OpenAI发布了gpt-oss 120B和20B版本。这两个模型均采用Apache 2.0许可证。 特别说明的是&#xff0c;gpt-oss-20b专为低延迟及本地化/专业化场景设计&#xff08;210亿总参数&#xff0c;36亿活跃参数&#xff09;。 由于模型采用原生MXFP4量化训练&#xff0c;使得20B版本即…

LeetCode - LCR 179. 查找总价格为目标值的两个商品

题目 https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/submissions/660817798/ 思路 解法1是暴力解法&#xff0c;从第一个开始和后面的相加 暴力枚举慢就慢在&#xff0c;这个递增数组是排序好的数组&#xff0c;已经是有序的&#xff0c;暴力解法没有利用这…

UI自动化测试Python + Selenium + WinAppDriver( Windows 桌面应用)落地(一)环境搭建

最近公司要求为Windows 端桌面应用进行UI自动化测试,之前都是针对web端进行的UI自动化测试或者在早期使用的是QTP(Quick Test Professional)做PC端的UI自动化测试,而基于"经费"紧张,优先选择开源的工具,所以选择了selenium + WinAppDriver来实现。 首先,整理…

基于OpenCV的银行卡号识别系统:从原理到实现

引言在现代金融科技应用中&#xff0c;银行卡号的自动识别是一项重要技术。本文将详细介绍如何使用Python和OpenCV库构建一个完整的银行卡号识别系统。该系统能够从银行卡图像中提取卡号信息&#xff0c;并根据卡号首数字判断银行卡类型。技术栈​OpenCV: 计算机视觉库&#xf…

概率论第三讲——多维随机变量及其分布

文章目录考纲n维随机变量及其分布函数联合分布函数边缘分布函数二维离散型随机变量的概率分布、边缘分布和条件分布二维连续型随机变量的概率密度、边缘概率密度和条件概率密度常见的二位分布二维均匀分布二维正态分布随机变量的相互独立性概念相互独立的充要条件相互独立的性质…

纯软件实现电脑屏幕录制/存储到硬盘录像机/onvif模拟器/onvif虚拟监控/绿色版双击开箱即用

一、前言说明 在银行、超市、考试中心、工控系统、网课教学、居家办公等场景中&#xff0c;传统监控摄像头难以清晰录制电脑屏幕内容&#xff0c;导致关键操作无法有效追溯。为解决这一难题&#xff0c;我们推出了一套纯软件实现的电子屏幕监控方案&#xff0c;彻底取代依赖硬…

【算法--链表】86.分割链表--通俗讲解

一、题目是啥?一句话说清 给你一个链表和一个值 x,把链表分成两部分:所有小于 x 的节点都放在大于或等于 x 的节点之前,并且保持节点原来的相对顺序。 示例: 输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5](所有小于3的节点1、2、2都在大于等于3的节点4、3、5…

707, 设计链表, LinkedList, 单链表, Dummy Head, C++

目录 题意速览解题思路与设计要点C 代码实现&#xff08;单链表 虚拟头结点&#xff09;时间复杂度与空间复杂度常见坑位与边界用例对比&#xff1a;双链表如何优化单元测试样例&#xff08;可直接粘贴运行&#xff09;总结 题意速览 设计一个支持如下操作的链表&#xff1a…

NAS自建笔记服务leanote2

leanote2(GitHub - wiselike/leanote2: leanote2, 适用于NAS自建的笔记服务) 是一个开源的在线笔记应用程序&#xff0c;继承自原 leanote 项目。向原 leanote 的开发者表示深深的感谢与尊重&#xff0c;正是他们的辛勤付出奠定了这个优秀的笔记平台的基础。 但由于 leanote 项…

模型剪枝----ResNet18剪枝实战

剪枝 模型剪枝&#xff08;Model Pruning&#xff09; 是一种 模型压缩&#xff08;Model Compression&#xff09; 技术&#xff0c;主要思想是&#xff1a; 深度神经网络里有很多 冗余参数&#xff08;对预测结果贡献很小&#xff09;。 通过去掉这些冗余连接/通道/卷积核&am…

K8S-Pod(上)

Pod概念 Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 Pod是一组&#xff08;一个或多个&#xff09;容器&#xff1b;这些容器共享存储、网络、以及怎样运行这些容器的规约。Pod 中的内容总是并置&#xff08;colocated&#xff09;的并且一同调度&am…

Flink TaskManager日志时间与实际时间有偏差

Flink 启动一个任务后&#xff0c;发现TaskManager上日志时间与实际时间相差约 15 小时。 核心原因可能是&#xff1a; 1、 服务器&#xff08;或容器&#xff09;的系统时间配置错误2、 Flink 日志组件&#xff08;如 Logback/Log4j&#xff09;的时间配置未使用系统默认时区…

Webug3.0通关笔记18 中级进阶第06关 实战练习:DisCuz论坛SQL注入漏洞

目录 一、环境搭建 1、服务启动 2、源码解压 3、构造访问靶场URL 4、靶场安装 5、访问论坛首页 二、代码分析 1、源码分析 2、SQL注入分析 三、渗透实战 &#xff08;1&#xff09;判断是否有SQL注入风险 &#xff08;2&#xff09;查询账号密码 Discuz! 作为国内知…

SWEET:大语言模型的选择性水印

摘要背景与问题大语言模型出色的生成能力引发了伦理与法律层面的担忧&#xff0c;于是通过嵌入水印来检测机器生成文本的方法逐渐发展起来。但现有工作在代码生成任务中无法良好发挥作用&#xff0c;原因在于代码生成任务本身的特性&#xff08;代码有其特定的语法、逻辑结构&a…