国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

初階數據結構:鏈表

這篇具有很好參考價值的文章主要介紹了初階數據結構:鏈表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 引子:什么是鏈表

經過學習與練習,已經掌握了順序表的相關知識并且能夠自我實現。在這一過程中,通過對其結構的實現,發(fā)現順序表的尾部插入刪除數據效率很高,可是,在頭部與隨機插入的場景下效率低下而且存在擴容消耗等一些問題。而有這樣一種數據結構可以很好的解決順序表存在的這些問題,將瑣碎的系統(tǒng)空間充分利用,任意位置的插入刪除效率都很高。此種數據結構稱為鏈表,接下來進行對其的學習。

2. 簡單數據結構:鏈表

2.1 鏈表簡介與功能分析

簡介:

鏈表,正如其名,存儲其中的數據在物理上是離散的,各個數據間使用一條 “鏈子” 串聯而成(記錄下一元素地址的指針)。鏈表的具體結構存在數種,以是否帶頭是否能雙向訪問,是否循環(huán),這三個特點被簡單分為六種,下面,我們先進行其中一種,帶頭單向不循環(huán)鏈表進行學習。

單向帶頭不循環(huán)鏈表結構圖:
初階數據結構:鏈表,數據結構,鏈表

功能分析模塊:

數據存儲方式:

  1. 動態(tài)開辟malloc的一塊塊小內存塊。
  2. 存儲信息為數據值,與記錄下一個結點的指針
    以上兩點創(chuàng)建的結點結構體

數據管理方式:

  1. 增(頭插,尾插,隨機插入):push_front,push_back,insert,insertafter
  2. 刪(頭刪,尾刪,隨機刪除):pop_front,pop_back,erase,eraseafter
  3. 改(指定數據的修改):modify
  4. 查(指定數據的查詢):find

2.2 單鏈表的實現

2.2.1 單鏈表:存儲數據的結構體

鏈表結點的構建:

typedef int ListDataType;

typedef struct ListNode
{
	ListDataType val;
	//聲明類型的過程中不能直接使用typedef后的名字
	struct ListNode* next;
}ListNode;

2.2.2 單鏈表:結點創(chuàng)建與鏈表數據清理

結點創(chuàng)建:

初階數據結構:鏈表,數據結構,鏈表

ListNode* BuyNewNode(ListDataType val)
{
	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
	if (newnode == NULL)
	{
		perror("malloc failed");
		exit(-1);
	}

	newnode->val = val;
	newnode->next = NULL;

	return newnode;
}

鏈表銷毀:

過程演示:

初階數據結構:鏈表,數據結構,鏈表

//鏈表銷毀
void ListDestroy(ListNode** PPhead)
{
	assert(PPhead);
	ListNode* Phead = *PPhead;

	ListNode* cout = Phead;

	if (Phead != NULL)
	{
		while (Phead->next != NULL)
		{
			Phead = Phead->next;
			free(cout);
			cout = Phead;
		}

		free(Phead);

		*PPhead = NULL;
	}
}

注:Phead為list的一份值拷貝,因此要想能夠改變list(鏈表頭)的值,傳參是我們應該采用二重指針傳址傳參。

初階數據結構:鏈表,數據結構,鏈表

2.2.2 單鏈表插入數據與刪除

頭插,頭刪:

頭插過程演示:

鏈表為空時頭插:
初階數據結構:鏈表,數據結構,鏈表

鏈表不為空時頭插:
初階數據結構:鏈表,數據結構,鏈表

頭刪過程演示:

初階數據結構:鏈表,數據結構,鏈表

//頭插
void ListPush_Front(ListNode** PPhead, ListDataType val)
{
	assert(PPhead);
	ListNode* Phead = *PPhead;

	ListNode* newnode = BuyNewNode(val);

	if (Phead == NULL)
	{
		*PPhead = newnode;
	}
	else
	{
		ListNode* next = Phead;
		newnode->next = Phead;
		*PPhead = newnode;
	}
}


//頭刪
void ListPop_Front(ListNode** PPhead)
{
	assert(PPhead);
	ListNode* Phead = *PPhead;
	assert(Phead);

	ListNode* next = Phead->next;
	
	free(Phead);
	*PPhead = next;
}

尾插,尾刪:

//尾插
void ListPush_Back(ListNode** PPhead, ListDataType val)
{
	assert(PPhead);
	ListNode* Phead = *PPhead;
	
	ListNode* end_node = Phead;
	while (end_node != NULL && end_node->next != NULL)
	{
		end_node = end_node->next;
	}

	ListNode* newnode = BuyNewNode(val);
	if (end_node == NULL)
	{
		*PPhead = newnode;
	}
	else//end_node->next == NULL
	{
		end_node->next = newnode;
	}

}

//尾刪
void ListPop_Back(ListNode** PPhead)
{
	assert(PPhead);
	ListNode* Phead = *PPhead;
	assert(Phead);

	ListNode* end_node = Phead;
	//特殊情況
	if (end_node->next == NULL)
	{
		free(end_node);
		*PPhead = NULL;
	}
	else//end_node->next != NULL
	{
		//邏輯短路
		while (end_node->next->next != NULL)
		{
			end_node = end_node->next;
		}

		free(end_node->next);
		end_node->next = NULL;
	}
}

隨機插入與刪除:

在指定結點(pos)之前插入:

void ListInsert(ListNode** PPhead, ListNode* pos, ListDataType val)
{
	//不考慮結點不存在的情況
	//與ListFind模塊配合使用
	assert(PPhead);
	ListNode* Phead = *PPhead;
	assert(Phead);
	assert(pos);
	
	//復用頭插
	if (pos == Phead)
	{
		ListPush_Front(PPhead, val);
	}
	else
	{
		ListNode* search = Phead;
		//尋找pos結點
		while (search->next != pos)
		{
			search = search->next;
		}
		
		//插入
		ListNode* newnode = BuyNewNode(val);
		ListNode* next = search->next;
		
		search->next = newnode;
		newnode->next = next;
	}
}

在指定結點(pos)之后插入:

void ListInsertAfter(ListNode* pos, ListDataType val)
{
	//結點不能為NULL
	assert(pos);

	ListNode* next = pos->next;

	ListNode* newnode = BuyNewNode(val);

	pos->next = newnode;
	newnode->next = next;
}

刪除指定結點(pos)之后的結點:

void ListEraseAfter(ListNode* pos)
{
	assert(pos);
	assert(pos->next);

	ListNode* next = pos->next;
	pos->next = pos->next->next;

	free(next);

	next = NULL;

	pos->next = next;
}

刪除指定結點(pos):

void ListErase(ListNode** PPhead, ListNode* pos)
{
	assert(PPhead);
	ListNode* Phead = *PPhead;
	assert(Phead);
	assert(pos);
	
	//頭刪
	if (pos == Phead)
	{
		ListPop_Front(PPhead);
	}
	else
	{
		ListNode* search = Phead;
		while (search->next != pos)
		{
			search = search->next;
		}

		ListNode* next = search->next->next;

		free(search->next);
		search->next = next;
	}
}

2.2.3 單鏈表查詢與修改

元素查詢:

ListNode* ListFind(ListNode** PPhead, ListDataType val)
{
	assert(PPhead);
	ListNode* Phead = *PPhead;
	assert(Phead);

	ListNode* search = Phead;
	while (search != NULL && search->val != val)
	{
		search = search->next;
	}

	return search;
}

數據修改:

void ListModify(ListNode* Node, ListDataType val)
{
	assert(Node);

	Node->val = val;
}

鏈表元素打?。?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-807525.html

void ListPrint(ListNode* Phead)
{
	while (Phead != NULL)
	{
		printf("%d->", Phead->val);
		Phead = Phead->next;
	}
	printf("NULL\n");
}

到了這里,關于初階數據結構:鏈表的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 初階數據結構之---順序表和鏈表(C語言)

    初階數據結構之---順序表和鏈表(C語言)

    線性表: 線性表(linear list)是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構。線性表在邏輯上是線性結構,也就是說是連續(xù)的一條直線。但在物理上并不一定是連續(xù)的。線性表在物理上存儲時,通常以 數組 和 鏈式結構 的形式存儲。

    2024年02月22日
    瀏覽(96)
  • 【數據結構初階】四、線性表里的鏈表(帶頭+雙向+循環(huán) 鏈表 -- C語言實現)

    【數據結構初階】四、線性表里的鏈表(帶頭+雙向+循環(huán) 鏈表 -- C語言實現)

    ========================================================================= 相關代碼gitee自取 : C語言學習日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【數據結構初階】三、 線性表里的鏈表(無頭+單向+非循環(huán)鏈表 -- C語言實現)-CSDN博客 ?====

    2024年02月08日
    瀏覽(30)
  • 『初階數據結構 ? C語言』⑨ - 基于結點的數據結構——鏈表(單鏈表&&雙向循環(huán)鏈表)附完整源碼

    『初階數據結構 ? C語言』⑨ - 基于結點的數據結構——鏈表(單鏈表&&雙向循環(huán)鏈表)附完整源碼

    ? 本章內容 1.什么是鏈表 2.鏈表常見幾種形式 3.無頭單向非循環(huán)鏈表的實現 3.1結點結構的定義 3.2函數接口的實現 3.2.1尾插 3.2.2尾刪 4. 帶頭雙向循環(huán)鏈表的實現 4.1結點結構的定義 4.2函數接口的實現 5.兩種鏈表的差異 ①尾插與尾刪的時間復雜度 ②頭插與頭刪的時間復雜度 ③

    2024年02月16日
    瀏覽(95)
  • 【數據結構和算法初階(C語言)】復雜鏈表(隨機指針,隨機鏈表的復制)題目詳解+鏈表順序表結尾

    【數據結構和算法初階(C語言)】復雜鏈表(隨機指針,隨機鏈表的復制)題目詳解+鏈表順序表結尾

    目錄 ?1.隨機鏈表的復制 1.2題目描述? 1.3題目分析 1.4解題: 2.順序表和鏈表對比 2.1cpu高速緩存利用率 3.結語 一個長度為? n ?的鏈表,每個節(jié)點包含一個額外增加的隨機指針? random ? 該指針可以指向鏈表中的任何節(jié)點或空節(jié)點。? ? ? ? 構造這個鏈表的? 深拷貝 。?深拷貝

    2024年03月10日
    瀏覽(93)
  • 【數據結構初階】三、 線性表里的鏈表(無頭+單向+非循環(huán)鏈表 -- C語言實現)

    【數據結構初階】三、 線性表里的鏈表(無頭+單向+非循環(huán)鏈表 -- C語言實現)

    ========================================================================= 相關代碼gitee自取 : C語言學習日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【數據結構初階】二、 線性表里的順序表(C語言實現順序表)-CSDN博客 ?=========================

    2024年02月08日
    瀏覽(34)
  • 數據結構(初階)第一節(jié):數據結構概論

    數據結構(初階)第一節(jié):數據結構概論

    本篇文章是對數據結構概念的 純理論 介紹,希望系統(tǒng)了解數據結構概念的友友可以看看,對概念要求不高的友友稍做了解后移步下一節(jié): 數據結構(初階)第二節(jié):順序表-CSDN博客 目錄 正文 1.數據結構的相關概念 1.1什么是數據 1.2什么是數據結構 1.3為什么需要數據結構 1

    2024年04月10日
    瀏覽(21)
  • 『初階數據結構 ? C語言』① - 數據結構為何重要

    『初階數據結構 ? C語言』① - 數據結構為何重要

    本文內容借鑒一本我非常喜歡的書——《數據結構與算法圖解》。學習之余,我決定把這本書精彩的部分摘錄出來與大家分享。 數組是計算機科學中最基本的數據結構之一。如果你用過數組,那么應該知道它就是一個含有 數據的列表。它有多種用途,適用于各種場景,下面

    2024年02月16日
    瀏覽(37)
  • 數據結構:二叉樹(初階)

    數據結構:二叉樹(初階)

    朋友們、伙計們,我們又見面了,本期來給大家解讀一下二叉樹方面的相關知識點,如果看完之后對你有一定的啟發(fā),那么請留下你的三連,祝大家心想事成! ? C 語 言 專 欄:C語言:從入門到精通 數據結構專欄:數據結構 個? 人? 主? 頁?:stackY、 目錄 ??編輯 前言:

    2024年02月07日
    瀏覽(17)
  • 數據結構初階

    數據結構初階

    講到了數據結構是什么,我們就得先知道什么叫做數據。 數據 ? 數據,《大話數據結構》這本書中,給出的定義:是描述客觀事物的符號,是計算機中可以操作的對象,是能夠被計算機識別,并輸入給計算機處理的符號集合。 ? 數據不僅僅包括整型,實型等數值類型,還包

    2024年02月04日
    瀏覽(19)
  • 數據結構初階--二叉樹的鏈式結構

    數據結構初階--二叉樹的鏈式結構

    目錄 一.二叉樹鏈式結構的概念 二.二叉樹鏈式結構的功能實現 2.1.鏈式二叉樹的定義 2.2.鏈式二叉樹的構建 2.3.鏈式二叉樹的遍歷 2.3.1.先序遍歷 2.3.2.中序遍歷 2.3.3.后序遍歷 2.3.4.層序遍歷 2.4.鏈式二叉樹的求二叉樹的結點數量 法一:計數法 法二:分治法 2.5.鏈式二叉樹的求二

    2024年02月12日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包