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

【數(shù)據(jù)結(jié)構(gòu)】手撕雙向鏈表

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

目錄

前言

1. 雙向鏈表?

帶頭雙向循環(huán)鏈表的結(jié)構(gòu)

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

2.1 初始化

2.2 尾插

2.3 尾刪

2.4 頭插

2.5 頭刪

2.6 在pos位置之前插入

2.7 刪除pos位置

3.雙向鏈表完整源碼

List.h

List.c


前言

在上一期中我們介紹了單鏈表,也做了一些練習(xí)題,在一些題中使用單鏈表會(huì)十分繁瑣。因?yàn)閱捂湵碇荒苷?,不能倒著走,例如:回文、逆置。本期我們將學(xué)習(xí)帶頭雙向循環(huán)鏈表。

1. 雙向鏈表?

帶頭雙向循環(huán)鏈表的結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】手撕雙向鏈表,數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),鏈表

?特點(diǎn):帶頭雙向循環(huán)鏈表結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會(huì)發(fā)現(xiàn)結(jié)構(gòu)會(huì)帶來(lái)多優(yōu)勢(shì),實(shí)現(xiàn)反而簡(jiǎn)單了。

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

2.1 初始化

LTNode* LTInit()
{
	LTNode* phead = CreateLTNode(-1);
	phead->next = phead;
	phead->prev = phead;
	return phead;
}

2.2 尾插

帶哨兵位的鏈表尾插時(shí)不用判斷是否有節(jié)點(diǎn),兩種情況的插入相同,而且還不用傳遞二級(jí)指針。

【數(shù)據(jù)結(jié)構(gòu)】手撕雙向鏈表,數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),鏈表

void LTPushBack(LTNode* phead, LTDateType x)
{
	assert(phead);

	LTNode* newnode = CreateLTNode(x);
	phead->prev->next = newnode;
	newnode->prev = phead->prev;
	newnode->next = phead;
	phead->prev = newnode;
}

2.3 尾刪

在尾刪時(shí)我們通過(guò) assert(phead->next != phead);? 判斷鏈表是否有節(jié)點(diǎn)。同時(shí)這個(gè)代碼就有普遍性,不用單獨(dú)考慮剩一個(gè)節(jié)點(diǎn)的情況。

【數(shù)據(jù)結(jié)構(gòu)】手撕雙向鏈表,數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),鏈表

void LTPopBack(LTNode* phead)
{
	assert(phead);
	LTNode* tail = phead->prev;
	LTNode* tailprev = tail->prev;
	free(tail);
	phead->prev = tailprev;
	tailprev->next = phead;
}

2.4 頭插

頭刪重要的是賦值的順序,順序錯(cuò)誤會(huì)找不到后面的節(jié)點(diǎn),導(dǎo)致內(nèi)存泄漏。帶哨兵位的鏈表不需要傳遞二級(jí)指針,因?yàn)楦淖兊氖墙Y(jié)構(gòu)體的變量。

【數(shù)據(jù)結(jié)構(gòu)】手撕雙向鏈表,數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),鏈表

void LTPushFront(LTNode* phead, LTDateType x)
{
	assert(phead);
	LTNode* newnode = CreateLTNode(x);
	newnode->next = phead->next;
	phead->next->prev = newnode;
	phead->next = newnode;
	newnode->prev = phead;
}

2.5 頭刪

我們可以多定義幾個(gè)指針來(lái)保存后面節(jié)點(diǎn)的地址,這樣就不會(huì)造成節(jié)點(diǎn)的丟失,不用考慮賦值的順序,會(huì)更加方便。?

【數(shù)據(jù)結(jié)構(gòu)】手撕雙向鏈表,數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),鏈表

void LTPopFront(LTNode* phead)
{
	assert(phead);
	assert(phead->next != phead);

	LTNode* tail = phead->next;
	LTNode* next = tail->next;
	phead->next = next;
	next->prev = phead;
	free(tail);
	tail = NULL;
}

2.6 在pos位置之前插入

void LTInsert(LTNode* pos, LTDateType x)
{
	assert(pos);

	LTNode* posprev = pos->prev;
	LTNode* newnode = CreateLTNode(x);
	posprev->next = newnode;
	newnode->prev = posprev;
	newnode->next = pos;
	pos->prev = newnode;
}

2.7 刪除pos位置

void LTErase(LTNode* pos)
{
	assert(pos);

	LTNode* posprev = pos->prev;
	LTNode* posnext = pos->next;
	posprev->next = posnext;
	posnext->prev = posprev;
}

3.雙向鏈表完整源碼

List.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int LTDateType;

typedef struct ListNode
{
	LTDateType val;
	struct ListNode* next;
	struct ListNode* prev;
}LTNode;

LTNode* LTInit();

void LTPrint(LTNode* phead);

void LTPushBack(LTNode* phead, LTDateType x);

void LTPushFront(LTNode* phead, LTDateType x);

void LTPopBack(LTNode* phead);

void LTPopFront(LTNode* phead);

LTNode* LTFind(LTNode* phead, LTDateType x);

void LTInsert(LTNode* pos, LTDateType x);

void LTErase(LTNode* pos);

void LTDestroy(LTNode* phead);

List.c

#include"List.h"

LTNode* CreateLTNode(LTDateType x)
{
	LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->val = x;
	newnode->next = NULL;
	newnode->prev = NULL;
}

LTNode* LTInit()
{
	LTNode* phead = CreateLTNode(-1);
	phead->next = phead;
	phead->prev = phead;
	return phead;
}

void LTPrint(LTNode* phead)
{
	assert(phead);
	LTNode* cur = phead->next;
	printf("<=>哨兵位<=>");
	while (cur != phead)
	{
		printf("%d<=>", cur->val);
		cur = cur->next;
	}
	printf("\n");
}

void LTPushBack(LTNode* phead, LTDateType x)
{
	assert(phead);

	LTNode* newnode = CreateLTNode(x);
	phead->prev->next = newnode;
	newnode->prev = phead->prev;
	newnode->next = phead;
	phead->prev = newnode;
}

void LTPushFront(LTNode* phead, LTDateType x)
{
	assert(phead);
	LTNode* newnode = CreateLTNode(x);
	newnode->next = phead->next;
	phead->next->prev = newnode;
	phead->next = newnode;
	newnode->prev = phead;
}

void LTPopBack(LTNode* phead)
{
	assert(phead);
	LTNode* tail = phead->prev;
	LTNode* tailprev = tail->prev;
	free(tail);
	phead->prev = tailprev;
	tailprev->next = phead;
}

void LTPopFront(LTNode* phead)
{
	assert(phead);
	assert(phead->next != phead);

	LTNode* tail = phead->next;
	LTNode* next = tail->next;
	phead->next = next;
	next->prev = phead;
	free(tail);
	tail = NULL;
}

LTNode* LTFind(LTNode* phead, LTDateType x)
{
	assert(phead);

	LTNode* cur = phead->next;
	while (cur != phead)
	{
		if (cur->val == x)
		{
			return cur;
		}
			cur = cur->next;
	}
	return NULL;
}

void LTInsert(LTNode* pos, LTDateType x)
{
	assert(pos);

	LTNode* posprev = pos->prev;
	LTNode* newnode = CreateLTNode(x);
	posprev->next = newnode;
	newnode->prev = posprev;
	newnode->next = pos;
	pos->prev = newnode;
}

void LTErase(LTNode* pos)
{
	assert(pos);

	LTNode* posprev = pos->prev;
	LTNode* posnext = pos->next;
	posprev->next = posnext;
	posnext->prev = posprev;
}

void LTDestroy(LTNode* phead)
{
	assert(phead);

	LTNode* cur = phead->next;
	while (cur != phead)
	{
		LTNode* next = cur->next;
		free(cur);
		cur = next;
	}
	free(phead);
	phead = NULL;
}

通過(guò)上面鏈表的實(shí)現(xiàn),我們已經(jīng)感受到了帶頭雙向循環(huán)鏈表的方便和簡(jiǎn)單,它不需要去考慮鏈表是否有元素,還可以找到前一個(gè)元素,在我們使用中提供很大的便利。

本次的內(nèi)容到這里就結(jié)束啦。希望大家閱讀完可以有所收獲,同時(shí)也感謝各位讀者三連支持。文章有問(wèn)題可以在評(píng)論區(qū)留言,博主一定認(rèn)真認(rèn)真修改,以后寫出更好的文章。?

【數(shù)據(jù)結(jié)構(gòu)】手撕雙向鏈表,數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu),鏈表文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-752789.html

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

本文來(lái)自互聯(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)和算法】使用數(shù)組的結(jié)構(gòu)實(shí)現(xiàn)鏈表(單向或雙向)

    【數(shù)據(jù)結(jié)構(gòu)和算法】使用數(shù)組的結(jié)構(gòu)實(shí)現(xiàn)鏈表(單向或雙向)

    上文我們通過(guò)結(jié)構(gòu)體的結(jié)構(gòu)實(shí)現(xiàn)了隊(duì)列 、以及循環(huán)隊(duì)列的實(shí)現(xiàn),我們或許在其他老師的教學(xué)中,只學(xué)到了用結(jié)構(gòu)體的形式來(lái)實(shí)現(xiàn)鏈表、隊(duì)列、棧等數(shù)據(jù)結(jié)構(gòu),本文我想告訴你的是,我們 可以使用數(shù)組的結(jié)構(gòu)實(shí)現(xiàn)鏈表、單調(diào)棧、單調(diào)隊(duì)列 目錄 前言 一、用數(shù)組結(jié)構(gòu)的好處 1.數(shù)

    2024年01月20日
    瀏覽(96)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】之雙向鏈表及其實(shí)現(xiàn)!

    【數(shù)據(jù)結(jié)構(gòu)與算法】之雙向鏈表及其實(shí)現(xiàn)!

    ? ????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?個(gè)人主頁(yè):秋風(fēng)起,再歸來(lái)~ ? ?????????????????????????????????????????? ? ? ? ? ? ? ?? ???? ? ? ? ? ? ? ???? ? ? ? ? ? 數(shù)據(jù)結(jié)構(gòu)與

    2024年04月23日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼

    【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼

    前幾篇文章介紹了怎樣去實(shí)現(xiàn)單鏈表、單循環(huán)鏈表, 這篇文章主要介紹 雙向鏈表 以及實(shí)現(xiàn)雙向鏈表的步驟,最后提供我自己根據(jù)理解實(shí)現(xiàn)雙向鏈表的C語(yǔ)言代碼 。跟著后面實(shí)現(xiàn)思路看下去,應(yīng)該可以看懂代碼,看懂代碼后,就對(duì)雙向鏈表有了比較抽象的理解了,最后自己再

    2024年02月01日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法】實(shí)現(xiàn)帶頭雙向循環(huán)鏈表(最復(fù)雜的鏈表)

    【數(shù)據(jù)結(jié)構(gòu)和算法】實(shí)現(xiàn)帶頭雙向循環(huán)鏈表(最復(fù)雜的鏈表)

    前文,我們實(shí)現(xiàn)了認(rèn)識(shí)了鏈表這一結(jié)構(gòu),并實(shí)現(xiàn)了無(wú)頭單向非循環(huán)鏈表,接下來(lái)我們實(shí)現(xiàn)另一種常用的鏈表結(jié)構(gòu),帶頭雙向循環(huán)鏈表。如有仍不了解單向鏈表的,請(qǐng)看這一篇文章(7條消息) 【數(shù)據(jù)結(jié)構(gòu)和算法】認(rèn)識(shí)線性表中的鏈表,并實(shí)現(xiàn)單向鏈表_小王學(xué)代碼的博客-CSDN博客

    2024年01月17日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】4、雙向鏈表(學(xué)習(xí) jdk 的 LinkedList 部分源碼)

    【數(shù)據(jù)結(jié)構(gòu)與算法】4、雙向鏈表(學(xué)習(xí) jdk 的 LinkedList 部分源碼)

    ?? 單鏈表的節(jié)點(diǎn)中只有一個(gè) next 指針引用著下一個(gè)節(jié)點(diǎn)的地址 ?? 當(dāng)要獲取單鏈表中的最后一個(gè)元素的時(shí)候,需要從頭節(jié)點(diǎn)開(kāi)始遍歷到最后 ?? 單鏈表一開(kāi)始的時(shí)候有 first 頭指針引用著頭節(jié)點(diǎn)的地址 ?? 雙向鏈表可以提升鏈表的綜合性能 ?? 雙向鏈表的節(jié)點(diǎn)中有 prev 指針引

    2024年02月12日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)題目——鏈表綜合算法設(shè)計(jì)、帶頭雙向循環(huán)鏈表、插入、顯示、刪除、修改、排序

    數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)題目——鏈表綜合算法設(shè)計(jì)、帶頭雙向循環(huán)鏈表、插入、顯示、刪除、修改、排序

    ??課程設(shè)計(jì)題目1–鏈表綜合算法設(shè)計(jì) ??一、設(shè)計(jì)內(nèi)容 ??已知簡(jiǎn)單的人事信息系統(tǒng)中職工記錄包含職工編號(hào)(no)、職工姓名(name)、部門名稱(depname)、職稱(title)和工資數(shù)(salary)等信息(可以增加其他信息),設(shè)計(jì)并完成一個(gè)簡(jiǎn)單的人事信息管理系統(tǒng),要求完成但不

    2024年02月08日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)---手撕圖解雙向循環(huán)鏈表

    數(shù)據(jù)結(jié)構(gòu)---手撕圖解雙向循環(huán)鏈表

    在前面學(xué)完單鏈表后,我們思考這樣一個(gè)問(wèn)題,單鏈表和順序表比起來(lái),功能確實(shí)相當(dāng)強(qiáng)大,有很多優(yōu)勢(shì),但是于此同時(shí),我們也應(yīng)思考下面的問(wèn)題 單鏈表有什么不足的地方? 如果你把單鏈表的各個(gè)函數(shù)都自己實(shí)現(xiàn)過(guò),那么下面的問(wèn)題你一定有相同的感悟 單鏈表實(shí)現(xiàn)尾插尾

    2024年02月15日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu):手撕圖解雙向循環(huán)鏈表

    數(shù)據(jù)結(jié)構(gòu):手撕圖解雙向循環(huán)鏈表

    在前面學(xué)完單鏈表后,我們思考這樣一個(gè)問(wèn)題,單鏈表和順序表比起來(lái),功能確實(shí)相當(dāng)強(qiáng)大,有很多優(yōu)勢(shì),但是于此同時(shí),我們也應(yīng)思考下面的問(wèn)題 單鏈表有什么不足的地方? 如果你把單鏈表的各個(gè)函數(shù)都自己實(shí)現(xiàn)過(guò),那么下面的問(wèn)題你一定有相同的感悟 單鏈表實(shí)現(xiàn)尾插尾

    2024年02月15日
    瀏覽(22)
  • 青島大學(xué)_王卓老師【數(shù)據(jù)結(jié)構(gòu)與算法】Week04_04_雙向鏈表的插入_學(xué)習(xí)筆記

    青島大學(xué)_王卓老師【數(shù)據(jù)結(jié)構(gòu)與算法】Week04_04_雙向鏈表的插入_學(xué)習(xí)筆記

    本文是個(gè)人學(xué)習(xí)筆記,素材來(lái)自青島大學(xué)王卓老師的教學(xué)視頻。 一方面用于學(xué)習(xí)記錄與分享,另一方面是想讓更多的人看到這么好的《數(shù)據(jù)結(jié)構(gòu)與算法》的學(xué)習(xí)視頻。 如有侵權(quán),請(qǐng)留言作刪文處理。 課程視頻鏈接: 數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)–第04周04–2.5.4雙向鏈表2–雙向鏈表

    2024年02月12日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)-鏈表結(jié)構(gòu)-雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)-鏈表結(jié)構(gòu)-雙向鏈表

    雙向鏈表也叫雙鏈表,與單向鏈表不同的是,每一個(gè)節(jié)點(diǎn)有三個(gè)區(qū)域組成:兩個(gè)指針域,一個(gè)數(shù)據(jù)域 前一個(gè)指針域:存儲(chǔ)前驅(qū)節(jié)點(diǎn)的內(nèi)存地址 后一個(gè)指針域:存儲(chǔ)后繼節(jié)點(diǎn)的內(nèi)存地址 數(shù)據(jù)域:存儲(chǔ)節(jié)點(diǎn)數(shù)據(jù) 以下就是雙向鏈表的最基本單位 節(jié)點(diǎn)的前指針域指向前驅(qū),后指針

    2024年02月04日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包