數據結構-2.單向鏈表的實現

来源:https://www.cnblogs.com/ffff5/p/18343309
-Advertisement-
Play Games

節點結構體設計 struct LinkNode { // 數據域 void* data; // 指針域 struct LinkNode * next; }; data:一個 void* 類型的指針,指向節點存儲的數據。使用 void* 是為了鏈表能夠存儲不同類型的數據。 next:一個指向下一個 L ...


節點結構體設計

struct LinkNode
{
	// 數據域
	void* data;
	// 指針域
	struct LinkNode * next;
};
  • data:一個 void* 類型的指針,指向節點存儲的數據。使用 void* 是為了鏈表能夠存儲不同類型的數據。
  • next:一個指向下一個 LinkNode 結構體的指針,形成鏈表的鏈接。

鏈表結構體設計

struct LList
{
	//頭節點
	struct LinkNode pHeader;
	//鏈表長度
	int m_size;
};
  • pHeader:鏈表的頭節點。雖然 pHeader 本身也是 LinkNode 類型,但它可以作為鏈表的起始節點,其 next 指針指向第一個實際的數據節點。
  • m_size:一個整數,表示鏈表中節點的數量。

初始化鏈表

LinkList init_LinkList()
{
	struct LList* myList = malloc(sizeof(struct LList));
	
	if (myList == NULL)
	{
		return NULL;
	}

	myList->pHeader.data = NULL;
	myList->pHeader.next = NULL;
	myList->m_size = 0;

	return myList;
}
  • 使用 malloc 分配 struct LList 的記憶體。
  • 初始化頭節點的 data 指針為 NULLnext 指針也為 NULL
  • 設置鏈表長度 m_size0

插入鏈表

void insert_LinkList(LinkList list, int pos, void* data)
{
	if (list == NULL) 
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}
	// 將list還原成struct LList數據類型
	struct LList * myList = list;

	if (pos <0 || pos > myList->m_size)
	{
		//位置無效 強制尾插
		pos = myList->m_size;
	}
	//找到插入節點的前驅
	struct LinkNode * pCurrent = &myList->pHeader;
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->next;
	}
	//創建新節點
	struct LinkNode* newNode = malloc(sizeof(struct LinkNode));
	newNode->data = data;
	newNode->next = NULL;

	//建立節點關係

	newNode->next = pCurrent->next;
	pCurrent->next = newNode;

	//更新鏈表長度
	myList->m_size++;
}
  • 檢查 listdata 是否為空,若為空則返回。
  • 如果位置 pos 無效(負數或超出鏈表當前大小),將位置設置為鏈表末尾。
  • 通過遍歷找到插入位置的前驅節點 pCurrent
  • 創建新節點並插入鏈表中。
  • 更新鏈表長度 m_size

遍歷鏈表

void foreach_linkList(LinkList list,void(*myForeach)(void *))
{
	if (list == NULL)
	{
		return;
	}

	struct LList* mylist = list;

	struct LinkNode* pCurrent = mylist->pHeader.next;
	for (int i = 0; i < mylist->m_size; i++)
	{
		myForeach(pCurrent->data);
		pCurrent = pCurrent->next;
	}
}
  • 檢查 list 是否為空,若為空則返回。
  • 使用 pCurrent 遍歷鏈表,從頭節點的下一個節點開始。
  • 對每個節點的數據調用 myForeach,然後移動到下一個節點。

本文來自博客園,作者:ffff5,轉載請註明原文鏈接:https://www.cnblogs.com/ffff5/p/18343309


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2018年6月,大三暑假 那一天,我投遞了家裡附近的一家公司有響應了,他線上問我什麼時候可以去面試,我說什麼時候都行。 HR:“要不你下午來吧?” 我:“行,我家裡離面試地點不遠” 我去面試之前,現在都會提前看看這家公司是做什麼業務的,先瞭解下。 因為在之前的面試已經吃過類似的虧了,HR問我為什麼要 ...
  • PART 1: while迴圈 雙重for迴圈 1. 迴圈結構(while迴圈語句) 基本格式 while(判斷條件語句) { 迴圈體語句; } 擴展格式 初始化語句; while(判斷條件語句) { 迴圈體語句; 控制條件語句; } 2. 迴圈結構(for迴圈和while迴圈的區別) for迴圈和 ...
  • 寫在前面 前面給了關於java方法和數組的十題編程題,如果你能有思路很快速地完成它,說明你這部分的基礎知識很好,接下來就來看看後面的面向對象的相關知識吧! 面向對象 概述:不斷地創建對象,使用對象,指揮對象做事情的思想。 類和對象的關係: 類: 是java的基本單位,主要使用用於描述現實生活的事物。 ...
  • # 字元串長度 - strlen() 描述 C 庫函數 size_t strlen(const char *str) 計算字元串 str 的長度,直到空結束字元,但不包括空結束字元。 聲明 下麵是 strlen() 函數的聲明。 size_t strlen(const char *str) 參數 s ...
  • P1223 排隊接水 題目描述 有 \(n\) 個人在一個水龍頭前排隊接水,假如每個人接水的時間為 \(T_i\),請編程找出這 \(n\) 個人排隊的一種順序,使得 \(n\) 個人的平均等待時間最小。 輸入格式 第一行為一個整數 \(n\)。 第二行 \(n\) 個整數,第 \(i\) 個整數 ...
  • 將Word文檔以圖片形式導出,既能方便信息的分享,也能保護數據安全,避免被二次編輯。文本將介紹如何使用 Spire.Doc for Python 庫在Python程式中實現Word到圖片的批量轉換。 Python 將Word轉換為JPG、JPEG、PNG、BMP等圖片格式 Python 將Word文 ...
  • 安裝Nginx並配置訪問 安裝PHP並輸出腳本結果 配置typecho Nginx安裝並驗證 apt install nginx systemctl start nginx 正常情況應該可以看到Nginx的歡迎頁面了,如果看不到就是防火牆的問題,設置下防火牆放通即可。 安裝PHP並使用Nginx代理 ...
  • 堆(Heap)的基本概念 堆是一種完全二叉樹(Complete Binary Tree),其性質使得堆可以高效地支持以下操作: 插入(Insert):將一個新元素加入到堆中。 刪除最大/最小元素(Delete Max/Min):移除並返回堆中的最大(大根堆)或最小(小根堆)元素。 獲取最大/最小元素 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...