數據結構入門:鏈表

鏈式存儲結構通過使用指針將分散的存儲單元鏈接起來,每個元素由數據部分和指針部分組成。

鏈式表的定義和特點

鏈式表的每個節點包含兩個部分:

  1. 數據域:存儲數據元素。
  2. 指針域:存儲下一個節點的內存地址。

鏈式表的頭指針指向第一個節點,最后一個節點的指針域為NULL,表示鏈表結束。鏈式表的特點是插入和刪除操作比較方便,不需要移動大量元素,但隨機訪問效率較低。

示例代碼:鏈式表的實現及取值操作(C語言)

#include <stdio.h>
#include <stdlib.h>// 定義鏈式表節點結構
typedef struct Node {int data;             // 數據域struct Node *next;    // 指針域,指向下一個節點
} Node;// 創建新節點
Node* create_node(int value) {Node *new_node = (Node*)malloc(sizeof(Node));  // 分配內存if (new_node == NULL) {printf("內存分配失敗\n");exit(1);  // 分配失敗則退出程序}new_node->data = value;  // 設置節點數據new_node->next = NULL;   // 初始化指針為NULLreturn new_node;  // 返回新節點的指針
}// 在鏈表尾部插入節點
void append(Node **head, int value) {Node *new_node = create_node(value);  // 創建新節點if (*head == NULL) {  // 如果鏈表為空*head = new_node;  // 新節點成為頭節點return;}Node *current = *head;  // 從頭節點開始遍歷while (current->next != NULL) {  // 找到鏈表的最后一個節點current = current->next;}current->next = new_node;  // 將新節點鏈接到鏈表末尾
}// 獲取指定位置的元素值
int get_value(Node *head, int pos, int *value) {if (head == NULL) {  // 如果鏈表為空printf("鏈表為空\n");return 0;  // 返回0表示失敗}Node *current = head;int index = 0;while (current != NULL) {  // 遍歷鏈表if (index == pos) {  // 找到指定位置*value = current->data;  // 獲取節點數據return 1;  // 返回1表示成功}current = current->next;  // 移動到下一個節點index++;}printf("位置超出范圍\n");  // 如果遍歷完鏈表也沒找到指定位置return 0;  // 返回0表示失敗
}// 打印鏈表
void print_list(Node *head) {Node *current = head;printf("鏈表內容:");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}// 釋放鏈表內存
void free_list(Node *head) {Node *current = head;while (current != NULL) {Node *temp = current;current = current->next;free(temp);}
}int main() {Node *head = NULL;  // 初始化鏈表為空append(&head, 10);  // 向鏈表尾部添加元素10append(&head, 20);  // 向鏈表尾部添加元素20append(&head, 30);  // 向鏈表尾部添加元素30print_list(head);  // 打印鏈表內容int value;if (get_value(head, 1, &value)) {  // 獲取索引1的元素值printf("索引1的元素值:%d\n", value);}free_list(head);  // 釋放鏈表內存return 0;
}

代碼各模塊注釋

定義鏈式表節點結構

typedef struct Node {int data;             // 數據域struct Node *next;    // 指針域,指向下一個節點
} Node;
  • 定義了一個名為 Node 的結構體類型,表示鏈式表的節點。
  • int data; 用于存儲節點的數據。
  • struct Node *next; 是一個指向 Node 類型的指針,用于存儲下一個節點的內存地址。

創建新節點

Node* create_node(int value) {Node *new_node = (Node*)malloc(sizeof(Node));  // 分配內存if (new_node == NULL) {printf("內存分配失敗\n");exit(1);  // 分配失敗則退出程序}new_node->data = value;  // 設置節點數據new_node->next = NULL;   // 初始化指針為NULLreturn new_node;  // 返回新節點的指針
}
  • Node *new_node = (Node*)malloc(sizeof(Node)); 使用 malloc 函數動態分配內存,為新節點分配大小為 sizeof(Node) 的內存空間。
  • if (new_node == NULL) { ... } 檢查內存分配是否成功。如果失敗,打印錯誤信息并退出程序。
  • new_node->data = value; 將傳入的 value 值賦給新節點的數據域。
  • new_node->next = NULL; 將新節點的指針域初始化為 NULL,表示該節點目前沒有指向下一個節點。
  • return new_node; 返回新創建的節點的指針。

在鏈表尾部插入節點

void append(Node **head, int value) {Node *new_node = create_node(value);  // 創建新節點if (*head == NULL) {  // 如果鏈表為空*head = new_node;  // 新節點成為頭節點return;}Node *current = *head;  // 從頭節點開始遍歷while (current->next != NULL) {  // 找到鏈表的最后一個節點current = current->next;}current->next = new_node;  // 將新節點鏈接到鏈表末尾
}
  • Node *new_node = create_node(value); 調用 create_node 函數創建一個新節點。
  • if (*head == NULL) { ... } 檢查鏈表是否為空。如果鏈表為空(頭指針為 NULL),將新節點設置為頭節點。
  • Node *current = *head; 定義一個指針 current,初始化為鏈表的頭節點,用于遍歷鏈表。
  • while (current->next != NULL) { ... } 遍歷鏈表,直到找到最后一個節點(其 next 指針為 NULL)。
  • current->next = new_node; 將最后一個節點的 next 指針指向新節點,將新節點添加到鏈表末尾。

獲取指定位置的元素值

int get_value(Node *head, int pos, int *value) {if (head == NULL) {  // 如果鏈表為空printf("鏈表為空\n");return 0;  // 返回0表示失敗}Node *current = head;int index = 0;while (current != NULL) {  // 遍歷鏈表if (index == pos) {  // 找到指定位置*value = current->data;  // 獲取節點數據return 1;  // 返回1表示成功}current = current->next;  // 移動到下一個節點index++;}printf("位置超出范圍\n");  // 如果遍歷完鏈表也沒找到指定位置return 0;  // 返回0表示失敗
}
  • if (head == NULL) { ... } 檢查鏈表是否為空。如果為空,打印錯誤信息并返回0表示失敗。
  • Node *current = head; 定義一個指針 current,初始化為鏈表的頭節點,用于遍歷鏈表。
  • int index = 0; 用于記錄當前遍歷到的節點位置。
  • while (current != NULL) { ... } 遍歷鏈表,直到 currentNULL(鏈表結束)。
  • if (index == pos) { ... } 檢查當前節點的位置是否為目標位置 pos。如果是,將當前節點的數據賦值給 *value,并返回1表示成功。
  • current = current->next; 移動 current 指針到下一個節點。
  • index++; 增加位置計數器。
  • 如果遍歷完整個鏈表都沒有找到目標位置,打印錯誤信息并返回0表示失敗。

打印鏈表

void print_list(Node *head) {Node *current = head;printf("鏈表內容:");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}
  • Node *current = head; 定義一個指針 current,初始化為鏈表的頭節點,用于遍歷鏈表。
  • printf("鏈表內容:"); 打印提示信息。
  • while (current != NULL) { ... } 遍歷鏈表,直到 currentNULL
  • printf("%d ", current->data); 打印當前節點的數據。
  • current = current->next; 移動 current 指針到下一個節點。
  • printf("\n"); 打印換行符,換行。

釋放鏈表內存

void free_list(Node *head) {Node *current = head;while (current != NULL) {Node *temp = current;current = current->next;free(temp);}
}
  • Node *current = head; 定義一個指針 current,初始化為鏈表的頭節點,用于遍歷鏈表。
  • while (current != NULL) { ... } 遍歷鏈表,直到 currentNULL
  • Node *temp = current; 保存當前節點的指針到 temp
  • current = current->next; 移動 current 指針到下一個節點。
  • free(temp); 釋放 temp 指向的節點內存。

主函數

int main() {Node *head = NULL;  // 初始化鏈表為空append(&head, 10);  // 向鏈表尾部添加元素10append(&head, 20);  // 向鏈表尾部添加元素20append(&head, 30);  // 向鏈表尾部添加元素30print_list(head);  // 打印鏈表內容int value;if (get_value(head, 1, &value)) {  // 獲取索引1的元素值printf("索引1的元素值:%d\n", value);}free_list(head);  // 釋放鏈表內存return 0;
}
  • Node *head = NULL; 聲明一個指向 Node 的指針 head,并初始化為 NULL,表示鏈表為空。
  • append(&head, 10); 調用 append 函數向鏈表尾部添加元素10。
  • append(&head, 20); 向鏈表尾部添加元素20。
  • append(&head, 30); 向鏈表尾部添加元素30。
  • print_list(head); 調用 print_list 函數打印鏈表的內容。
  • int value; 聲明一個整型變量 value,用于存儲獲取的元素值。
  • if (get_value(head, 1, &value)) { ... } 調用 get_value 函數嘗試獲取索引1處的元素值。如果成功,打印該值。
  • free_list(head); 調用 free_list 函數釋放鏈表占用的內存。
  • return 0; 返回0,表示程序正常結束。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89752.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

達夢數據庫DMHS介紹及安裝部署

目錄 概述 安裝規劃 安裝步驟 上傳安裝包 更改權限 執行安裝命令 源端和目的端處理 開啟歸檔 開啟邏輯日志 創建測試表 生成測試數據 配置目的端文件 配置源端文件 啟動目的端 啟動源端 裝載數據 源端開啟cpt模塊 數據同步驗證 隨機數據驗證 概述 達夢數據實時同…

BERT 模型詳解:結構、原理解析

前言 在自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;已經成為理解類任務的標配模型。相比 GPT 更擅長文本生成&#xff0c;BERT 則在語言理解任務上展現出卓越的能力。本文…

一、bfv_basics

目錄 一、加密參數 EncryptionParameters類1. 三個重要的參數2. 參數的作用3. 同態加密方案4. 多項式模數的度 poly_modulus_degree (n)5. 密文模數 coeff_modulus (q)6. 明文模數 plain_modulus (t&#xff0c;這是 BFV 方案才有的&#xff0c;CKKS 沒有) 二、上下文 SEALCont…

AI大模型LangChain架構介紹及其在環保領域的應用

1.LangChain 概述與架構 LangChain 是一個面向大型語言模型&#xff08;LLM&#xff09;應用的開發框架&#xff0c;其核心理念是將復雜的基于語言的 AI 系統拆分為可復用的模塊&#xff0c;簡化 LLM 與數據源的集成。LangChain 官方文檔將其定義為“一個用于開發以 LLM 為驅動…

centos 7 安裝NVIDIA Container Toolkit

要在 CentOS 7 上離線安裝 NVIDIA Container Toolkit&#xff0c;需確保已安裝 NVIDIA 驅動和 Docker 環境。以下是完整步驟及注意事項&#xff1a; ?? 一、環境準備 驗證 NVIDIA 驅動 運行 nvidia-smi 確認驅動已正確安裝&#xff0c;若未安裝需先離線安裝驅動&#xff1a; …

C++學習之STL學習:list的使用

本篇我們將學習STL中list的使用 目錄 list的初始和官方文檔 list的官方文檔 list的構造與析構 構造函數 析構函數 運算符重載 迭代器 正向迭代器 反向迭代器 const正向迭代器 const反向迭代器 容量 empty size max_size 訪問 訪問第一個元素?編輯 訪問最后一個元素 修…

USB服務器在證券公司虛擬化進程中的應用分析

在證券公司全面擁抱虛擬化、云化的技術浪潮中&#xff0c;一個看似微小卻至關重要的環節曾長期阻礙進程&#xff1a;分散在各業務環節的銀行前置機U盾、各種系統認證Ukey等物理USB安全設備的管理難題。這些承載著資金劃撥、交易認證核心權限的“小鑰匙”&#xff0c;在傳統模式…

網閘內部架構設計:分層與微服務的生死博弈

引言 “物理隔離是網閘的命脈,而架構設計決定其生死。” 在數據安全領域,網閘(安全隔離與信息交換系統)是守護核心網絡的鋼鐵長城。但當開發者試圖將現代架構思想(如微服務)引入其內部時,卻可能引發災難性沖突。本文通過深度拆解分層架構與微服務在網閘中的適用性,揭示…

通過MaaS平臺免費使用大模型API

文章目錄 一、引言&#xff1a;MaaS平臺——免費使用大模型API的新選擇二、模型代碼與限制術語詳解&#xff08;一&#xff09;模型代碼含義解析&#xff08;二&#xff09;模型使用限制術語縮寫詳解 三、5個MaaS平臺詳細介紹&#xff08;一&#xff09;OpenRouter&#xff08;…

進程代理單窗口單IP技術:原理、應用與實現

“在當今數字化時代&#xff0c;網絡隱私保護與多賬號管理需求日益增長。單窗口單IP技術通過為每個進程分配獨立網絡身份&#xff0c;巧妙地解決了多賬號管理中的IP關聯難題。從游戲多開防封到數據采集優化&#xff0c;從隱私保護到測試驗證&#xff0c;這項技術的應用場景不斷…

Java教程——線程池和future

Future 詳解 1. Future 是什么? Future 是 Java 中的一個接口(java.util.concurrent.Future),代表異步計算的未來結果。它允許你: 提交任務后立即返回在需要時檢查任務是否完成獲取任務結果(完成后)取消任務2. 怎么使用 Future? 通過線程池提交任務: ExecutorServ…

洛谷P1351 [NOIP 2014 提高組] 聯合權值

洛谷P1351 [NOIP 2014 提高組] 聯合權值 洛谷題目傳送門 題目背景 NOIP2014 提高組 D1T2 題目描述 無向連通圖 G G G 有 n n n 個點&#xff0c; n ? 1 n-1 n?1 條邊。點從 1 1 1 到 n n n 依次編號,編號為 i i i 的點的權值為 W i W_i Wi?&#xff0c;每條邊的長…

Apache Doris Profile 深度解析:從獲取到分析,解鎖查詢性能優化密碼

在 Doris 數據庫中&#xff0c;高效的查詢性能是數據處理的關鍵。當我們遇到查詢緩慢、資源消耗異常等問題時&#xff0c;Doris 提供的 Profile 工具就如同一位 “性能偵探”&#xff0c;能幫我們抽絲剝繭&#xff0c;找到問題根源。今天&#xff0c;我們就來深入聊聊如何分析 …

系統架構師

硬件&#xff1a; 運算器&#xff1a;1&#xff09;算術運算 加減乘除 2&#xff09;邏輯運算并進行邏輯測試&#xff1a;與或非 組件功能&#xff1a;算術邏輯單元ALU :處理數據 實現對數據的算術運算和邏輯運算 累加寄存器AC 通用寄存器&#xff0c;alu提供工作區 暫存運算結…

Unity HDRP + Azure IoT 工業設備監控系統實例

Unity HDRP Azure IoT 工業設備監控系統實例 下面是一個完整的工業設備監控解決方案&#xff0c;結合Unity HDRP&#xff08;高清渲染管線&#xff09;的高質量可視化與Azure IoT的實時數據處理能力。 系統架構 #mermaid-svg-XJnD6acrBbtbqYHW {font-family:"trebuchet…

(超詳細)數據庫項目初體驗:使用C語言連接數據庫完成短地址服務(本地運行版)

數據庫項目初體驗&#xff1a;使用C語言連接數據庫完成短地址服務&#xff08;本地運行版&#xff09; 前言&#xff1a;初學者的思考 作為一個剛初學數據庫的小白并且在之前我的博客中我有嘗試使用C語言寫過一個短地址服務&#xff0c;但是使用C語言編寫的短地址服務只有短記…

mysql基礎(一)快速上手篇

連接mysql 使用命令行窗口連接mysql數據庫 語法&#xff1a;mysql –h主機名 –u用戶名 –p密碼 說明&#xff1a;-h參數指定數據庫ip&#xff0c;本地服務器可以用localhost&#xff0c;-u參數指定用戶名&#xff0c;-p參數指定用戶密碼。 注意&#xff1a;-p和密碼值之間…

IntelliJ IDEA 2025- 下載安裝教程圖文版詳細教程(附激活碼)

目錄 寫在前面 一、介紹 二、下載 三、安裝 &#x1f3c1; 寫在最后 寫在前面 > &#x1f680; 初學 Java&#xff1f;或者剛開始寫項目&#xff0c;不知道該選哪個 IDE&#xff1f; 本篇教程手把手教你安裝 IntelliJ IDEA —— JetBrains 出品的頂級 Java 開發環境&a…

數學經濟專業大學四年規劃

數學經濟專業結合了數學的邏輯嚴謹性和經濟學的現實應用性&#xff0c;為學生提供了強大的數理分析能力和經濟洞察力。該專業畢業生在金融科技、量化投資、商業分析等領域具有顯著優勢&#xff0c;尤其在數字經濟時代&#xff0c;這類復合型人才的需求量持續增長。一、數學經濟…

局域網打印機共享怎么設置?如何配置內網本地網絡打印機給異地電腦遠程連接使用打印?

打印機共享怎么設置&#xff1f;如何設置本地內網的網絡打印機共享給其他網絡下電腦連接打印&#xff1f;打印機設置使用以及異地使用打印都是大家比較關注的問題&#xff0c;下面詳細教程中分二步&#xff0c;先講局域網內的打印機共享&#xff0c;再進一步介紹內網打印機地址…