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

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

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

前言

??前面我們學(xué)習(xí)了單鏈表的實(shí)現(xiàn),我們發(fā)現(xiàn)它在進(jìn)行從后往前查找的時(shí)候有很大的不便,為了解決這個(gè)問(wèn)題,雙向鏈表油然而生。它可以很好的解決單鏈表無(wú)法從后往前查找的困難。

雙向鏈表的結(jié)構(gòu)

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

??如圖所示,它是有兩個(gè)指針域,一個(gè)指向后一個(gè)結(jié)點(diǎn),一個(gè)指向前一個(gè)結(jié)點(diǎn)。它存儲(chǔ)了前一個(gè)結(jié)點(diǎn)的地址與后一個(gè)結(jié)點(diǎn)的地址,所以可以很方便的進(jìn)行向前遍歷或者向后遍歷。同時(shí)它還是一個(gè)循環(huán)鏈表,可以通過(guò)第一個(gè)結(jié)點(diǎn)直接找到最后一個(gè)結(jié)點(diǎn)。

功能的解析及實(shí)現(xiàn)

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

??就像前文所說(shuō),它包含了兩個(gè)指針域和一個(gè)數(shù)據(jù)域,用來(lái)存放它前一個(gè)結(jié)點(diǎn)的地址和后一個(gè)結(jié)點(diǎn)的地址以及本身的數(shù)據(jù)。

typedef struct LTNode
{
	LTDataType data;
	struct LTNode* prev;
	struct LTNode* next;
}LTNode;

2. 創(chuàng)建頭節(jié)點(diǎn)(初始化)

??此次雙向鏈表的結(jié)構(gòu)我是采用了帶頭結(jié)點(diǎn)的結(jié)構(gòu),好處就是頭節(jié)點(diǎn)是malloc出來(lái)的,是在堆區(qū)上存放,不會(huì)因?yàn)槌隽撕瘮?shù)就被銷毀,也意味著后續(xù)的各種操作我們只需要傳遞一級(jí)指針就會(huì)有實(shí)現(xiàn)單鏈表時(shí)傳遞二級(jí)指針的效果。

LTNode* ListInit()
{
	LTNode* phead = (LTNode*)malloc(sizeof(LTNode));
	if (phead == NULL)
	{
		return NULL;
	}
	phead->prev = phead;
	phead->next = phead;
	return phead;
}

3. 創(chuàng)建新結(jié)點(diǎn)

??每次插入新的數(shù)據(jù)都需要開辟新的結(jié)點(diǎn),因此把它單獨(dú)拿出來(lái)放到一個(gè)函數(shù)中實(shí)現(xiàn)。

LTNode* BuyListNode(LTDataType x)
{
	LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));
	if (newnode == NULL)
	{
		return NULL;
	}
	newnode->data = x;
	newnode->prev = NULL;
	newnode->next = NULL;
	return newnode;
}

4. 尾插

??因?yàn)槭茄h(huán)鏈表,我們可以通過(guò)第一個(gè)頭節(jié)點(diǎn)直接找到尾結(jié)點(diǎn),而在連接的時(shí)候,需要將新結(jié)點(diǎn)分別連接到頭節(jié)點(diǎn)的prev以及尾結(jié)點(diǎn)的next,同時(shí)自身的prev存放尾結(jié)點(diǎn)的地址,next存放頭節(jié)點(diǎn)的地址。如圖:
數(shù)據(jù)結(jié)構(gòu)篇三:雙向循環(huán)鏈表

void ListPushBack(LTNode* phead, LTDataType x)
{
	assert(phead);
	LTNode* tail = phead->prev;
	LTNode* newnode = BuyListNode(x);
	
	newnode->data = x;
	newnode->next = phead;
	phead->prev = newnode;
	newnode->prev = tail;
	tail->next = newnode;
}

5. 尾刪

??在創(chuàng)建頭節(jié)點(diǎn)時(shí),我們是將頭節(jié)點(diǎn)的prev與next都指向了它自身,因此我們可以通過(guò)頭節(jié)點(diǎn)的next指向的是不是自身來(lái)判斷是否為存放了數(shù)據(jù)。(頭節(jié)點(diǎn)自身不存放數(shù)據(jù))。與尾插類似,如圖:
數(shù)據(jù)結(jié)構(gòu)篇三:雙向循環(huán)鏈表

void ListPopBack(LTNode* phead)
{
	assert(phead);
	if (phead->next == phead)//判斷鏈表是否存放了數(shù)據(jù)
	{
		return;
	}
	LTNode* tail = phead->prev;
	LTNode* prev = tail->prev;

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

6. 頭插

??與尾插類似,只不過(guò)這個(gè)放到了最前面。在尾插是我們是有tail與phead來(lái)與新結(jié)點(diǎn)連接,頭插也一樣。先保存當(dāng)前的第一個(gè)結(jié)點(diǎn)地址,然后再將新結(jié)點(diǎn)連接到頭節(jié)點(diǎn)與原第一個(gè)結(jié)點(diǎn)的中間即可。

void ListPushFront(LTNode* phead, LTDataType x)
{
	assert(phead);
	LTNode* next = phead->next;//保存當(dāng)前的第一個(gè)結(jié)點(diǎn)地址
	LTNode* newnode = BuyListNode(x);

	newnode->prev = phead;
	phead->next = newnode;

	newnode->next = next;
	next->prev = newnode;
}

7. 頭刪

??我們只需要保存第一個(gè)結(jié)點(diǎn)與第二節(jié)結(jié)點(diǎn)的地址,然后在將第二個(gè)與頭節(jié)點(diǎn)連接,再釋放掉第一個(gè)結(jié)點(diǎn)即可。同時(shí)還需要判斷鏈表是否為空(即有沒有元素存放其中)。

void ListPopFront(LTNode* phead)
{
	//assert(phead->next != phead);  //暴力解決

	//溫和解決
	if (phead->next == phead)
	{
		return;
	}
	LTNode* prev = phead->next;
	LTNode* next = prev->next;

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

8. 查找

??依次遍歷鏈表即可,從phead開始,一直到再次遇到phead結(jié)束(循環(huán)鏈表)。

LTNode* ListFind(LTNode* phead, LTDataType x)
{
	LTNode* cur = phead->next;
	while (cur != phead)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	printf("該元素不存在\n");
	return NULL;
}

9. 在pos位置前插入

??與頭插相似,這里只需要用prev保存pos位置的前一個(gè)結(jié)點(diǎn)地址,然后將新結(jié)點(diǎn)與prev與pos相連接即可。

void ListInsert(LTNode* pos, LTDataType x)
{
	LTNode* prevPos = pos->prev;
	LTNode* newnode = BuyListNode(x);

	newnode->next = pos;
	pos->prev = newnode;

	newnode->prev = prevPos;
	prevPos->next = newnode;
}

10. 刪除pos位置的結(jié)點(diǎn)

??保存pos的前一個(gè)結(jié)點(diǎn)地址與后一個(gè)結(jié)點(diǎn)地址,然后將彼此相連接,然后free掉pos結(jié)點(diǎn)就完成了。

void ListErase(LTNode* pos)
{
	LTNode* nextPos = pos->next;
	LTNode* prevPos = pos->prev;

	nextPos->prev = prevPos;
	prevPos->next = nextPos;
	free(pos);
	pos = NULL;
}

11. 銷毀

??動(dòng)態(tài)開辟的結(jié)點(diǎn)在最后結(jié)束時(shí)都需要進(jìn)行釋放,防止出現(xiàn)內(nèi)存泄漏。用cur保存當(dāng)前準(zhǔn)備要釋放的結(jié)點(diǎn),用next保存cur的下一個(gè)結(jié)點(diǎn),釋放完cur后,再將cur指向next,進(jìn)行循環(huán)。

void ListDestroy(LTNode* phead)
{
	LTNode* cur = phead;
	LTNode* next = cur->next;

	while (cur)
	{
		free(cur);
		cur = NULL;

		if (cur != NULL)
		{
			cur = next;
			next = next->next;
		}
	}
}

代碼實(shí)現(xiàn)

1.ListNode.h

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

typedef int LTDataType;

typedef struct LTNode
{
	LTDataType data;
	struct LTNode* prev;
	struct LTNode* next;
}LTNode;

// 創(chuàng)建返回鏈表的頭結(jié)點(diǎn).
LTNode* ListInit();

// 雙向鏈表銷毀
void ListDestroy(LTNode* phead);

// 雙向鏈表打印
void ListPrint(LTNode* phead);

// 雙向鏈表尾插
void ListPushBack(LTNode* phead, LTDataType x);

// 雙向鏈表尾刪
void ListPopBack(LTNode* phead);

// 雙向鏈表頭插
void ListPushFront(LTNode* phead, LTDataType x);

// 雙向鏈表頭刪
void ListPopFront(LTNode* phead);

// 雙向鏈表查找
LTNode* ListFind(LTNode* phead, LTDataType x);

// 雙向鏈表在pos的前面進(jìn)行插入
void ListInsert(LTNode* pos, LTDataType x);

// 雙向鏈表刪除pos位置的節(jié)點(diǎn)
void ListErase(LTNode* pos);

2. ListNode.c

#include"ListNode.h"

LTNode* BuyListNode(LTDataType x)
{
	LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));
	if (newnode == NULL)
	{
		return NULL;
	}
	newnode->data = x;
	newnode->prev = NULL;
	newnode->next = NULL;
	return newnode;
}
LTNode* ListInit()
{
	LTNode* phead = (LTNode*)malloc(sizeof(LTNode));
	if (phead == NULL)
	{
		return NULL;
	}
	phead->prev = phead;
	phead->next = phead;
	return phead;
}

void ListPushBack(LTNode* phead, LTDataType x)
{
	assert(phead);
	LTNode* tail = phead->prev;
	LTNode* newnode = BuyListNode(x);
	
	newnode->data = x;
	newnode->next = phead;
	phead->prev = newnode;
	newnode->prev = tail;
	tail->next = newnode;
}

void ListPrint(LTNode* phead)
{
	LTNode* cur = phead->next;
	while (cur != phead)
	{
		printf("%d ", cur->data);
		cur = cur->next;
	}
	printf("\n");
}

void ListPopBack(LTNode* phead)
{
	assert(phead);
	if (phead->next == phead)
	{
		return;
	}
	LTNode* tail = phead->prev;
	LTNode* prev = tail->prev;

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

void ListPushFront(LTNode* phead, LTDataType x)
{
	assert(phead);
	LTNode* next = phead->next;
	LTNode* newnode = BuyListNode(x);

	newnode->prev = phead;
	phead->next = newnode;

	newnode->next = next;
	next->prev = newnode;
}

void ListPopFront(LTNode* phead)
{
	//assert(phead->next != phead);  //暴力解決

	//溫和解決
	if (phead->next == phead)
	{
		return;
	}
	LTNode* prev = phead->next;
	LTNode* next = prev->next;

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

LTNode* ListFind(LTNode* phead, LTDataType x)
{
	LTNode* cur = phead->next;
	while (cur != phead)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	printf("該元素不存在\n");
	return NULL;
}

void ListInsert(LTNode* pos, LTDataType x)
{
	LTNode* prevPos = pos->prev;
	LTNode* newnode = BuyListNode(x);

	newnode->next = pos;
	pos->prev = newnode;

	newnode->prev = prevPos;
	prevPos->next = newnode;
}

void ListErase(LTNode* pos)
{
	LTNode* nextPos = pos->next;
	LTNode* prevPos = pos->prev;

	nextPos->prev = prevPos;
	prevPos->next = nextPos;
	free(pos);
	pos = NULL;
}

void ListDestroy(LTNode* phead)
{
	LTNode* cur = phead;
	LTNode* next = cur->next;

	while (cur)
	{
		free(cur);
		cur = NULL;

		if (cur != NULL)
		{
			cur = next;
			next = next->next;
		}
	}
}

3. test.c

#include"ListNode.h"

void test()
{
	LTNode* phead = ListInit();
	if (phead == NULL)
	{
		return;
	}
	ListPushBack(phead, 1);//測(cè)試:尾插
	ListPushBack(phead, 2);
	ListPushBack(phead, 3);
	ListPushBack(phead, 4);
	ListPrint(phead);

  	ListPopBack(phead);//測(cè)試:尾刪
	ListPopBack(phead);
	ListPopBack(phead);
	ListPrint(phead);

	ListPopBack(phead);//測(cè)試:如果鏈表為空繼續(xù)刪除會(huì)不會(huì)報(bào)錯(cuò)
	ListPopBack(phead);

	ListPushBack(phead, 1);//尾插一個(gè)數(shù)據(jù)來(lái)對(duì)比頭插
	ListPushFront(phead, 1);//測(cè)試:頭插
	ListPushFront(phead, 2);
	ListPushFront(phead, 3);
	ListPushFront(phead, 4);
	ListPrint(phead);

	ListPopFront(phead);//測(cè)試:頭刪
	ListPopFront(phead);
	ListPopFront(phead);
	ListPrint(phead);

	ListPopFront(phead);//測(cè)試:如果鏈表刪除完畢,繼續(xù)刪除會(huì)不會(huì)報(bào)錯(cuò)
	ListPopFront(phead);
	ListPopFront(phead);
	ListPrint(phead);

	ListPushBack(phead, 1);//插入新元素進(jìn)行后續(xù)測(cè)試
	ListPushBack(phead, 2);
	ListPushBack(phead, 3);
	ListPushBack(phead, 4);
	ListPrint(phead);
	ListFind(phead, 5);

	LTNode* pos = ListFind(phead, 2);//測(cè)試:在2前面插入數(shù)字5
	ListInsert(pos, 5);
	ListPrint(phead);

	pos = ListFind(phead, 2);//測(cè)試:刪除結(jié)點(diǎn)2
	ListErase(pos);
	ListPrint(phead);

	ListDestroy(phead);//測(cè)試:銷毀鏈表
}

int main()
{
	test();
	return 0;
}

總結(jié)

??總體而言難度不大,并且雙向鏈表解決了單鏈表的很多問(wèn)題,值得好好學(xué)習(xí)一下。并且在這里總結(jié)一下數(shù)據(jù)結(jié)構(gòu)中形參能對(duì)實(shí)參產(chǎn)生影響的三種方式:二級(jí)指針,頭節(jié)點(diǎn)(在堆區(qū)),返回值。
??雙向循環(huán)鏈表就先告一段落了,如果發(fā)現(xiàn)文章哪里有問(wèn)題可以在評(píng)論區(qū)提出來(lái)或者私信我嗷。接下來(lái)我會(huì)繼續(xù)學(xué)習(xí)棧與隊(duì)列,開啟新的篇章,那么本期就到此結(jié)束,讓我們下期再見!!覺得不錯(cuò)可以點(diǎn)個(gè)贊以示鼓勵(lì)喔?。?span toymoban-style="hidden">文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-434446.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)篇三:雙向循環(huán)鏈表的文章就介紹完了。如果您還想了解更多內(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)——帶頭雙向循環(huán)鏈表

    數(shù)據(jù)結(jié)構(gòu)——帶頭雙向循環(huán)鏈表

    在創(chuàng)建帶頭雙向循環(huán)鏈表的節(jié)點(diǎn)中比之前單鏈表節(jié)點(diǎn)的創(chuàng)建多了一個(gè)struct ListNode* prev;結(jié)構(gòu)體指針,目的在與存儲(chǔ)前一個(gè)節(jié)點(diǎn)的地址,便于將整個(gè)鏈表連在一起。 動(dòng)態(tài)申請(qǐng)內(nèi)存結(jié)點(diǎn),函數(shù)返回的是一個(gè)指針類型,用malloc開辟一個(gè)LTNode大小的空間,并用node指向這個(gè)空間,再判斷

    2024年02月09日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)之帶頭雙向循環(huán)鏈表

    數(shù)據(jù)結(jié)構(gòu)之帶頭雙向循環(huán)鏈表

    目錄 鏈表的分類 帶頭雙向循環(huán)鏈表的實(shí)現(xiàn) 帶頭雙向循環(huán)鏈表的結(jié)構(gòu) 帶頭雙向循環(huán)鏈表的結(jié)構(gòu)示意圖 空鏈表結(jié)構(gòu)示意圖 單結(jié)點(diǎn)鏈表結(jié)構(gòu)示意圖 ?多結(jié)點(diǎn)鏈表結(jié)構(gòu)示意圖 鏈表創(chuàng)建結(jié)點(diǎn) 雙向鏈表初始化 銷毀雙向鏈表 打印雙向鏈表 ?雙向鏈表尾插 尾插函數(shù)測(cè)試 雙向鏈表頭插

    2024年02月08日
    瀏覽(17)
  • 數(shù)據(jù)結(jié)構(gòu)_帶頭雙向循環(huán)鏈表

    相較于之前的順序表和單向鏈表,雙向鏈表的邏輯結(jié)構(gòu)稍微復(fù)雜一些,但是在實(shí)現(xiàn)各種接口的時(shí)候是很簡(jiǎn)單的。因?yàn)椴挥谜椅?,寫起?lái)會(huì)舒服一點(diǎn)。(也可能是因?yàn)樽罱恢痹趯戇@個(gè)的原因) 在實(shí)現(xiàn)接口的時(shí)候,除了沒有找尾,其他的操作和單向鏈表是差不多的,這里就不多

    2024年04月14日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)】實(shí)現(xiàn)帶頭雙向循環(huán)鏈表

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

    之前我們已經(jīng)學(xué)習(xí)了單鏈表,有了單鏈表的基礎(chǔ),現(xiàn)在開始學(xué)習(xí)帶頭雙向循環(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)單

    2024年02月10日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】帶頭雙向循環(huán)鏈表及其實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】帶頭雙向循環(huán)鏈表及其實(shí)現(xiàn)

    目錄 1.帶頭雙向循環(huán)鏈表 2.帶頭雙向循環(huán)鏈表實(shí)現(xiàn) 2.1初始化 2.2銷毀 2.3頭插 2.4鏈表打印 2.5頭刪數(shù)據(jù) 2.6尾插數(shù)據(jù) 2.7尾刪數(shù)據(jù) 2.8鏈表判空? 2.9查找一個(gè)數(shù)據(jù) 2.10在pos位置前插入數(shù)據(jù) 2.11刪除pos位置 2.12求鏈表的長(zhǎng)度 2.順序表和鏈表的比較 我們已經(jīng)實(shí)現(xiàn)了無(wú)頭單向循環(huán)鏈表 帶頭雙

    2024年02月10日
    瀏覽(25)
  • 數(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)鏈表

    帶頭雙向循環(huán)鏈表的優(yōu)點(diǎn) 1.支持任意位置時(shí)間復(fù)雜度為O(1)的插入和刪除。 2.按照需求申請(qǐng)釋放空間,無(wú)需擔(dān)心空間不夠用,無(wú)需擔(dān)心浪費(fèi)。 3.帶頭可以省去鏈表為空時(shí)的判斷,可以使代碼更加簡(jiǎn)約 帶頭雙向循環(huán)鏈表的缺點(diǎn) 1.不可以進(jìn)行下標(biāo)隨機(jī)訪問(wèn)。 2.緩存利用率低 帶頭雙

    2024年02月03日
    瀏覽(14)
  • 數(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)
  • 【數(shù)據(jù)結(jié)構(gòu)】雙向帶頭循環(huán)鏈表的實(shí)現(xiàn)

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

    前言:在前面我們學(xué)習(xí)了順序表、單向鏈表,今天我們?cè)趩捂湵淼幕A(chǔ)上進(jìn)一步來(lái)模擬實(shí)現(xiàn)一個(gè)帶頭雙向鏈表。 ?? 博主CSDN主頁(yè):衛(wèi)衛(wèi)衛(wèi)的個(gè)人主頁(yè) ?? ?? 專欄分類:數(shù)據(jù)結(jié)構(gòu) ?? ??代碼倉(cāng)庫(kù):衛(wèi)衛(wèi)周大胖的學(xué)習(xí)日記?? ??關(guān)注博主和博主一起學(xué)習(xí)!一起努力! 帶頭雙向循環(huán)鏈

    2024年01月15日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu): 線性表(帶頭雙向循環(huán)鏈表實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu): 線性表(帶頭雙向循環(huán)鏈表實(shí)現(xiàn))

    之前一章學(xué)習(xí)了單鏈表的相關(guān)操作, 但是單鏈表的限制卻很多, 比如不能倒序掃描鏈表, 解決方法是在數(shù)據(jù)結(jié)構(gòu)上附加一個(gè)域, 使它包含指向前一個(gè)單元的指針即可. 那么怎么定義數(shù)據(jù)結(jié)構(gòu)呢? 首先我們先了解以下鏈表的分類 鏈表的結(jié)構(gòu)非常多樣, 以下情況組合起來(lái)就有 8 中鏈表

    2024年02月14日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包