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

C語(yǔ)言實(shí)現(xiàn)帶頭雙向循環(huán)鏈表

 更新時(shí)間:2022年03月28日 08:57:19   作者:_奇奇  
本文主要介紹了C語(yǔ)言實(shí)現(xiàn)帶頭雙向循環(huán)鏈表,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

在這里插入圖片描述

在實(shí)際生活中最常用的就是這兩種鏈表。無(wú)頭單向非循環(huán)鏈表。和帶頭雙向循環(huán)鏈表。
無(wú)頭單向非循環(huán)鏈表:結(jié)構(gòu)簡(jiǎn)單,一般不會(huì)單獨(dú)用來(lái)存數(shù)據(jù)。實(shí)際中更多是作為其他數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),如哈希桶、圖的鄰接表等等。另外這種結(jié)構(gòu)在筆試面試中出現(xiàn)很多。
帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個(gè)結(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)單了,后面我們代碼實(shí)現(xiàn)了就知道了。

1. 創(chuàng)建結(jié)構(gòu)體

注意:typedef起作用是在第7行哦。所以第5,6還需要寫(xiě)struct ListNode類型。

typedef int LNDataType;

typedef struct ListNode
{
	  struct ListNode* prev;
 	  struct ListNode* next;
      LNDataType val;
}LN;

2.malloc新節(jié)點(diǎn)

注意:需判斷新開(kāi)辟的節(jié)點(diǎn)是否為空。

//申請(qǐng)一個(gè)新節(jié)點(diǎn)
LN* BuynewNode(LNDataType x)
{
	LN* newNode = (LN*)malloc(sizeof(LN));
	if (newNode == NULL)
	{
		printf("malloc fail");
		exit(-1);
	}
	newNode->next = NULL;
	newNode->prev = NULL;
	newNode->val = x;
	return newNode;
}

3.創(chuàng)建哨兵位節(jié)點(diǎn)

注意:這里因?yàn)樾枰淖僷list指針的內(nèi)容,也就是改變plist指針的指向,所以需要傳遞plist的地址。

一句話就是:需要改變誰(shuí)的內(nèi)容,就傳誰(shuí)的地址。

這里有一點(diǎn)非常巧非常妙,就是phead的后繼和前驅(qū)都是指向自己(phead),這里是模仿C++STL庫(kù)里的哨兵位節(jié)點(diǎn)。

只能佩服想出來(lái)這些東西的大神。這樣設(shè)計(jì)哨兵位節(jié)點(diǎn)的話,后續(xù)尾插,尾刪,都特別的巧妙。

在這里插入圖片描述

在這里插入圖片描述

test.c

	LN* plist = NULL;
	ListNodeInit(&plist);

List.h

//初始化節(jié)點(diǎn)
void ListNodeInit(LN** pphead)
{
	LN* newNode = BuynewNode(0);
	*pphead = newNode;
	(*pphead)->next = *pphead;
	(*pphead)->prev = *pphead;
}

4.尾插

注意:需要斷言的原因是因?yàn)椋词规湵頉](méi)有一個(gè)節(jié)點(diǎn),那鏈表至少還有個(gè)頭,所以phead肯定不為空。

這里沒(méi)有傳地址的原因是因?yàn)?,你不需要改變plist的指向,你改變的是plist指向的結(jié)構(gòu)體里面的值。

多個(gè)節(jié)點(diǎn)尾插的情況如圖。

在這里插入圖片描述

一個(gè)節(jié)點(diǎn)的尾插。

在這里插入圖片描述

//尾插
void ListNodePushBack(LN* phead, LNDataType x)
{
	assert(phead);
	LN* newNode = BuynewNode(x);
	LN* tail = phead->prev;
	tail->next = newNode;
	newNode->prev = tail;
	newNode->next = phead;
	phead->prev = newNode;
}

5.打印

注意:因?yàn)閹€(gè)頭,所以cur從第二個(gè)位置開(kāi)始。

//打印
void ListNodePrint(LN* phead)
{
	LN* cur = phead->next;
	while (cur != phead)
	{
		printf("%d ", cur->val);
		cur = cur->next;
	}
	printf("\n");
}

6.尾刪

注意不能刪掉頭結(jié)點(diǎn),free掉頭結(jié)點(diǎn)的話會(huì)造成野指針,再次訪問(wèn)時(shí)會(huì)造成非法訪問(wèn)。
所以要用assert斷言不為首節(jié)點(diǎn)。

//尾刪
void ListNodePopBack(LN* phead)
{
	assert(phead);
	assert(phead->next != phead);
	LN* tail = phead->prev;
	LN* tailPrev = tail->prev;
	free(tail);
	tail = NULL;
	phead->prev = tailPrev;
	tailPrev->next = phead;
}

7.頭插

最好用next記錄下一個(gè)節(jié)點(diǎn)。這樣方便,思路清晰

//頭插
void ListNodePushFront(LN* phead, LNDataType x)
{
	assert(phead);
	LN* newNode = BuynewNode(x);
	LN* next = phead->next;
	phead->next = newNode;
	newNode->prev = phead;
	newNode->next = next;
	next->prev = newNode;
}

8.在指定位置pos的前面進(jìn)行插入

一般情況

在這里插入圖片描述

只有一個(gè)節(jié)點(diǎn)時(shí)。

在這里插入圖片描述

兩種情況都適用以下代碼。

//指定位置前插入,極限是頭插
void ListNodeInsert(LN* pos, LNDataType x)
{
	if (pos == NULL)
	{
		printf("沒(méi)有找到這個(gè)數(shù)\n");
		return;
	}
	LN* newNode = BuynewNode(x);
	LN* tailPrev = pos->prev;
	tailPrev->next = newNode;
	newNode->prev = tailPrev;
	newNode->next = pos;
	pos->prev = newNode;
}

9. 刪除指定位置pos節(jié)點(diǎn)

正常情況

在這里插入圖片描述

極限尾刪

在這里插入圖片描述

兩種情況都適用以下代碼。

//指定位置刪除
void ListNodeErease(LN* phead, LN* pos)
{
	if (pos == phead || pos == NULL)
	{
		printf("pos指向頭,或?yàn)榭誠(chéng)n");
		return;
	}
	LN* posPrev = pos->prev;
	LN* posNext = pos->next;
	posPrev->next = posNext;
	posNext->prev = posPrev;
	free(pos);
	pos = NULL;
}

10.銷毀鏈表

注意:這里相當(dāng)于malloc用完之后的free。否則會(huì)造成內(nèi)存泄漏。
cur可以置空,但用處不大,因?yàn)閏ur是形參,形參是實(shí)參的一份臨時(shí)拷貝,形參置空并不能改變實(shí)參。外部的實(shí)參還是依舊能非法訪問(wèn)到cur所指向的空間。

//鏈表銷毀
void ListNodeDestroy(LN* phead)
{
	assert(phead);
	LN* cur = phead->next;
	LN* next = cur->next;
	while (cur != phead)
	{
		next = cur->next;
		free(cur);
		cur = NULL;
		cur = next;
	}
	free(phead);
	phead = NULL;
}

到此這篇關(guān)于C語(yǔ)言實(shí)現(xiàn)帶頭雙向循環(huán)鏈表的文章就介紹到這了,更多相關(guān)C語(yǔ)言 帶頭雙向循環(huán)鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++11獲取線程返回值的實(shí)現(xiàn)代碼

    C++11獲取線程返回值的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++11獲取線程返回值的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2019-04-04
  • C語(yǔ)言實(shí)現(xiàn)合式公式的判斷示例

    C語(yǔ)言實(shí)現(xiàn)合式公式的判斷示例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)合式公式的判斷示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C++遞歸刪除一個(gè)目錄實(shí)例

    C++遞歸刪除一個(gè)目錄實(shí)例

    這篇文章主要介紹了C++遞歸刪除一個(gè)目錄的實(shí)現(xiàn)方法,涉及到目錄的操作及遞歸算法的應(yīng)用,需要的朋友可以參考下
    2014-10-10
  • c++截取漢字和英文混合字符串代碼實(shí)例

    c++截取漢字和英文混合字符串代碼實(shí)例

    這篇文章主要介紹了c++截取漢字英文混合字符串,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳細(xì)分析Android中實(shí)現(xiàn)Zygote的源碼

    詳細(xì)分析Android中實(shí)現(xiàn)Zygote的源碼

    這篇文章主要介紹了詳細(xì)分析Android中實(shí)現(xiàn)Zygote的源碼,包括底層的C/C++代碼以及Java代碼部分入口,需要的朋友可以參考下
    2015-07-07
  • C++?Protobuf實(shí)現(xiàn)接口參數(shù)自動(dòng)校驗(yàn)詳解

    C++?Protobuf實(shí)現(xiàn)接口參數(shù)自動(dòng)校驗(yàn)詳解

    用C++做業(yè)務(wù)發(fā)開(kāi)的同學(xué)是否還在不厭其煩的編寫(xiě)大量if-else模塊來(lái)做接口參數(shù)校驗(yàn)?zāi)??今天,我們就模擬Java里面通過(guò)注解實(shí)現(xiàn)參數(shù)校驗(yàn)的方式來(lái)針對(duì)C++?protobuf接口實(shí)現(xiàn)一個(gè)更加方便、快捷的參數(shù)校驗(yàn)自動(dòng)工具,希望對(duì)大家有所幫助
    2023-04-04
  • 簡(jiǎn)述c++ 發(fā)展史

    簡(jiǎn)述c++ 發(fā)展史

    這篇文章主要介紹了c++ 發(fā)展的過(guò)程,幫助大家更好的了解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • MATLAB實(shí)現(xiàn)五子棋游戲(雙人對(duì)戰(zhàn)、可悔棋)

    MATLAB實(shí)現(xiàn)五子棋游戲(雙人對(duì)戰(zhàn)、可悔棋)

    這篇文章主要為大家詳細(xì)介紹了MATLAB實(shí)現(xiàn)五子棋游戲,可以進(jìn)行雙人對(duì)戰(zhàn)、也可悔棋,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C 語(yǔ)言中實(shí)現(xiàn)環(huán)形緩沖區(qū)

    C 語(yǔ)言中實(shí)現(xiàn)環(huán)形緩沖區(qū)

    本文主要是介紹 C語(yǔ)言實(shí)現(xiàn)環(huán)形緩沖區(qū),并附有詳細(xì)實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,希望能幫助有需要的小伙伴
    2016-07-07
  • 基于c++ ege圖形庫(kù)實(shí)現(xiàn)五子棋游戲

    基于c++ ege圖形庫(kù)實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了基于c++ ege圖形庫(kù)實(shí)現(xiàn)五子棋游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評(píng)論

鱼台县| 江川县| 黑水县| 奉新县| 蒲江县| 凤山县| 双江| 绥滨县| 怀安县| 苏尼特右旗| 滦南县| 舟山市| 通州区| 兴海县| 柳州市| 马尔康县| 临澧县| 云安县| 赫章县| 萍乡市| 哈巴河县| 栾川县| 长宁区| 达日县| 南澳县| 浑源县| 竹山县| 阳春市| 潼关县| 吉林省| 京山县| 辽中县| 阳江市| 南木林县| 葫芦岛市| 六盘水市| 古交市| 嘉善县| 汶上县| 夏邑县| 凤翔县|