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

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

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。


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

一、概述

前幾篇文章介紹了怎樣去實(shí)現(xiàn)單鏈表、單循環(huán)鏈表,這篇文章主要介紹雙向鏈表以及實(shí)現(xiàn)雙向鏈表的步驟,最后提供我自己根據(jù)理解實(shí)現(xiàn)雙向鏈表的C語言代碼。跟著后面實(shí)現(xiàn)思路看下去,應(yīng)該可以看懂代碼,看懂代碼后,就對雙向鏈表有了比較抽象的理解了,最后自己再動手寫一個雙向鏈表,就基本理解這個東西了。
【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼

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

二、雙向鏈表

雙向鏈表:在單鏈表的每個結(jié)點(diǎn)中,再設(shè)置一個指向其前驅(qū)結(jié)點(diǎn)的指針域。
下圖是 單鏈表
【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼

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

雙向鏈表的特點(diǎn):

  1. 雙向鏈表可以反向訪問到鏈表的結(jié)點(diǎn),因?yàn)樗兄赶蚯耙粋€結(jié)點(diǎn)的指針prior;
  2. 帶有頭結(jié)點(diǎn)的雙向鏈表,為空鏈表時,頭結(jié)點(diǎn)的兩個指針域都指向NULL。
    【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼
  3. 帶有頭結(jié)點(diǎn)的雙向鏈表,為非空鏈表時,
    頭結(jié)點(diǎn)的前驅(qū)指針域指向NULL,后驅(qū)指針域指向第一個結(jié)點(diǎn);
    最后一個結(jié)點(diǎn)的前驅(qū)指針域指向前一個結(jié)點(diǎn),后驅(qū)指針域指向NULL;
    其他結(jié)點(diǎn)的前驅(qū)指針域指向前一個結(jié)點(diǎn),后驅(qū)指針域指向后一個結(jié)點(diǎn);
    【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼

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

三、雙向鏈表實(shí)現(xiàn)步驟

從上面知道了雙向鏈表的相關(guān)概念和一些特點(diǎn),接下來開始實(shí)現(xiàn)雙向鏈表,這里使用帶有頭結(jié)點(diǎn)的雙向鏈表進(jìn)行講解,從初始化雙向鏈表、插入數(shù)據(jù)、刪除數(shù)據(jù)、查找數(shù)據(jù)、銷毀雙向鏈表5個操作進(jìn)行說明,需要注意的是,雙向鏈表的插入、刪除操作需要改變兩個指針域;其他操作基本和單鏈表一致。

??3.1 C語言定義雙向鏈表結(jié)點(diǎn)

為了和前幾篇文章的鏈表做比較,雙向鏈表結(jié)構(gòu)體也盡量定義相似的。

typedef int ElemType;
typedef struct _DoubleListNode
{
	ElemType data;
	struct _DoubleListNode *prior;	// 前驅(qū)指針
	struct _DoubleListNode *next;	// 后驅(qū)指針
}DoubleListNode;
typedef DoubleListNode* DoubleLinkList;

??3.2 雙向鏈表初始化

因?yàn)閹в蓄^結(jié)點(diǎn),初始化時就需要分配一個頭結(jié)點(diǎn)的內(nèi)存空間,且頭指針會一直指向頭結(jié)點(diǎn)。
雙向鏈表初始化算法思路如下:

1、分配一個結(jié)點(diǎn)的存儲空間作為頭結(jié)點(diǎn),并將頭指針指向頭結(jié)點(diǎn);
2、讓頭結(jié)點(diǎn)的 prior指針 和 next指針 都指向NULL,頭結(jié)點(diǎn)的數(shù)據(jù)填一個無效值;
3、將頭指針返回給函數(shù)調(diào)用者。

C語言實(shí)現(xiàn)代碼如下:

DoubleLinkList ListInit()
{
	DoubleLinkList list = (DoubleLinkList)malloc(sizeof(DoubleListNode));
	list->prior = NULL;
	list->next = NULL;
	list->data = -1;
	return list;
}

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

??3.3 雙向鏈表插入數(shù)據(jù)

雙向鏈表插入數(shù)據(jù)大致分為兩個步驟:首先,找到插入位置n的前一個結(jié)點(diǎn);其次,是插入新結(jié)點(diǎn),可以:先連接新結(jié)點(diǎn)、再指向新結(jié)點(diǎn)的順序。
先連接新結(jié)點(diǎn):是先把新結(jié)點(diǎn)的兩個指針域分別連接當(dāng)前結(jié)點(diǎn)和下個結(jié)點(diǎn),new->prior = cur;、new->next = cur->next;
再指向新結(jié)點(diǎn):將當(dāng)前節(jié)點(diǎn)的的指針域指向新節(jié)點(diǎn),與舊節(jié)點(diǎn)斷開,cur->next->prior = new;、cur->next = new;
【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼

雙向鏈表在第n個位置插入數(shù)據(jù)的算法思路:

1、定義一個結(jié)點(diǎn)指針cur指向頭結(jié)點(diǎn),用來遍歷鏈表;
2、定義一個變量cur_i,用來表示當(dāng)前結(jié)點(diǎn)的序號,初始化為0表示當(dāng)前指向頭結(jié)點(diǎn);
3、將cur指針不斷往后移動,直到下個位置就是插入位置n,即當(dāng)cur_i==(n-1)跳出循環(huán);
4、若結(jié)束循環(huán)后是當(dāng)前結(jié)點(diǎn)無效,說明鏈表長度不夠;
5、否則,說明當(dāng)前結(jié)點(diǎn)cur的下個位置就是插入位置n,分配存儲空間給新結(jié)點(diǎn)new;
6、把值填進(jìn)新節(jié)點(diǎn)的數(shù)據(jù)域,用新結(jié)點(diǎn)prior指向當(dāng)前結(jié)點(diǎn),next指向當(dāng)前節(jié)點(diǎn)的下個節(jié)點(diǎn);
7、再將下個結(jié)點(diǎn)的prior指向新結(jié)點(diǎn),當(dāng)前結(jié)點(diǎn)的next指向新結(jié)點(diǎn),完成插入操作。

C語言實(shí)現(xiàn)代碼如下:

int ListInsert(DoubleLinkList list, int data, int n)// 將node插入到第n位,n從1開始
{
	if(list==NULL || n<1) // 判斷參數(shù)有效性
		return -1;
		
	DoubleListNode* cur = list;	// cur指向當(dāng)前結(jié)點(diǎn),初始化指向頭結(jié)點(diǎn)
		int cur_i=0;			// cur_i表示當(dāng)前結(jié)點(diǎn)的序號,0-頭結(jié)點(diǎn)
	while(cur && cur_i<(n-1))// 當(dāng)前結(jié)點(diǎn)有效,且不是插入位置的前一個結(jié)點(diǎn),就后移一個
	{
		cur = cur->next;
		cur_i++;
	}
	if(!cur)			// 當(dāng)前結(jié)點(diǎn)無效,說明已經(jīng)移動到最后
	{
		printf("[%s %d]error din't have No.%d\n", __FUNCTION__,__LINE__, n);
		return -1;	// 鏈表沒有 n 那么長
	}
	DoubleListNode* new = (DoubleListNode*)malloc(sizeof(DoubleListNode));
	new->data = data;
	new->prior = cur;
	new->next = cur->next;
	if(cur->next)		// 在最后一個結(jié)點(diǎn)插入時,cur->next==NULL
		cur->next->prior = new;
	cur->next = new;
	
	return 0;
}

??3.4 雙向鏈表刪除數(shù)據(jù)

雙向鏈表刪除結(jié)點(diǎn)也是需要改變兩個指針域,大致步驟如下,首先,找到刪除位置n的前一個結(jié)點(diǎn);其次,“把前一個結(jié)點(diǎn)的next指針域指向刪除結(jié)點(diǎn)del的下個結(jié)點(diǎn)”,“再把下個結(jié)點(diǎn)的prior指針域指向刪除結(jié)點(diǎn)del的前個結(jié)點(diǎn)”,這樣就刪除了下一個結(jié)點(diǎn)。
【數(shù)據(jù)結(jié)構(gòu)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼

雙向鏈表刪除第n個數(shù)據(jù)的算法思路:

1、定義一個結(jié)點(diǎn)指針cur指向頭結(jié)點(diǎn),用來遍歷鏈表;
2、定義一個變量cur_i,用來表示下個結(jié)點(diǎn)的序號,初始化為0表示當(dāng)前指向頭結(jié)點(diǎn);
3、將cur指針不斷往后移動,直到下個位置就是刪除位置n,即當(dāng)cur_i==(n-1)跳出循環(huán);
4、若結(jié)束循環(huán)后是最后一個結(jié)點(diǎn)(cur->next==NULL),說明鏈表長度不夠;
5、否則,說明下個結(jié)點(diǎn)(cur->next)就是刪除位置n的結(jié)點(diǎn)delete,賦值delete = cur->next;
6、將前一個結(jié)點(diǎn)的next指針域指向 del 的下個結(jié)點(diǎn) ,delete->prior->next = delete->next;
7、將下一個結(jié)點(diǎn)的prior指針域指向 del 的前個結(jié)點(diǎn) ,delete->next->prior = delete->prior;;
8、最后釋放delete結(jié)點(diǎn)的內(nèi)存,完成刪除操作。

C語言實(shí)現(xiàn)代碼如下,刪除結(jié)點(diǎn)更關(guān)注的是下個結(jié)點(diǎn)(cur->next)的有效性:

// 刪除第n個結(jié)點(diǎn),且將刪除的值通過data傳出
int ListDelete(DoubleLinkList list, int *data, int n)
{
	if(list==NULL || data==NULL || n<1)
		return -1;
	DoubleListNode* cur = list;	// cur指向當(dāng)前結(jié)點(diǎn),初始化指向頭結(jié)點(diǎn)
	int cur_i=0;				// cur_i表示當(dāng)前結(jié)點(diǎn)的序號,0-頭結(jié)點(diǎn)
	while(cur->next && cur_i<(n-1))
	{// 下個結(jié)點(diǎn)有效,且當(dāng)前位置不是刪除位置的前一個,就后移一個
		cur = cur->next;
		cur_i++;
	}
	if(!cur->next)		// 下個結(jié)點(diǎn)無效,說明已經(jīng)移動到最后
	{
		printf("[%s %d]error din't have No.%d\n", __FUNCTION__,__LINE__, n);
		return -1;		// 鏈表沒有 n 那么長
	}
	DoubleListNode *delete = cur->next;
	delete->prior->next = delete->next;
	delete->next->prior = delete->prior;
	free(delete);
	return 0;
}

??3.5 雙向鏈表查找數(shù)據(jù)

查找數(shù)據(jù)時,將指針指向第一個結(jié)點(diǎn)而非頭結(jié)點(diǎn),下面函數(shù)中list是頭指針,指向頭結(jié)點(diǎn),雙向鏈表非空時,list->next就是第一個結(jié)點(diǎn);雙向鏈表為空時,list->next == NULL。雙向鏈表 和 單鏈表 查找數(shù)據(jù)的算法是一樣的。

雙向鏈表查找第n個數(shù)據(jù)的算法思路:

1、定義一個結(jié)點(diǎn)指針cur指向第一個結(jié)點(diǎn)(list->next),用來遍歷鏈表;
2、定義一個變量cur_i,用來表示當(dāng)前結(jié)點(diǎn)的序號,初始化為1(第一步指向的就是第一個結(jié)點(diǎn));
3、若當(dāng)前結(jié)點(diǎn)有效,且當(dāng)前位置不是查找位置n,就繼續(xù)后移,直到最后結(jié)點(diǎn)或cur_i==n跳出循環(huán);
4、若結(jié)束循環(huán)后,當(dāng)前結(jié)點(diǎn)無效,說明已經(jīng)移動到最后,鏈表長度不夠;
5、否則,說明當(dāng)前結(jié)點(diǎn)(cur)就是查找位置n的結(jié)點(diǎn);返回結(jié)點(diǎn)數(shù)據(jù)*data = cur->data。

C語言實(shí)現(xiàn)代碼如下:

int ListFind(DoubleLinkList list, int *data, int n)
{
	if(list==NULL || data==NULL || n<1)
		return -1;
	
	DoubleListNode* cur = list->next;// 指向第一個節(jié)點(diǎn)
	int cur_i=1;			// i表示當(dāng)前結(jié)點(diǎn)的序號
	while(cur && cur_i<n)	// 當(dāng)前結(jié)點(diǎn)有效,且當(dāng)前位置不是查找位置n,就往后移動一個
	{
		cur = cur->next;
		cur_i++;
	}
	if(!cur)			// 當(dāng)前結(jié)點(diǎn)無效,說明已經(jīng)移動到最后
	{
		printf("[%s %d]error din't have No.%d\n", __FUNCTION__,__LINE__, n);
		return -1;	// 鏈表沒有 n 那么長
	}
	*data = cur->data;
	printf("[%s %d]find No.%d = %d\n", __FUNCTION__,__LINE__, n,*data);
	return 0;
}

??3.6 雙向鏈表的銷毀

雙向鏈表銷毀的算法思路:

1、定義一個結(jié)點(diǎn)指針cur指向第一個結(jié)點(diǎn),用來遍歷鏈表;
2、定義一個結(jié)點(diǎn)指針next,保存下個結(jié)點(diǎn)地址;
3、當(dāng)前指針不是指向最后一個結(jié)點(diǎn)的指針域就后移,進(jìn)入循環(huán):
	3.1、先保存下個結(jié)點(diǎn)地址,因?yàn)橄聜€結(jié)點(diǎn)本來保存在cur->next,直接free(cur)會丟掉下個結(jié)點(diǎn);
	3.2、刪除當(dāng)前結(jié)點(diǎn),釋放內(nèi)存
	3.3、將當(dāng)前指針指向前面保存好的下個結(jié)點(diǎn)。
4、結(jié)束循環(huán)后,已經(jīng)刪除完所有節(jié)點(diǎn),此時需要將頭結(jié)點(diǎn)的兩個指針域都指向NULL,表示空鏈表。

C語言實(shí)現(xiàn)代碼如下:

void ListDestroy(DoubleLinkList list)
{
	DoubleListNode* cur = list->next;	// 指向第一個節(jié)點(diǎn)
	DoubleListNode* next = NULL;		// 用于保存下個結(jié)點(diǎn)地址
	while(cur)	// 當(dāng)前結(jié)點(diǎn)有效,就往后移動
	{
		next = cur->next;		// 保存下個結(jié)點(diǎn)地址
		//printf("[%s %d]delete %d\n", __FUNCTION__,__LINE__, cur->data);
		free(cur);				// 刪除當(dāng)前結(jié)點(diǎn)、并釋放內(nèi)存
		cur = next;				// 將當(dāng)前結(jié)點(diǎn)指針指向下個結(jié)點(diǎn)
	}
	list->prior = NULL;
	list->next = NULL;
}

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

四、雙向鏈表完整代碼

代碼只是為了更好地了解循環(huán)鏈表,實(shí)現(xiàn)過程可能存在不足,有發(fā)現(xiàn)的,歡迎指正,謝謝?。?!
代碼已在Ubuntu編譯通過,可執(zhí)行。文章來源地址http://www.zghlxwxcb.cn/news/detail-428261.html

// DoubleList.c
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct _DoubleListNode
{
	ElemType data;
	struct _DoubleListNode *prior;	// 前驅(qū)指針
	struct _DoubleListNode *next;	// 后驅(qū)指針
}DoubleListNode;
typedef DoubleListNode* DoubleLinkList;

DoubleLinkList ListInit()
{
	DoubleLinkList list = (DoubleLinkList)malloc(sizeof(DoubleListNode));
	list->prior = NULL;
	list->next = NULL;
	list->data = -1;
	return list;
}

int ListInsert(DoubleLinkList list, int data, int n)// 將node插入到第n位,n從1開始
{
	if(list==NULL || n<1) // 判斷參數(shù)有效性
		return -1;
		
	DoubleListNode* cur = list;	// cur指向當(dāng)前結(jié)點(diǎn),初始化指向頭結(jié)點(diǎn)
	int cur_i=0;				// cur_i表示當(dāng)前結(jié)點(diǎn)的序號,0-頭結(jié)點(diǎn)
	while(cur && cur_i<(n-1))// 當(dāng)前結(jié)點(diǎn)有效,且不是插入位置的前一個結(jié)點(diǎn),就后移一個
	{
		cur = cur->next;
		cur_i++;
	}
	if(!cur)			// 當(dāng)前結(jié)點(diǎn)無效,說明已經(jīng)移動到最后
	{
		printf("[%s %d]error din't have No.%d\n", __FUNCTION__,__LINE__, n);
		return -1;	// 鏈表沒有 n 那么長
	}
	DoubleListNode* new = (DoubleListNode*)malloc(sizeof(DoubleListNode));
	new->data = data;
	new->prior = cur;
	new->next = cur->next;
	if(cur->next)		// 在最后一個結(jié)點(diǎn)插入時,cur->next==NULL
		cur->next->prior = new;
	cur->next = new;
	
	return 0;
}

// 刪除第n個結(jié)點(diǎn),且將刪除的值通過data傳出
int ListDelete(DoubleLinkList list, int *data, int n)
{
	if(list==NULL || data==NULL || n<1)
		return -1;
	DoubleListNode* cur = list;	// cur指向當(dāng)前結(jié)點(diǎn),初始化指向頭結(jié)點(diǎn)
	int cur_i=0;				// cur_i表示當(dāng)前結(jié)點(diǎn)的序號,0-頭結(jié)點(diǎn)
	while(cur->next && cur_i<(n-1))
	{// 下個結(jié)點(diǎn)有效,且當(dāng)前位置不是刪除位置的前一個,就后移一個
		cur = cur->next;
		cur_i++;
	}
	if(!cur->next)		// 下個結(jié)點(diǎn)無效,說明已經(jīng)移動到最后
	{
		printf("[%s %d]error din't have No.%d\n", __FUNCTION__,__LINE__, n);
		return -1;		// 鏈表沒有 n 那么長
	}
	DoubleListNode *delete = cur->next;
	delete->prior->next = delete->next;
	delete->next->prior = delete->prior;
	free(delete);
	return 0;
}

int ListFind(DoubleLinkList list, int *data, int n)
{
	if(list==NULL || data==NULL || n<1)
		return -1;
	
	DoubleListNode* cur = list->next;// 指向第一個節(jié)點(diǎn)
	int cur_i=1;			// i表示當(dāng)前結(jié)點(diǎn)的序號
	while(cur && cur_i<n)	// 當(dāng)前結(jié)點(diǎn)有效,且當(dāng)前位置不是查找位置n,就往后移動一個
	{
		cur = cur->next;
		cur_i++;
	}
	if(!cur)			// 當(dāng)前結(jié)點(diǎn)無效,說明已經(jīng)移動到最后
	{
		printf("[%s %d]error din't have No.%d\n", __FUNCTION__,__LINE__, n);
		return -1;	// 鏈表沒有 n 那么長
	}
	*data = cur->data;
	printf("[%s %d]find No.%d = %d\n", __FUNCTION__,__LINE__, n,*data);
	return 0;
}

void ListDestroy(DoubleLinkList list)
{
	DoubleListNode* cur = list->next;	// 指向第一個節(jié)點(diǎn)
	DoubleListNode* next = NULL;		// 用于保存下個結(jié)點(diǎn)地址
	while(cur)	// 當(dāng)前結(jié)點(diǎn)有效,就往后移動
	{
		next = cur->next;		// 保存下個結(jié)點(diǎn)地址
		//printf("[%s %d]delete %d\n", __FUNCTION__,__LINE__, cur->data);
		free(cur);				// 刪除當(dāng)前結(jié)點(diǎn)、并釋放內(nèi)存
		cur = next;				// 將當(dāng)前結(jié)點(diǎn)指針指向下個結(jié)點(diǎn)
	}
	list->prior = NULL;
	list->next = NULL;
}

void ListPrintf(DoubleLinkList list)
{
	DoubleListNode* cur = list->next;// 指向第一個節(jié)點(diǎn)
	printf("list:[");
	while(cur)
	{
		printf("%d,",cur->data);
		cur = cur->next;
	}
	printf("]\n");
}

int main()
{
	DoubleLinkList list=ListInit();
	int data=0;
	
	printf("Linklist is empty !!! \n");
	ListInsert(list, 2, 2);		// 空鏈表時,驗(yàn)證插入
	ListDelete(list, &data, 1);	// 空鏈表時,驗(yàn)證刪除
	ListFind(list, &data, 1);	// 空鏈表時,驗(yàn)證查詢
	ListDestroy(list);			// 空鏈表時,驗(yàn)證銷毀
	
	printf("\ninsert 3 data\n");
	// 正常插入3個數(shù)據(jù)
	ListInsert(list, 1, 1);
	ListInsert(list, 2, 2);
	ListInsert(list, 3, 3);
	ListPrintf(list);
	
	printf("\n驗(yàn)證錯誤值\n");
	ListInsert(list, 5, 5);		// 驗(yàn)證插入
	ListDelete(list, &data, 4);	// 驗(yàn)證刪除
	ListFind(list, &data, 4);	// 驗(yàn)證查詢
	
	printf("\n正常操作\n");
	// 正常操作
	ListFind(list, &data, 2);
	printf("delete 2,now\n");
	ListDelete(list, &data, 2);
	ListPrintf(list);
	
	printf("Insert 4 to 2,now\n");
	ListInsert(list, 4, 2);
	ListPrintf(list);
	
	printf("Destroy ,now\n");
	ListDestroy(list);
	ListPrintf(list);

	return 0;
}

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

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

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

相關(guān)文章

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

    2024年01月17日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)與算法:雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)與算法:雙向鏈表

    朋友們大家好啊,在上節(jié)完成單鏈表的講解后,我們本篇文章來對 帶頭循環(huán)雙向鏈表進(jìn)行講解 單鏈表中,一個節(jié)點(diǎn)存儲數(shù)據(jù)和指向下一個節(jié)點(diǎn)的指針,而雙向鏈表除了上述兩個內(nèi)容,還包括了 指向上一個節(jié)點(diǎn)的指針 帶頭的雙向鏈表,是指在雙向鏈表的最前端添加了一個 額

    2024年02月20日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】雙向鏈表

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

    作者:舊夢拾遺186 專欄:數(shù)據(jù)結(jié)構(gòu)成長日記 ? 帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會發(fā)現(xiàn)結(jié)構(gòu)會帶來很多優(yōu)勢,實(shí)現(xiàn)反而簡單了。 現(xiàn)在我們來通

    2024年02月11日
    瀏覽(29)
  • 【數(shù)據(jù)結(jié)構(gòu)篇】手寫雙向鏈表、單向鏈表(超詳細(xì))

    【數(shù)據(jù)結(jié)構(gòu)篇】手寫雙向鏈表、單向鏈表(超詳細(xì))

    什么是鏈表 ? 鏈表(Linked List)是用鏈?zhǔn)酱鎯Y(jié)構(gòu)實(shí)現(xiàn)的線性表。鏈表示意圖: 鏈表的組成 : 數(shù)據(jù)域 + 引用域 (數(shù)據(jù)域和引用域合稱結(jié)點(diǎn)或元素) 數(shù)據(jù)域存放數(shù)據(jù)元素自身的數(shù)據(jù) 引用域存放相鄰結(jié)點(diǎn)的地址 鏈表的特點(diǎn) : 鏈表中元素的聯(lián)系依靠引用域 具有線性結(jié)構(gòu)的特

    2024年02月11日
    瀏覽(30)
  • 數(shù)據(jù)結(jié)構(gòu)與算法(四):雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)與算法(四):雙向鏈表

    雙向鏈表概念和單向鏈表是一致的,區(qū)別在于雙向鏈表在單向鏈表的基礎(chǔ)上,指針區(qū)域多了一個指向上一個節(jié)點(diǎn)的指針。單向鏈表內(nèi)容可以參考我的上一篇文章:http://t.csdn.cn/Iu56H。 基本的數(shù)據(jù)結(jié)構(gòu)如圖所示: 雙向鏈表結(jié)構(gòu)包含了節(jié)點(diǎn)的數(shù)據(jù)內(nèi)容和兩個指針:指向前一個節(jié)點(diǎn)

    2024年02月14日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)-雙向鏈表(c++)超全超詳細(xì)

    數(shù)據(jù)結(jié)構(gòu)-雙向鏈表(c++)超全超詳細(xì)

    單鏈表結(jié)點(diǎn)中只有一個指向其后繼的指針,使得單鏈表只能從頭結(jié)點(diǎn)依次順序地向后遍歷。要訪問某個結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)(插入,刪除操作時),只能從頭開始遍歷,訪問后繼結(jié)點(diǎn)的時間復(fù)雜度為O(1),訪問前驅(qū)結(jié)點(diǎn)的時間復(fù)雜度為O(n)。 提示:以下是本篇文章正文內(nèi)容,下面案

    2023年04月08日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)——實(shí)現(xiàn)雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)——實(shí)現(xiàn)雙向鏈表

    怎么說呢?光乍一聽名字好像很難的樣子是吧,那如果你這樣認(rèn)為的話,可就要讓你大跌眼鏡了哦,其實(shí)雙向帶頭循環(huán)鏈表從操作和理解上來說都是要易于單項(xiàng)不帶頭不循環(huán)鏈表(俗稱單鏈表)的。 咱們就來見識見識吧!希望真的能讓你們“大跌眼鏡”哈! 雙向帶頭循環(huán)鏈

    2024年02月07日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu):詳解【鏈表】的實(shí)現(xiàn)(單向鏈表+雙向鏈表)

    數(shù)據(jù)結(jié)構(gòu):詳解【鏈表】的實(shí)現(xiàn)(單向鏈表+雙向鏈表)

    1.順序表的問題和思考 問題: 中間/頭部的插入刪除,時間復(fù)雜度為O(N)。 增容需要申請新空間,拷貝數(shù)據(jù),釋放舊空間,會有不小的消耗。 增容一般是呈2倍的增長,勢必會有一定的空間浪費(fèi)。例如當(dāng)前容量為100,滿了以后增容到200,我們再繼續(xù)插入了5個數(shù)據(jù),后面沒有數(shù)據(jù)

    2024年03月26日
    瀏覽(35)
  • 【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】

    【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】

    注意: 這里的 “帶頭” 跟前面我們說的 “頭節(jié)點(diǎn)” 是兩個概念,實(shí)際前面的在單鏈表階段稱呼不嚴(yán) 謹(jǐn),但是為了同學(xué)們更好的理解就直接稱為單鏈表的頭節(jié)點(diǎn)。 帶頭鏈表里的頭節(jié)點(diǎn),實(shí)際為 “哨兵位” ,哨兵位節(jié)點(diǎn)不存儲任何有效元素,只是站在這里“放哨 的” “哨

    2024年02月06日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的實(shí)現(xiàn)

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

    我要扼住命運(yùn)的咽喉,他卻不能使我完全屈服。? ? ? ? ? ? ? ? ? ? ? --貝多芬 目錄 一.帶頭循環(huán)的雙向鏈表的特點(diǎn) 二.不帶頭不循環(huán)單向鏈表和帶頭循環(huán)的雙向鏈表的對比 三.初始化鏈表,創(chuàng)建哨兵結(jié)點(diǎn) 四.雙向鏈表的各種功能的實(shí)現(xiàn) 1.雙向鏈表的尾插 2.雙向鏈表的打印?

    2023年04月10日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包