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

數(shù)據(jù)結(jié)構(gòu)之單鏈表

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之單鏈表。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1.什么是鏈表。

2.鏈表的優(yōu)點(diǎn)

3.單鏈表的實(shí)現(xiàn)

1.單鏈表的結(jié)構(gòu)體

2.節(jié)點(diǎn)的創(chuàng)建

3.參數(shù)的調(diào)用

4.頭插

?5.尾插

7.頭刪

8.尾刪

8.在pos節(jié)點(diǎn)前插入x

9.在pos節(jié)點(diǎn)前插入x

10.刪除pos位置節(jié)點(diǎn)?


對(duì)于順序表我們發(fā)現(xiàn),在此基礎(chǔ)上仍存在了些許不足:

1.中間或頭部的插入時(shí)間復(fù)雜度為O(n),有點(diǎn)浪費(fèi)時(shí)間。

2.增容需要申請(qǐng)空間,拷貝數(shù)據(jù),釋放空間,會(huì)有不小的消耗。

3.增容一般是呈2倍增容的,勢(shì)必會(huì)造成空間浪費(fèi)。

如何解決以上問題,我們又了解到了一種新的數(shù)據(jù)結(jié)構(gòu)-“鏈表”

1.什么是鏈表。

鏈表顧名思義,由一條鏈子連接表中各成員。實(shí)則鏈表是由每一塊獨(dú)立的空間組成,每一個(gè)空間里存放著數(shù)據(jù)和一個(gè)指針,每一個(gè)指針指向下一塊空間的地址,依次指向,我們可以想象成為用鏈條串聯(lián)起類,故叫鏈表,鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù),非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈次序?qū)崿F(xiàn)的。

數(shù)據(jù)結(jié)構(gòu)之單鏈表

就像火車一樣數(shù)據(jù)結(jié)構(gòu)之單鏈表

我們一般將這一塊空間稱為一個(gè)節(jié)點(diǎn),鏈表的末尾節(jié)點(diǎn)的指針是空指針。

2.鏈表的優(yōu)點(diǎn)

相較于順序表:

1.因?yàn)殒湵硎怯梢粔K塊空間構(gòu)成,所以鏈表不存在容量不夠要擴(kuò)容的問題

2.根據(jù)需求申請(qǐng)釋放空間

3.較好地解決了在頭部或中間插入刪除挪動(dòng)數(shù)據(jù)的問題

3.單鏈表的實(shí)現(xiàn)

這里還是以存放整形數(shù)據(jù)為例:

1.單鏈表的結(jié)構(gòu)體

如何來實(shí)現(xiàn)這樣的結(jié)構(gòu)呢?

數(shù)據(jù)結(jié)構(gòu)之單鏈表

typedef int SLdatatype;
typedef struct seqlist
{
	SLdatatype data;
	struct seqlist* next;
}SLnode;

可以看到這里的結(jié)構(gòu)體里存放了本結(jié)構(gòu)體的指針,每一個(gè)結(jié)構(gòu)體里都有一個(gè)自身的指針,而這個(gè)自身的指針就代表下一個(gè)結(jié)構(gòu)體的首地址,依次下去,直至到末尾next尾空。

用單鏈表的話來說,就是每一個(gè)節(jié)點(diǎn)存放著指向下一個(gè)節(jié)點(diǎn)地址的指針,故此我們可以創(chuàng)建所需的節(jié)點(diǎn)個(gè)數(shù)存放數(shù)據(jù),用指針連接起來。

2.節(jié)點(diǎn)的創(chuàng)建

SLnode* SLcreatnode(SLdatatype x)
{
	SLnode* newnode = (SLnode*)malloc(sizeof(SLnode));
	if (newnode == NULL)
	{
		perror("開辟錯(cuò)誤\n");
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

每創(chuàng)建一個(gè)節(jié)點(diǎn),就是在堆區(qū)申請(qǐng)一塊空間用來存放數(shù)據(jù),利用malloc開辟該結(jié)構(gòu)體大小的空間,之后返回該節(jié)點(diǎn),也就是這片空間。

3.參數(shù)的調(diào)用

這里強(qiáng)調(diào)下參數(shù),因?yàn)槲覀冃枰淖冩湵?,定義鏈表變量的時(shí)候是指針,函數(shù)的參數(shù)應(yīng)設(shè)計(jì)為二級(jí)指針。

對(duì)于一個(gè)函數(shù)我們?cè)谄渲卸x的變量生命周期只在該作用域中,出了作用域就會(huì)被銷毀,而有的函數(shù)需要去改變實(shí)參,只是簡(jiǎn)單的改變形參,是不會(huì)影響實(shí)參的,但若為實(shí)參的地址,我們可通過解引用形參來改變實(shí)參,比如:

int swap(int* x, int* y)
{

	int tmp = *x;
	*x = *y;
	*y = tmp;
}
int main()
{
	int x = 10;
	int y = 20;
	swap(&x, &y);
	printf("%d %d", x, y);
	return 0;
}

因此,這里要想通過形參改變實(shí)參,參數(shù)設(shè)計(jì)為二級(jí)指針:這里以頭插為例

數(shù)據(jù)結(jié)構(gòu)之單鏈表

4.頭插

void SLpushfront(SLnode** p, SLdatatype x)//傳參用二級(jí)指針
{
	SLnode* newnode = SLcreatnode(x);
	newnode->next = *p;
	*p = newnode;
}

數(shù)據(jù)結(jié)構(gòu)之單鏈表

?可以看到頭插是先malloc一個(gè)節(jié)點(diǎn)賦值給newnode,之后在將該newnode 存放到目前的頭節(jié)點(diǎn)的next中,然后賦值給頭節(jié)點(diǎn),即實(shí)現(xiàn)頭部插入。

?5.尾插

void SLpushback(SLnode** p, SLdatatype x)//尾插
{
	SLnode* newnode = SLcreatnode(x);
	//鏈表為空的話
	if (*p == NULL)
	{
		*p = newnode;
		(*p)->data = x;
	}
	else
	{
//找尾巴(前提:鏈表不為空)
	SLnode* tail = *p;
	while (tail ->next!= NULL)
	{
		tail = tail -> next;
	}
	tail->next = newnode;
	(*p)->data = x;
	}
}

尾插需要我們找到最后一個(gè)節(jié)點(diǎn),之后先改變末尾的next,(因?yàn)楸WC是連接的)然后再插入。

7.頭刪

void SLpopfront(SLnode** p)//頭刪
{
	assert(*p);
	if ((*p) ->next== NULL)
	{
		free(p);
		*p = NULL;
	}
	else
	{
    SLnode* top = *p;
	*p = (*p) -> next;//指向下一個(gè)
	free(top);
	top = NULL;
	}
	
}

頭刪需要分情況

8.尾刪

void SLpopback1(SLnode** p)//尾刪
{
	SLnode* pre = NULL;
	SLnode* tail = *p;
	while (tail->next != NULL)
	{
	pre = tail;//找到尾節(jié)點(diǎn)前一個(gè)
	tail = tail->next;
	}
	free(tail);//釋放最后的空間
	pre->next = NULL;//同時(shí)前一個(gè)的next為空
}

或者

void SLpopback2(SLnode** p)
{
	SLnode* tail = *p;
	while(tail->next->next)//找倒數(shù)第二個(gè)節(jié)點(diǎn)
	{
		tail = tail->next;
	}
	free(tail->next);//釋放
	tail->next = NULL;//倒數(shù)第二個(gè)next置空
}

主要找到最后一個(gè)節(jié)點(diǎn)或者最后一個(gè)的前一個(gè)節(jié)點(diǎn)(這里的兩種方法),在釋放掉最后一個(gè)同時(shí),前一個(gè)節(jié)點(diǎn)next為NULL??梢钥吹降诙N直接釋放掉前一個(gè)的next空間,即指向最后一個(gè)結(jié)點(diǎn)的空間,在置空。

數(shù)據(jù)結(jié)構(gòu)之單鏈表

8.在pos節(jié)點(diǎn)前插入x

void SLinsert(SLnode** p, SLnode* pos, SLdatatype x)//插在pos位置前
{
	SLnode* newnode = SLcreatnode(x);
	if (pos == *p)
	{
		SLpushfront(p, x);
	}
	SLnode* prev=*p;
	while (prev->next != pos)
	{
		prev = prev->next;
	}
	prev->next = newnode;
	newnode->next = pos;
	
}

數(shù)據(jù)結(jié)構(gòu)之單鏈表

在這里需要注意在遍歷找到pos位置前的一個(gè)節(jié)點(diǎn)時(shí),我們都是prev->next==pos這樣去尋找,但忽略了當(dāng)頭節(jié)點(diǎn)就是pos位置時(shí)的節(jié)點(diǎn),故在開始我們還需要判斷是否頭節(jié)點(diǎn)等于pos節(jié)點(diǎn),如何果實(shí)就直接調(diào)用頭插

9.在pos節(jié)點(diǎn)前插入x

//pos節(jié)點(diǎn)后插
void SLinsertafter(SLnode** p, SLnode* pos, SLdatatype x)
{
	
	SLnode* newnode = SLcreatnode(x);
	SLnode* prev = pos->next;
	pos->next = newnode;
	newnode->next = prev;
}

10.刪除pos位置節(jié)點(diǎn)?

void SLerase(SLnode** p, SLnode* pos)//刪除pos位置的節(jié)點(diǎn)
{
	SLnode* prev = *p;
	if (*p == pos)
	{
		SLpopfront(p);
		
	}
	else
	{
      while (prev->next != pos)
	   {
		prev = prev->next;
	   }
	prev->next = pos->next;
	free(pos);
	}
	

}

數(shù)據(jù)結(jié)構(gòu)之單鏈表文章來源地址http://www.zghlxwxcb.cn/news/detail-454597.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)之單鏈表的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • <數(shù)據(jù)結(jié)構(gòu)> 鏈表 - 單鏈表(c語(yǔ)言實(shí)現(xiàn))

    <數(shù)據(jù)結(jié)構(gòu)> 鏈表 - 單鏈表(c語(yǔ)言實(shí)現(xiàn))

    哨兵位結(jié)點(diǎn)也叫啞節(jié)點(diǎn)。哨兵位結(jié)點(diǎn) 也是頭結(jié)點(diǎn) 。該節(jié)點(diǎn) 不存儲(chǔ)有效數(shù)據(jù),只是為了方便操作 (如尾插時(shí)用帶哨兵位的頭結(jié)點(diǎn)很爽,不需要判空)。 有哨兵位結(jié)點(diǎn)的鏈表,第一個(gè)元素應(yīng)該是鏈表第二個(gè)節(jié)點(diǎn)(head - next,head為哨兵位結(jié)點(diǎn))對(duì)應(yīng)的元素。 有哨兵位結(jié)點(diǎn)的鏈表

    2023年04月11日
    瀏覽(716)
  • 【數(shù)據(jù)結(jié)構(gòu)】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點(diǎn)、鏈表的回文結(jié)構(gòu)(單鏈表OJ題)

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

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

    2024年02月13日
    瀏覽(104)
  • 【數(shù)據(jù)結(jié)構(gòu)】 鏈表簡(jiǎn)介與單鏈表的實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】 鏈表簡(jiǎn)介與單鏈表的實(shí)現(xiàn)

    在【數(shù)據(jù)結(jié)構(gòu)】 ArrayList簡(jiǎn)介與實(shí)戰(zhàn)中我們已經(jīng)熟悉了ArrayList的使用,并且進(jìn)行了簡(jiǎn)單模擬實(shí)現(xiàn)。通過源碼知道,ArrayList底層使用數(shù)組來存儲(chǔ)元素 由于其底層是一段連續(xù)空間, 當(dāng)在ArrayList任意位置插入或者刪除元素時(shí),就需要將后序元素整體往前或者往后搬移,時(shí)間復(fù)雜度為

    2024年02月12日
    瀏覽(1202)
  • 【數(shù)據(jù)結(jié)構(gòu)】認(rèn)識(shí)鏈表和模擬實(shí)現(xiàn)單鏈表

    【數(shù)據(jù)結(jié)構(gòu)】認(rèn)識(shí)鏈表和模擬實(shí)現(xiàn)單鏈表

    即使騎的小電驢,也要奮力前進(jìn) 目錄 1.鏈表 1.1 鏈表的概念? 1.2 鏈表的邏輯結(jié)構(gòu)圖和物理結(jié)構(gòu)圖 1.2.1 鏈表的邏輯結(jié)構(gòu)圖? 1.2.2 鏈表的物理結(jié)構(gòu)圖? 1.3鏈表結(jié)構(gòu)的分類 1.3.1 鏈表通過什么進(jìn)行結(jié)構(gòu)的分類? 1.3.2?不同鏈表結(jié)構(gòu)的邏輯圖 2.模擬實(shí)現(xiàn)一個(gè)單向鏈表? 2.1 MyLinkedList類的

    2024年02月14日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】鏈表(單鏈表與雙鏈表實(shí)現(xiàn)+原理+源碼)

    【數(shù)據(jù)結(jié)構(gòu)】鏈表(單鏈表與雙鏈表實(shí)現(xiàn)+原理+源碼)

    博主介紹:?全網(wǎng)粉絲喜愛+、前后端領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、本質(zhì)互聯(lián)網(wǎng)精神、堅(jiān)持優(yōu)質(zhì)作品共享、掘金/騰訊云/阿里云等平臺(tái)優(yōu)質(zhì)作者、擅長(zhǎng)前后端項(xiàng)目開發(fā)和畢業(yè)項(xiàng)目實(shí)戰(zhàn)?有需要可以聯(lián)系作者我哦! ??附上相關(guān)C語(yǔ)言版源碼講解?? ???? 精彩專欄推薦訂閱???? 不然下次找

    2024年01月24日
    瀏覽(638)
  • 【數(shù)據(jù)結(jié)構(gòu)】--單鏈表力扣面試題②反轉(zhuǎn)鏈表

    【數(shù)據(jù)結(jié)構(gòu)】--單鏈表力扣面試題②反轉(zhuǎn)鏈表

    目錄 題目鏈接:反轉(zhuǎn)鏈表? ?法一:直接反轉(zhuǎn)法 法二:頭插法 題目分析: 創(chuàng)建一個(gè)新鏈表,然后值是逆置的行嗎?不行。因?yàn)轭}目要求的是在 原鏈表上逆置,改變?cè)湵淼闹赶?,并不是值的拷貝后的逆轉(zhuǎn) 。 那其實(shí)總共有三種方法 。 法一,直接原地翻轉(zhuǎn)。法二,頭插法。

    2024年02月06日
    瀏覽(20)
  • [C語(yǔ)言][數(shù)據(jù)結(jié)構(gòu)][鏈表] 單鏈表的從零實(shí)現(xiàn)!

    [C語(yǔ)言][數(shù)據(jù)結(jié)構(gòu)][鏈表] 單鏈表的從零實(shí)現(xiàn)!

    目錄 零.必備知識(shí) 1.一級(jí)指針 二級(jí)指針 2. 節(jié)點(diǎn)的成員列表 ? ? a.數(shù)據(jù) ? ? b.指向下一個(gè)節(jié)點(diǎn)的指針. 3. 動(dòng)態(tài)內(nèi)存空間的開辟 (malloc-calloc-realloc) 一.單鏈表的實(shí)現(xiàn)與銷毀? ? ? ? ? 1.1 節(jié)點(diǎn)的定義 ? ? ? ? 1.2 單鏈表的尾插 ? ? ? ? 1.3 單鏈表的頭插 ? ? ? ? 1.4 單鏈表的尾刪 ?

    2024年04月11日
    瀏覽(94)
  • 鏈表的總體涵蓋以及無哨兵位單鏈表實(shí)現(xiàn)——【數(shù)據(jù)結(jié)構(gòu)】

    鏈表的總體涵蓋以及無哨兵位單鏈表實(shí)現(xiàn)——【數(shù)據(jù)結(jié)構(gòu)】

    ???W…Y:個(gè)人主頁(yè) 在學(xué)習(xí)之前看一下美麗的夕陽(yáng),也是很不錯(cuò)的。 如果覺得博主的美景不錯(cuò),博客也不錯(cuò)的話,關(guān)注一下博主吧?? 在上一期中,我們說完了順序表,并且提出順序表中的問題 1. 中間/頭部的插入刪除,時(shí)間復(fù)雜度為O(N) 2. 增容需要申請(qǐng)新空間,拷貝數(shù)據(jù),釋

    2024年02月14日
    瀏覽(163)
  • 【數(shù)據(jù)結(jié)構(gòu)】移除鏈表元素-圖文解析(單鏈表OJ題)

    【數(shù)據(jù)結(jié)構(gòu)】移除鏈表元素-圖文解析(單鏈表OJ題)

    LeetCode鏈接:203. 移除鏈表元素 - 力扣(LeetCode) 本文導(dǎo)航 ??做題思路 ??畫圖更好理解: ??代碼實(shí)現(xiàn) ???分情況討論: ??極端情況: 遍歷鏈表,找到值為 val 的節(jié)點(diǎn)刪除 這里需要兩個(gè)指針 ?cur 用來遍歷鏈表 ?prev 指向 cur 的前一個(gè)位置,方便刪除一個(gè)節(jié)點(diǎn)后,鏈接前

    2024年02月14日
    瀏覽(27)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語(yǔ)言』⑨ - 基于結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)——鏈表(單鏈表&&雙向循環(huán)鏈表)附完整源碼

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語(yǔ)言』⑨ - 基于結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)——鏈表(單鏈表&&雙向循環(huán)鏈表)附完整源碼

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

    2024年02月16日
    瀏覽(95)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包