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

【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表)

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表

?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ?? ??
??個人主頁 :阿然成長日記 ??點擊可跳轉(zhuǎn)
?? 個人專欄: ??數(shù)據(jù)結構與算法??C語言進階
?? 不能則學,不知則問,恥于問人,決無長進
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??


前言

??小伙伴們,又見面了?? ?? ?? ?? 前面我們學習啦順序表,其實順序表的時間復雜度是很高的,尤其是在插入,刪除等問題上,需要移動整個數(shù)組,十分麻煩費時。有沒有更好的辦法呢????當然有呀,就是鏈表,也是本篇博客要詳細講解的。

一、鏈表的概念

鏈表是一種物理存儲結構上非連續(xù)、非順序的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表 中的指針鏈接次序?qū)崿F(xiàn)的 。

鏈表就像是一列火車,鏈表中的每一個節(jié)點,就像是火車的一節(jié)節(jié)車廂。
【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表
圖1.1
【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表圖1.2

上面兩幅圖片生動地解釋了鏈表的物理結構。想必看到這里已經(jīng)對鏈表有了初步的認識。

二、特點

1?? 鏈式結構在邏輯上是連續(xù)的,但在物理層上不一定連續(xù)。
2??節(jié)點一般都是從堆上申請出來的一塊空間。
3??從堆上申請的空間,按照它的規(guī)則來進行分配,兩次申請的空間,不一定連續(xù)。

三、鏈表的分類

1.單向或者雙向
2. 帶頭或者不帶頭
3. 循環(huán)或者非循環(huán)

四、單向鏈表的結構體

?誤區(qū):以下這種結構體定義會報錯,那么是為什么呢?

typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType data;
	SLTNode* next;//錯誤

}SLTNode;

我們的typedef關鍵字給結構體重新命名為SLTNode,但是他是在結構體最后才生效,如果現(xiàn)在就在結構體中使用新命名,那么就會找不到。

??正解是:

typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType data;
	struct SListNode* next;

 }SLTNode;

1.node:是存儲的數(shù)據(jù);
2.next 的類型是一個節(jié)點型的指針變量,它保存的是下一個節(jié)點的地址,即指向下一個節(jié)點

命名規(guī)范:

當我們在給結構體命名或者是函數(shù)的命名我們都應該使用用英文或者英文的簡寫來進行命名這樣有利于人們的理解。例如單鏈表英文名:single List table,所以我給節(jié)點命名為SLTNode.

二級指針

在下面的學習中,會使用二級指針,不太清楚的小伙伴,可以去看我的??C進階專欄中的??高級指針一篇

??注意事項

我們現(xiàn)在定義的頭指針在函數(shù)結束之后都會銷毀,因為它存在棧上。我們的每一個節(jié)點是使用動態(tài)內(nèi)存函數(shù)在堆上進行開辟如果不進行free釋放那么它會持續(xù)保存到程序結束。

五、函數(shù)實現(xiàn)

1.單鏈表的打印

//打印單鏈表
void PrintSlistTable(SLTNode* phead)
{
	SLTNode* cur = phead;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL");
}

2.單鏈表的頭插

頭插思路分析:
【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表

頭插代碼

//頭插
void SLTPusFront(SLTNode** pphead, SLTDataType x)//放入新插入節(jié)點
{
	SLTNode* newnode = CreatNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

這里有很多小伙伴都不知道為什么使用了二級指針。因為在傳參時我們使用的是結構體地址傳參,這樣能節(jié)省空間,提高效率,傳入的是一級指針phead的地址,所以我們需要使用二級指針pphead來接收。

3.單鏈表的尾插

尾插思路分析:

【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表
尾插代碼:

//尾插
void SLTPusBack(SLTNode**  pphead, SLTDataType x)
{
	SLTNode* newnode = CreatNode(x);
	if (*pphead == NULL)
	{
		//改變的結構體的指針,所以要用二級指針 
		*pphead = newnode;
	}
	else
	{
		SLTNode* tail = *pphead;
		while (tail->next != NULL)
		{
		tail = tail->next;
		}
		//改變結構體,用結構體指針即可 
	tail->next = newnode;
	}
}

4.單鏈表的頭刪

思路:
一個節(jié)點和多個節(jié)點處理方式相同
【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表
代碼:

//頭刪
void PopFront(SLTNode** pphead)
{
	assert(*pphead);
	SLTNode* cur = (*pphead)->next;
	free(*pphead);
	*pphead = cur;
}

1?? 定義一個cur臨時指針用來指向頭節(jié)點的下一個節(jié)點.SLTNode* cur = (*pphead)->next;
2?? 釋放 *pphead即(刪除第一個節(jié)點)free(*pphead);
3?? 在將 *pphead指向第二節(jié)點*pphead = cur;

5.單鏈表尾刪

思路:
1.如果沒有節(jié)點,則直接釋放頭指針所指向的內(nèi)容
2.
【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表
代碼:

//尾插
void SLTPusBack(SLTNode**  pphead, SLTDataType x)
{
	SLTNode* newnode = CreatNode(x);
	if (*pphead == NULL)
	{
		//改變的結構體的指針,所以要用二級指針 
		*pphead = newnode;
	}
	else
	{
		SLTNode* tail = *pphead;
		while (tail->next != NULL)
		{
		tail = tail->next;
		}
		//改變結構體,用結構體指針即可 
	tail->next = newnode;
	}
}

6.在pos位置之前插入x

思路:
【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表
代碼:

//在pos位置之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
	assert(*pphead);
	assert(pos);

	if (*pphead == pos)
	{
		//頭插;
		SLTPusFront(pphead, x);
	}
	else
	{
		//定義一個臨時指針cur指向頭指針,為了從頭開始遍歷各個節(jié)點找pos,而不會改變頭指針pphead的指向位置。
		SLTNode* cur = *pphead;
		while (cur->next != pos)
		{
			cur = cur->next;
		}
		SLTNode* newNode = CreatNode(x);
		newNode->next = cur->next;
		cur->next = newNode;
		free(cur);
		cur = NULL;
	}
}

定義一個臨時指針cur指向頭指針,用來從頭開始遍歷各個節(jié)點找pos,
頭指針pphead的指向位置不能變,不然就找不到頭了。

7.在pos位置之后插入x

思路:

【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表
代碼:

在pos位置之后插入x
void SLTInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
	assert(*pphead);
	SLTNode* newNode = CreatNode(x);
	newNode->next = pos->data;
	pos->next = newNode;
}

8.刪除pos位置 節(jié)點

思路:
【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表
代碼:

//刪除POS位置 
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	assert(*pphead);
	assert(pos);

	if (*pphead == pos)
	{
		//頭刪
		SLTPopFront(pphead);
	}
	else
	{
		SLTNode* cur = *pphead;
		while (cur->next == pos)
		{
			cur = cur->next;

		}
		pos->next = cur->next;
		free(pos);
	}
}

9.刪除pos位置之后的節(jié)點

思路:
【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表),數(shù)據(jù)結構與算法,數(shù)據(jù)結構,鏈表
代碼:

//刪除POS之后的位置 
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos)
{

		assert(pphead);
		assert(pos);
		assert(pos->next);

		SLTNode* cur = pos->next->next;
		free(pos->next);
		pos->next = cur;

}

10.單鏈表的查找

代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-628750.html

//單鏈表的查找 

SLTNode*  SLTSrech(SLTNode** pphead, SLTDataType x)
{
	SLTNode* cur = *pphead;
	while (cur->next!= NULL)
	{
		if (cur->data == x)
			return cur;
		cur = cur->next;
	}
	return cur;
}

到了這里,關于【數(shù)據(jù)結構】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關文章

  • 數(shù)據(jù)結構——線性數(shù)據(jù)結構(數(shù)組,鏈表,棧,隊列)

    數(shù)據(jù)結構——線性數(shù)據(jù)結構(數(shù)組,鏈表,棧,隊列)

    數(shù)組(Array) 是一種很常見的數(shù)據(jù)結構。它由相同類型的元素(element)組成,并且是使用一塊連續(xù)的內(nèi)存來存儲。 我們直接可以利用元素的索引(index)可以計算出該元素對應的存儲地址。 數(shù)組的特點是: 提供隨機訪問 并且容量有限。 2.1. 鏈表簡介 鏈表(LinkedList) 雖然是

    2024年02月11日
    瀏覽(19)
  • 【數(shù)據(jù)結構】鏈表的回文結構

    【數(shù)據(jù)結構】鏈表的回文結構

    單鏈表的操作算法是筆試面試中較為常見的題目。 本文將著重介紹平時面試中常見的關于鏈表的應用題目,馬上要進行秋招了。希望對你們有幫助 _ ?? 對于一個鏈表,請設計一個時間復雜度為O(n),額外空間復雜度為O(1)的算法,判斷其是否為回文結構。 給定一個鏈表的頭指針

    2024年02月12日
    瀏覽(25)
  • 【數(shù)據(jù)結構】詳解鏈表結構

    【數(shù)據(jù)結構】詳解鏈表結構

    上篇博客已經(jīng)介紹了順序表的實現(xiàn):【數(shù)據(jù)結構】詳解順序表。最后在里面也談及了順序表結構的缺陷,即 效率低,空間浪費 等等問題,那么為了解決這些問題,于是乎我們引入了鏈表的概念,下面將對鏈表結構進行講解 首先肯定會問,到底什么是鏈表? 鏈表的概念 : 鏈

    2024年02月05日
    瀏覽(30)
  • 【數(shù)據(jù)結構】淺談數(shù)據(jù)結構-鏈表【思路+例題學習】

    【數(shù)據(jù)結構】淺談數(shù)據(jù)結構-鏈表【思路+例題學習】

    ??今日學習目標: ??學習算法-數(shù)據(jù)結構-鏈表 ?創(chuàng)作者:賢魚 ?預計時間:30分鐘 ??個人主頁:賢魚的個人主頁 ??專欄系列:算法 ??賢魚的個人社區(qū),歡迎你的加入 賢魚擺爛團 鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表中

    2024年01月21日
    瀏覽(29)
  • 【數(shù)據(jù)結構】每天五分鐘,快速入門數(shù)據(jù)結構(二)——鏈表

    【數(shù)據(jù)結構】每天五分鐘,快速入門數(shù)據(jù)結構(二)——鏈表

    目錄 一 構建一個單向鏈表 二 特點 三 時間復雜度 四 相關算法 1.判斷鏈表是否成環(huán)及成環(huán)位置 2.鏈表反轉(zhuǎn) 五 Java中的LinkedList 類 1.使用 2.LinkedList 方法 長度無限 適合任意位置插入和刪除頻繁的場景 物理上可以不連續(xù) 訪問、插入、刪除 的時間復雜度均為O(n) 在頭部插入元素

    2024年02月21日
    瀏覽(30)
  • 【數(shù)據(jù)結構】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點、鏈表的回文結構(單鏈表OJ題)

    【數(shù)據(jù)結構】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點、鏈表的回文結構(單鏈表OJ題)

    正如標題所說,本文會圖文詳細解析三道單鏈表OJ題,分別為: ?反轉(zhuǎn)鏈表 (簡單) ?鏈表的中間節(jié)點 (簡單) ?鏈表的回文結構 (較難) 把他們放在一起講的原因是: ?反轉(zhuǎn)鏈表 和 ?鏈表的中間節(jié)點 是 ?鏈表的回文結構 的基礎 為什么這樣說?請往下看: 目錄 1. 反轉(zhuǎn)鏈

    2024年02月13日
    瀏覽(100)
  • 數(shù)據(jù)結構:詳解【鏈表】的實現(xiàn)(單向鏈表+雙向鏈表)

    數(shù)據(jù)結構:詳解【鏈表】的實現(xiàn)(單向鏈表+雙向鏈表)

    1.順序表的問題和思考 問題: 中間/頭部的插入刪除,時間復雜度為O(N)。 增容需要申請新空間,拷貝數(shù)據(jù),釋放舊空間,會有不小的消耗。 增容一般是呈2倍的增長,勢必會有一定的空間浪費。例如當前容量為100,滿了以后增容到200,我們再繼續(xù)插入了5個數(shù)據(jù),后面沒有數(shù)據(jù)

    2024年03月26日
    瀏覽(34)
  • Python數(shù)據(jù)結構與算法-數(shù)據(jù)結構(列表、棧、隊列、鏈表)

    Python數(shù)據(jù)結構與算法-數(shù)據(jù)結構(列表、棧、隊列、鏈表)

    數(shù)據(jù)結構是指相互之間存在這一種或者多種關系的數(shù)據(jù)元素的集合和該集合中元素之間的關系組成。 簡單來說,數(shù)據(jù)結構就是設計數(shù)據(jù)以何種方式組織并存儲在計算機中。 比如:列表、集合與字典等都是一種數(shù)據(jù)結構。 N.Wirth:“程序=數(shù)據(jù)結構+算法” 數(shù)據(jù)結構按照其 邏輯結

    2024年02月08日
    瀏覽(35)
  • 數(shù)據(jù)結構入門 — 鏈表詳解_雙向鏈表

    數(shù)據(jù)結構入門 — 鏈表詳解_雙向鏈表

    數(shù)據(jù)結構入門 — 雙向鏈表詳解 博客主頁鏈接:https://blog.csdn.net/m0_74014525 關注博主,后期持續(xù)更新系列文章 文章末尾有源碼 *****感謝觀看,希望對你有所幫助***** 第一篇:數(shù)據(jù)結構入門 — 鏈表詳解_單鏈表 第二篇:數(shù)據(jù)結構入門 — 鏈表詳解_雙向鏈表 第三篇:數(shù)據(jù)結構入門

    2024年02月11日
    瀏覽(17)
  • 【數(shù)據(jù)結構】鏈表的分類和雙向鏈表

    【數(shù)據(jù)結構】鏈表的分類和雙向鏈表

    本篇是基于上篇單鏈表所作,推薦與上篇配合閱讀,效果更加 http://t.csdnimg.cn/UhXEj 鏈表的結構非常多樣,以下情況組合起來就有8種(2 x 2 x 2)鏈表結構: 我們一般叫這個頭為哨兵位 我們上回講的單鏈表就是不帶頭單項不循環(huán)鏈表。 今天我們要講帶頭雙向循環(huán)的鏈表。 不過

    2024年01月25日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包