數據結構——單鏈表list

前言:大家好😍,本文主要介紹數據結構——單鏈表

目錄

一、單鏈表

二、使用步驟

1.結構體定義

2.初始化

3.插入

3.1 頭插

3.2 尾插?

3.3 按位置插

?四.刪除

4.1頭刪

4.2 尾刪

4.3 按位置刪

4.4按值刪

五 統計有效值個數?

六 銷毀1

銷毀2

七 查找

八 打印


一、單鏈表

概念:單鏈表邏輯上相鄰,物理上不一定相鄰的鏈式存儲結構

所以一個結點不僅僅要保存自身的數據,還要保存自己下一個連接結點的地址

所以每一個結點需要倆個域:一個數據域,一個指針域

二、使用步驟

1.結構體定義

typedef int Elem_Type;
struct Node
{Elem_Type data;//數據域 存儲有效數據struct Node* next;//指針域  存下一個有效結點的地址
};typedef struct Node Node;
typedef struct Node* pNode;
struct Node:定義了一個 結構體 Node,它包含兩個成員:
Elem_Type data;: 數據域,用于存儲節點中的數據。由于 Elem_Type 被定義為 int,所以這里的 data 可以存儲一個整數。
struct Node* next;: 指針域,用于存儲指向下一個節點的地址。這樣,每個節點都可以通過 next 指針鏈接到下一個節點,形成鏈表。
typedef struct Node Node;:為結構體 Node 創建了一個別名 Node,這樣在代碼中可以直接 使用 Node 來聲明這種類型的變量
typedef struct Node* pNode;:定義了一個 pNode 類型,它實際上是 指向 Node 結構體的指針類型。這通常用于表示鏈表的頭指針或遍歷鏈表時的指針變量。

2.初始化

//初始化
void Init_List(struct Node* head)
{assert(head != NULL);if (NULL == head){exit(EXIT_FAILURE);}head->next = nullptr;
}
  • 參數 head 是指向 Node 結構體的指針。

  • 初始化鏈表:head->next = nullptr;head 節點的 next 指針設置為 nullptr,表示鏈表為空,即沒有其他節點。

3.插入

3.1 頭插

bool Insert_head(struct Node* head, Elem_Type val)
{assert(head != NULL);if (NULL == head){exit(EXIT_FAILURE);}Node* pnewnode=(Node*)malloc(sizeof(Node));if (NULL == pnewnode)exit(1);pnewnode->data = val;pnewnode->next = head->next;head->next = pnewnode;
}

? Node* pnewnode = (Node*)malloc(sizeof(Node));:使用 malloc 函數分配內存以創建一個新的 Node 結構體實例,并將其地址賦給指針 pnewnode

  1. pnewnode->data = val;:將傳入的數據 val 存儲在新節點的 data 成員中。

  2. pnewnode->next = head->next;:將新節點的 next 指針指向當前頭節點的下一個節點,即鏈表的第二個節點。

  3. head->next = pnewnode;:將頭節點的 next 指針指向新節點,這樣新節點就成為了鏈表的第一個節點。

3.2 尾插?

bool Insert_tail(struct Node* head, Elem_Type val)
{assert(head != NULL);if (NULL == head){exit(EXIT_FAILURE);}Node* pnewnode = (Node*)malloc(sizeof(Node));if (NULL == pnewnode)exit(1);pnewnode->data = val;Node* p = head;while (p->next != NULL){p = p->next;}//pnewnode->next = head->next;//head->next = pnewnode;pnewnode->next = p->next;p->next = pnewnode;return true;
} 

3.3 按位置插

bool Insert_pos(struct Node* head, Elem_Type val, int pos)
{assert(head != NULL);assert(pos >= 0 && pos <= Get_Length(head));Node* pnewnode = (Node*)malloc(sizeof(Node));if (NULL == head){exit(1);}pnewnode->data = val;Node* p = head;for (int i = 0; i < pos; i++)p = p->next;//pnewnode->next = head->next;//head->next = pnewnode;pnewnode->next = p->next;p->next = pnewnode;return true;
}

?

?四.刪除

4.1頭刪

bool Del_head(struct Node* head)
{assert(head != NULL);if (Is_Empty(head))return false;Node* p = head->next;head->next = p->next;free(p);p = NULL;return true;
}

4.2 尾刪

bool Del_tail(struct Node* head)
{assert(head != NULL);if (Is_Empty(head))return false;Node* p = head;while (p->next->next != NULL)p = p->next;Node* q = p->next;p->next = q->next;free(p);p = NULL;return true;
}

4.3 按位置刪

//8.按值刪(刪除值val出現的第一次的地方)
bool Del_val(struct Node* head, Elem_Type val)
{//0.assertassert(head != NULL);//0.5 判斷鏈表是否是空鏈表if (Is_Empty(head))return false;//1.調用Search函數,查找當前值val是否存在,用臨時指針q接收Node* q = Search(head, val);if (q == NULL){return false;}//2.申請臨時指針p,讓指針p停留在指針q指向節點的上一個節點Node* p = head;for ( ; p->next != q; p = p->next);//3.跨越指向p->next = q->next;//4.釋放free(q);q = NULL;return true;
}

4.4按值刪

bool Del_val(struct Node* head, Elem_Type val)
{//0.assertassert(head != NULL);//0.5 判斷鏈表是否是空鏈表if (Is_Empty(head))return false;//1.調用Search函數,查找當前值val是否存在,用臨時指針q接收Node* q = Search(head, val);if (q == NULL){return false;}//2.申請臨時指針p,讓指針p停留在指針q指向節點的上一個節點Node* p = head;for ( ; p->next != q; p = p->next);//3.跨越指向p->next = q->next;//4.釋放free(q);q = NULL;return true;
}

五 統計有效值個數?

int Get_Length(struct Node* head)
{int count = 0;for (Node* p = head->next; p != NULL; p = p->next){count++;}return count;
}

六 銷毀1

//11.銷毀1(需要輔助節點參與進來)
void Destroy1(struct Node* head)
{//只要不是空鏈表,則頭刪一次,直到鏈表為空/*while (!Is_Empty(head)){Del_head(head);}*/while (head->next != NULL){Node* q = head->next;head->next = q->next;free(q);q = NULL;}
}

銷毀2

//12.銷毀2(不需要輔助節點參與進來)
void Destroy2(struct Node* head)
{//0.assert  head  //1.申請指針p,讓其保存輔助節點的指針域Node* p = head->next;//p有可能為NULL, 有可能不空//2.申請指針q,先不給q賦值Node* q = NULL; //因為p有可能是NULL,所以不能現在直接把p->next給到q//3.反復通過p和q打配合,去銷毀后續節點while (p != NULL){q = p->next;free(p);p = q;}//4.節點全部銷毀完畢,別忘了把輔助節點的指針域置空head->next = NULL;//這一行代碼可以幫助,下一次啟用的時候,輔助節點不用初始化了}

七 查找

//9.查找(查找值val出現的第一次的地方)
struct Node* Search(struct Node* head, Elem_Type val)
{//0.assertfor (Node* p = head->next; p != NULL; p = p->next){if (p->data == val){return p;}}return NULL;
}

八 打印

//15.打印
void Show(struct Node* head)
{//assertfor (Node* p = head->next; p != NULL; p = p->next){printf("%d ", p->data);}printf("\n");}

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

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

相關文章

堆排序:力扣215.數組中的第K個大元素

一、問題描述 在一個整數數組 nums 中&#xff0c;需要找出第 k 個最大的元素。這里要注意&#xff0c;我們要找的是數組排序后的第 k 個最大元素&#xff0c;而不是第 k 個不同的元素。例如&#xff0c;對于數組 [3,2,1,5,6,4]&#xff0c;當 k 2 時&#xff0c;第 2 個最大…

C語言(25)

一.數據在內存中的存儲 1.整數在內存中的存儲 整數在內存中以二進制的形式儲存&#xff0c;分別為原碼&#xff0c;補碼&#xff0c;反碼 有符號的整數&#xff0c;在上述三種形式都有符號位和數值位兩個部分&#xff0c;符號位為0是正數&#xff0c;1是負數&#xff0c;最高…

鴻蒙開發-一多開發之媒體查詢功能

在HarmonyOS中&#xff0c;使用ArkTS語法實現響應式布局的媒體查詢是一個強大的功能&#xff0c;它允許開發者根據不同的設備特征&#xff08;如屏幕尺寸、屏幕方向等&#xff09;動態地調整UI布局和樣式。以下是一個使用媒體查詢實現響應式布局的實例&#xff1a; 1. 導入必要…

Docker運行hello-world鏡像失敗或超時:Unable to find image ‘hello-world:latest‘ locally Trying to pull reposi

Docker運行hello-world鏡像失敗或超時&#xff0c;報錯&#xff1a;Unable to find image ‘hello-world:latest’ locally Trying to pull repository docker.io/library/hello-world … /usr/bin/docker-current: missing signature key. See ‘/usr/bin/docker-current run …

MySQL連接較慢原因分析及解決措施

文章目錄 整體說明一、問題現象二、問題分析2.1、DNS反向解析問題2.2、網絡問題2.3、SSL/TLS協商問題2.4、自動補全的延遲 三、問題解決 摘要&#xff1a; MySQL連接較慢原因分析及解決措施 關鍵詞&#xff1a; MySQL、連接緩慢、客戶端、參數設置 整體說明 在使用MySQL的時候…

doris:安全概覽

oris 提供以下機制管理數據安全&#xff1a; 身份認證&#xff1a;Doris 支持用戶名/密碼與 LDAP 認證方式。 內置認證&#xff1a;Doris 內置了用戶名/密碼的認證方式&#xff0c;可以自定義密碼策略&#xff1b; LDAP 認證&#xff1a;Doris 可以通過 LDAP 服務集中管理用戶…

C++之文字修仙小游戲

1 效果 1.1 截圖 游戲運行&#xff1a; 存檔&#xff1a; 1.2 游玩警告 注意&#xff01;不要修改裝備概率&#xff0c;裝備的概率都是湊好的數字。如果想要速升&#xff0c;修改靈石數量 2 代碼 2.1 代碼大綱 1. 游戲框架與初始化 控制臺操作&#xff1a;通過 gotoxy() …

Docker安裝部署RabbitMQ

Docker安裝部署RabbitMQ 本文介紹了如何在Linux&#xff08;CentOS 7&#xff09;系統環境下的Docker上安裝部署RabbitMQ的詳細過程。 目錄 Docker安裝部署RabbitMQ一、環境準備1.Linux環境2.Docker3.停止并移除現有的 RabbitMQ 鏡像和容器 二、安裝部署RabbitMQ1.拉取 RabbitM…

【MyBatis Plus 邏輯刪除詳解】

文章目錄 MyBatis Plus 邏輯刪除詳解前言什么是邏輯刪除&#xff1f;MyBatis Plus 中的邏輯刪除1. 添加邏輯刪除字段2. 實體類的配置3. 配置 MyBatis Plus4. 使用邏輯刪除5. 查詢邏輯刪除的記錄 MyBatis Plus 邏輯刪除詳解 前言 MyBatis Plus 是一個強大的持久化框架&#xf…

線性代數(1)用 excel 計算雞兔同籠

線性代數excel計算雞兔同籠 案例&#xff1a;雞兔同籠問題的三種解法&#xff08;遞進式教學&#xff09;一、問題描述二、方程式解法&#xff08;基礎版&#xff09;步驟解析 三、線性代數解法&#xff08;進階版&#xff09;1. 方程組轉化為矩陣形式2. 矩陣求解&#xff08;逆…

Flask中使用WTForms處理表單驗證

在 Flask 中&#xff0c;WTForms 是一個用于 處理表單驗證 的庫&#xff0c;可以與 Flask 結合&#xff0c;提供表單驗證、數據清理、錯誤提示等功能。 1. 安裝 Flask-WTF 首先安裝 Flask-WTF&#xff1a; pip install Flask-WTFFlask-WTF 是 WTForms 的 Flask 擴展&#xff…

24.策略模式實現日志

日志的介紹 計算機中的日志是記錄系統和軟件運行中發送事件的文件&#xff0c;主要作用是監控運行狀態、記錄異常信息&#xff0c;幫助快速定位問題并支持程序員進行問題修復。它是系統維護、故障排查和安全管理的重要工具。 日志格式以下幾個指標是必須得有的&#xff1a; ?…

【網絡】簡單的 Web 服務器架構解析,包含多個服務和反向代理的配置,及非反向代理配置

這張圖片描述了一個簡單的 Web 服務器架構&#xff0c;包含多個服務和反向代理的配置。以下是對每個部分的詳細解釋&#xff0c;幫助你理解其中的技術內容&#xff1a; 1. Web Server: ifn666.com 這是你的主域名&#xff08;ifn666.com&#xff09;&#xff0c;所有服務都通過…

???????大語言模型安全風險分析及相關解決方案

大語言模型的安全風險可以從多個維度進行分類。 從輸入輸出的角度來看,存在提示注入、不安全輸出處理、惡意內容生成和幻覺錯誤等風險; 從數據層面來看,訓練數據中毒、敏感信息泄露和模型反演攻擊是主要威脅; 模型自身則面臨拒絕服務和盜竊的風險; 供應鏈和插件的不安全引…

貪心算法——c#

貪心算法通俗解釋 貪心算法是一種"每一步都選擇當前最優解"的算法策略。它不關心全局是否最優&#xff0c;而是通過局部最優的累積來逼近最終解。優點是簡單高效&#xff0c;缺點是可能無法得到全局最優解。 一句話秒懂 自動售貨機找零錢&#xff1a;用最少數量的…

STM32 - 在機器人領域,LL庫相比HAL優勢明顯

在機器人控制器、電機控制器等領域的開發&#xff0c;需要高實時性、精細化控制或者對代碼執行效率、占用空間有較高要求。所以&#xff0c;大家常用的HAL庫明顯不符合要求。再加上&#xff0c;我們學習一門技術&#xff0c;一定要學會掌握底層的原理。MCU開發的底層就是寄存器…

【計算機網絡】2物理層

物理層任務:實現相鄰節點之間比特(或)的傳輸 1.通信基礎 1.1.基本概念 1.1.1.信源,信宿,信道,數據,信號 數據通信系統主要劃分為信源、信道、信宿三部分。 信源:產生和發送數據的源頭。 信宿:接收數據的終點。 信道:信號的傳輸介質。 數據和信號都有模擬或數字…

deepseek GRPO算法保姆級講解(數學原理+源碼解析+案例實戰)

文章目錄 什么是GRPO群組形成(Group Formation):讓大模型創建多種解決方案偏好學習(Preference Learning)&#xff1a;讓大模型理解何為好的解答組內相對優勢 優化(optimization): 讓大模型從經驗中學習(learning from experience)目標函數 GRPO算法的偽碼表示GRPO算法的局限與…

使用 WebP 優化 GPU 紋理占用

WebP 格式相比 JPEG / PNG 文件更小&#xff0c;可以 減少 GPU 紋理內存占用&#xff0c;提高 WebGL / Three.js / 3D 渲染 的性能。 &#x1f539; 為什么 WebP 能減少 GPU 內存占用&#xff1f; 文件更小 → WebP 比 JPG/PNG 壓縮率更高&#xff0c;減少 紋理上傳 帶寬&…

Google Cloud Run 如何實現無服務器(Serverless)部署?

DDoS&#xff08;分布式拒絕服務&#xff09;攻擊是黑客常用的一種手段&#xff0c;通過大量惡意流量沖擊服務器&#xff0c;導致網站無法訪問。針對這種威脅&#xff0c;Cloudflare提供了一整套防護措施&#xff0c;包括流量過濾、速率限制、防火墻規則等&#xff0c;使網站能…