最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言類的雙向鏈表詳解

 更新時(shí)間:2022年01月18日 10:08:02   作者:weixin_52079669  
大家好,本篇文章主要講的是C語言類的雙向鏈表詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下

前言

鏈表(linked list)是一種這樣的數(shù)據(jù)結(jié)構(gòu),其中的各對象按線性排列。數(shù)組的線性順序是由數(shù)組下標(biāo)決定的,然而于數(shù)組不同的是,鏈表的各順序是由鏈表中的指針決定的。

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開始,都可以很方便地訪問它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。一般我們都構(gòu)造雙向循環(huán)鏈表。

雙向鏈表的定義

雙鏈表(doubly linked list)的每一個(gè)元素都是一個(gè)對象,每一個(gè)對象都有一個(gè)數(shù)據(jù)域和兩個(gè)指針front和tail。對象中還可以包含其他輔助數(shù)據(jù)。設(shè)L為鏈表的一個(gè)元素,L.front指向他在鏈表中的后繼元素,L.tail指向他的前繼元素。

我們可以定義一個(gè)結(jié)構(gòu)體封裝這些數(shù)據(jù)

typedef struct Node
{
	int data;
	struct Node* front;
	struct Node* tail;
}NODE, * LPNODE;

雙向鏈表的創(chuàng)建

在C++中,我們以類的形式封裝了雙向鏈表。在類中,我們定義了兩個(gè)指針,一個(gè)是指向鏈表的頭部 frontNode,一個(gè)是指向了鏈表的尾部 tailNode,另外我們還加入了 curSize屬性,記錄節(jié)點(diǎn)的個(gè)數(shù)。在對象創(chuàng)建的過程就是鏈表創(chuàng)建的過程,我們只需要在類的構(gòu)造函數(shù)中初始化參數(shù)即可。

class duplexHead {
public:
	duplexHead() {
		frontNode = NULL;
		tailNode = NULL;
		curSize = 0;
	}
 
	LPNODE createNode(int data);
	LPNODE seachNode(int data);
	void push_front(int data);
	void push_back(int data);
	void push_appoin(int posData, int data);
	void pop_front();
	void pop_back();
	void pop_appoin(int posData);
	void printByFront();
	void printByTail();
 
protected:
 
	LPNODE frontNode;
	LPNODE tailNode;
	int curSize;
 
};

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

在上面,我們已經(jīng)知道雙向鏈表的單體長啥樣了,我們只需要給他的單體分配空間然后初始化他的參數(shù)即可。

LPNODE duplexHead::createNode(int data)
{
	LPNODE newNode = new NODE;
	assert(newNode);
	newNode->front = nullptr;
	newNode->tail = nullptr;
	newNode->data = data;
	return newNode;
}

雙向鏈表節(jié)點(diǎn)查找

     鏈表的查找我們可以定義一個(gè)函數(shù)LPNODE seachNode(int data),當(dāng)滿足查找條件時(shí),我們就返回當(dāng)前節(jié)點(diǎn)的鏈表。在實(shí)際操作過程中,鏈表的數(shù)據(jù)域可能會(huì)有多個(gè)數(shù)據(jù),可能要比較int 類型,可能要比較string類型等多種變化,這是我們可以在參數(shù)列表預(yù)留一個(gè)函數(shù)指針 (int)  (*comparData)(LPNODE  data),以應(yīng)對多種需求。當(dāng)然,在這里為了演示方便,我們就用一個(gè)int 類型的數(shù)據(jù)代替了。

 
LPNODE duplexHead::seachNode(int data)
{
	if (!curSize)
	{
		printf("鏈表為空,無法查找");
		return;
	}
	LPNODE preNode = frontNode;
	LPNODE curNode = frontNode;
	while (curNode != NULL && curNode->data != data)
	{
		preNode = curNode;
		curNode = preNode->tail;
	}
	if (curNode == nullptr)
	{
		printf("鏈表中沒有該數(shù)據(jù)");
		return nullptr;
	}
 
	return curNode;
 
}

雙向鏈表的插入

插入節(jié)點(diǎn),我們分為頭部插入和尾部插入以及指定位置插入。而這三種插入,都可分為3步。

(1)創(chuàng)建新節(jié)點(diǎn)

(2)找到插入位置

(3)插入

我們就以制定位置插入為例,如圖所示,我們只需把原來相連的兩個(gè)節(jié)點(diǎn)斷開,然后再分別用指針拼接起來,當(dāng)然我們也可以調(diào)用我們的seachNode來查找位置,這樣就更方便一些了。

void duplexHead::push_appoin(int posData, int data)
{
 
	if (curSize == 0)
		return;
	if (frontNode->data == posData)
	{
		push_front(data);
	}
	else
	{
		LPNODE preNode = frontNode;
		LPNODE curNode = frontNode;
		while (curNode != NULL && curNode->data != posData)
		{
			preNode = curNode;
			curNode = preNode->tail;
		}
		if (curNode == NULL)
		{
			printf("未找到指定位置,無法插入!\n");
		}
		else
		{
			LPNODE newNode = createNode(data);
			preNode->tail = newNode;
			newNode->tail = curNode;
			curNode->front = newNode;
			newNode->front = preNode;
			curSize++;
		}
	}
}

雙向鏈表的節(jié)點(diǎn)刪除

刪除節(jié)點(diǎn)我們也可以分為頭部刪除,尾部刪除,指定數(shù)據(jù)刪除。他與插入節(jié)點(diǎn)幾乎是一樣的

(1)找到刪除位置

(2)刪除

我們就以指定數(shù)據(jù)刪除為例,我們通過while或者seachNode來查找到要?jiǎng)h除的節(jié)點(diǎn),然后把他的front 指向的位置和tail指向的位置記住,就可以直接刪除節(jié)點(diǎn)了。刪除完了節(jié)點(diǎn)要記得把前后段的鏈表連接上即可。

 
void duplexHead::pop_appoin(int posData)
{
	if (frontNode == NULL || curSize == 0)
	{
		printf("鏈表為空無法刪除!");
		return;
	}
	if (frontNode->data == posData)
	{
		pop_front();
		return;
	}
	LPNODE preNode = frontNode;
	LPNODE curNode = frontNode;
	while (curNode != NULL && curNode->data != posData)
	{
		preNode = curNode;
		curNode = preNode->tail;
	}
	if (curNode == NULL)
	{
		printf("未找到指定位置無法刪除!\n");
	}
	else
	{
		if (tailNode == curNode)
		{
			pop_back();
		}
		else
		{
			preNode->tail = curNode->tail;
			//curNode->tail是不是不空
			//當(dāng)刪除的表尾時(shí)候,curNode->tail等于空
			curNode->tail->front = preNode;
			free(curNode);
			curNode = NULL;
			curSize--;
		}
	}
}

雙向鏈表的刪除

于雙向鏈表的創(chuàng)建一樣,我們可以把雙向鏈表的刪除放在析構(gòu)函數(shù)中,實(shí)現(xiàn)創(chuàng)建和刪除自動(dòng)化,當(dāng)對象被創(chuàng)建,雙向鏈表就被創(chuàng)建,當(dāng)對象消亡,雙向鏈表就刪除了。

duplexHead::~duplexHead()
{
	if (!frontNode)return;
	LPNODE pmove ;
	
 
	while (!pmove)
	{
		pmove = frontNode->tail;
		delete frontNode->tail;
		frontNode = pmove;
	}
 
}

總結(jié)

到此這篇關(guān)于C語言類的雙向鏈表詳解的文章就介紹到這了,更多相關(guān)C語言雙向鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++Vector容器常用函數(shù)接口詳解

    C++Vector容器常用函數(shù)接口詳解

    最近我學(xué)習(xí)了C++中的STL庫中的vector容器,對于常用容器,我們不僅要會(huì)使用其常用的函數(shù)接口,我們還有明白這些接口在其底層是如何實(shí)現(xiàn)的。所以特意整理出來一篇博客供我們學(xué)習(xí)
    2022-08-08
  • C語言設(shè)計(jì)實(shí)現(xiàn)掃描器的自動(dòng)機(jī)的示例詳解

    C語言設(shè)計(jì)實(shí)現(xiàn)掃描器的自動(dòng)機(jī)的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C語言設(shè)計(jì)實(shí)現(xiàn)掃描器的自動(dòng)機(jī),可識(shí)別的單詞包括:關(guān)鍵字、界符、標(biāo)識(shí)符和常整型數(shù),感興趣的小伙伴可以了解一下
    2022-12-12
  • C++如何調(diào)用已經(jīng)寫好的C接口

    C++如何調(diào)用已經(jīng)寫好的C接口

    如何在C++代碼中調(diào)用寫好的C接口?你可能會(huì)奇怪,C++不是兼容C嗎?直接調(diào)用不就可以了,那么我們來測試一下,先看看C++如何調(diào)用C代碼接口的,需要的朋友可以參考一下
    2021-10-10
  • C語言也有封裝,繼承和多態(tài)你知道嗎

    C語言也有封裝,繼承和多態(tài)你知道嗎

    這篇文章主要為大家詳細(xì)介紹了C語言封裝,繼承,多態(tài),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • VS2019配置BOOST的方法(v1.70.0庫)

    VS2019配置BOOST的方法(v1.70.0庫)

    這篇文章主要介紹了VS2019配置BOOST的方法(v1.70.0庫),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C++17新特性個(gè)人總結(jié)

    C++17新特性個(gè)人總結(jié)

    這篇文章主要介紹了C++17新特性個(gè)人總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C++ 中CListCtrl的每個(gè)項(xiàng)都顯示不同的提示信息

    C++ 中CListCtrl的每個(gè)項(xiàng)都顯示不同的提示信息

    這篇文章主要介紹了C++ 中CListCtrl的每個(gè)項(xiàng)都顯示不同的提示信息的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • C/C++中typedef的用法大全

    C/C++中typedef的用法大全

    typedef用法一共七種,分別是:為基本數(shù)據(jù)類型起別名、為結(jié)構(gòu)體起別名、為指針類型起別名、為數(shù)組類型起別名、為枚舉類型起別名、為模版函數(shù)起別名。本文就來分別講講這7個(gè)用法的具體實(shí)現(xiàn)吧
    2023-04-04
  • C++實(shí)現(xiàn)json形式的Socket傳輸圖片

    C++實(shí)現(xiàn)json形式的Socket傳輸圖片

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)json形式的Socket傳輸圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++實(shí)現(xiàn)LeetCode(164.求最大間距)

    C++實(shí)現(xiàn)LeetCode(164.求最大間距)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(164.求最大間距),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

常熟市| 马公市| 平湖市| 彭水| 灵石县| 日喀则市| 乳山市| 贵溪市| 铁力市| 山阴县| 安岳县| 开鲁县| 海口市| 杭锦旗| 怀宁县| 河东区| 莱西市| 舟曲县| 汪清县| 揭西县| 安塞县| 四子王旗| 绥德县| 新巴尔虎右旗| 林芝县| 天柱县| 思茅市| 衡阳县| 长治县| 堆龙德庆县| 铜梁县| 武川县| 康马县| 南投市| 东源县| 金门县| 兰州市| 抚远县| 合江县| 铜山县| 新邵县|