數據結構——單向循環鏈表代碼(補充)

在此前的文章中(鏈接如下),只有單向鏈表的代碼,接下來我們來寫單向循環鏈表,并用其實現一個簡單的學生信息鏈表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
英文地址,請注明出處:http://en.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…