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

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

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

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

【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】,C語(yǔ)言,# 數(shù)據(jù)結(jié)構(gòu),# 鏈表,數(shù)據(jù)結(jié)構(gòu),鏈表,雙向鏈表,c語(yǔ)言

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

二. 雙向鏈表的實(shí)現(xiàn)

2.1 頭文件 ——雙向鏈表的創(chuàng)建及功能函數(shù)的定義

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

typedef int LTDatatype;
//鏈表的結(jié)構(gòu)創(chuàng)建
typedef struct ListNode
{
	LTDatatype data;
	struct ListNode* next;
	struct ListNode* prev;
}LTNode;
//打印
void LTPrint(LTNode* phead);



//雙鏈表的初始化//銷毀
//void LTInit(LTNode** pphead);
LTNode* LTInit();
//銷毀
//void LTDestroy(LTNode** pphead);
void LTDestroy(LTNode* phead);
//頭部/尾部/插入/刪除
//尾插
void LTPushBack(LTNode* phead, LTDatatype x);
//頭插
void LTPushFront(LTNode* phead, LTDatatype x);
//尾刪
void LTPopBack(LTNode* phead);
//頭刪
void LTPopFront(LTNode* phead);
//再pos位置之后插入/刪除 
void LTInsrt(LTNode* pos, LTDatatype x);
void LTErase(LTNode* pos);
//查找pos
LTNode* LTFind(LTNode* phead, LTDatatype x);

2.2 源文件 ——雙向鏈表的功能函數(shù)的實(shí)現(xiàn)

List.c
#include"List.h"

//初始化
//二級(jí)指針初始化
//前提是我們需要傳入一個(gè)頭節(jié)點(diǎn)
//void LTInit(LTNode** pphead)
//{
//	*pphead = (LTNode*)malloc(sizeof(LTNode));
//	if (*pphead == NULL)
//	{
//		perror("malloc error");
//		return;
//	}
//	(*pphead)->data = -1;//哨兵位
//	(*pphead)->next = (*pphead)->prev = *pphead;
//	
//}
//一級(jí)指針初始化
//不需要傳參,只需要返回一個(gè)地址即可
LTNode* LTInit()
{
	LTNode* phead = (LTNode*)malloc(sizeof(LTNode));
	if (phead == NULL)
	{
		perror("malloc error");
		return;
	}
	phead->data = -1;
	phead->next = phead->prev = phead;
	return phead;
}
//鏈表的銷毀
//參數(shù)是二級(jí)指針
//void LTDestroy(LTNode** pphead)
//{
//	assert(pphead && *pphead);
//	LTNode* cur = (*pphead)->next;
//	while(cur!=(*pphead))
//	{
//		LTNode* next = cur->next;
//		free(cur);
//		cur = next;
//	}
//	free(*pphead);
//	*pphead = NULL;
//}
//參數(shù)是一級(jí)指針
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;
}


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

}
LTNode* LTBuyNode(LTDatatype x)
{
	LTNode* node = (LTNode*)malloc(sizeof(LTNode));
	node->data = x;
	node->next = node->prev = NULL;
	return node;
}
//尾插
void LTPushBack(LTNode* phead, LTDatatype x)
{
	LTNode* node = LTBuyNode(x);
	//先處理插入的節(jié)點(diǎn)的前驅(qū)和后繼指針
	node->next = phead;
	node->prev = phead->prev;
	//然后考慮哨兵位的前驅(qū)和尾節(jié)點(diǎn)的后繼指針
	phead->prev->next = node;
	phead->prev = node;

}
//頭插
void LTPushFront(LTNode* phead, LTDatatype x)
{
	assert(phead);
	LTNode* node = LTBuyNode(x);
	//先處理插入節(jié)點(diǎn)的前驅(qū)和后繼的指針
	node->next = phead->next;
	node->prev = phead;
	//然后處理phead,phead->next
	phead->next->prev = node;
	phead->next = node;

}
//尾刪
void LTPopBack(LTNode* phead)
{
	assert(phead);
	//鏈表不能為空,鏈表中只有一個(gè)哨兵位節(jié)點(diǎn)
	assert(phead->next != phead);

	LTNode* del = phead->prev;
	//先處理 del->prev
	del->prev->next = phead;
	//接著處理phead
	phead->prev = del->prev;
	free(del);
	del = NULL;
}
//頭刪
void LTPopFront(LTNode* phead)
{
	assert(phead && phead->next != phead);
	LTNode* del = phead->next;
	//先處理del->next
	del->next->prev = phead;
	//接著處理phead
	phead->next = del->next;
	free(del);
	del = NULL;
}
//在pos位置之后插入
void LTInsrt(LTNode* pos, LTDatatype x)
{
	LTNode* node = LTBuyNode(x);
	//先處理node的前驅(qū)和后繼
	node->next = pos->next;
	node->prev = pos;
	//接著處理pos->next,pos->next->prev
	pos->next = node;
	pos->next->prev = node;
}
//刪除pos位置的數(shù)據(jù)
void LTErase(LTNode* pos)
{
	assert(pos);
	pos->next->prev = pos->prev;
	pos->prev->next = pos->next;
	free(pos);
	pos = NULL;
}
//查找pos
LTNode* LTFind(LTNode* phead, LTDatatype x)
{
	assert(phead);
	LTNode* cur = phead->next;
	while (cur != phead)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

2.3 源文件 ——雙向鏈表功能的測(cè)試

test.c
#include"List.h"


void ListTest()
{
	/*LTNode* plist = NULL;
	LTInit(&plist);*/
	//初始化
	LTNode* plist = LTInit();
	//尾插
	LTPushBack(plist, 1);
	LTPushBack(plist, 2);
	LTPushBack(plist, 3);
	LTPushBack(plist, 4);
	//頭插
	/*LTPushFront(plist, 1);
	LTPushFront(plist, 2);
	LTPushFront(plist, 3);
	LTPushFront(plist, 4);*/
	//尾刪
	/*LTPopBack(plist);
	LTPopBack(plist);*/
	//頭刪
	/*LTPopFront(plist);
	LTPopFront(plist);*/
	LTNode* find = LTFind(plist, 4);
	//在pos位置之后插入
	/*LTInsrt(find, 5);*/
	//刪除pos位置的數(shù)據(jù)
	LTErase(find);
	LTPrint(plist);
	//銷毀鏈表
	//LTDestroy(&plist);
	//一級(jí)指針?shù)N毀需要手動(dòng)將plist置空
	LTDestroy(plist);
	plist = NULL;

}


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

2.4 雙向鏈表各項(xiàng)功能測(cè)試運(yùn)行展示

2.4.1 雙向鏈表的初始化 ——(以調(diào)試窗口展示)

//初始化
LTNode* plist = LTInit();

【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】,C語(yǔ)言,# 數(shù)據(jù)結(jié)構(gòu),# 鏈表,數(shù)據(jù)結(jié)構(gòu),鏈表,雙向鏈表,c語(yǔ)言

2.4.2 雙向鏈表的尾插 ——(以打印展示)

//尾插
LTPushBack(plist, 1);
LTPushBack(plist, 2);
LTPushBack(plist, 3);
LTPushBack(plist, 4);

【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】,C語(yǔ)言,# 數(shù)據(jù)結(jié)構(gòu),# 鏈表,數(shù)據(jù)結(jié)構(gòu),鏈表,雙向鏈表,c語(yǔ)言

2.4.3 雙向鏈表的頭插 ——(以打印展示)

//頭插
LTPushFront(plist, 1);
LTPushFront(plist, 2);
LTPushFront(plist, 3);
LTPushFront(plist, 4);

【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】,C語(yǔ)言,# 數(shù)據(jù)結(jié)構(gòu),# 鏈表,數(shù)據(jù)結(jié)構(gòu),鏈表,雙向鏈表,c語(yǔ)言

2.4.4 雙向鏈表的尾刪 ——(以打印展示)

//尾刪
LTPopBack(plist);
LTPopBack(plist);

【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】,C語(yǔ)言,# 數(shù)據(jù)結(jié)構(gòu),# 鏈表,數(shù)據(jù)結(jié)構(gòu),鏈表,雙向鏈表,c語(yǔ)言

2.4.5 雙向鏈表的頭刪 ——(以打印展示)

//頭刪
LTPopFront(plist);
LTPopFront(plist);

【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】,C語(yǔ)言,# 數(shù)據(jù)結(jié)構(gòu),# 鏈表,數(shù)據(jù)結(jié)構(gòu),鏈表,雙向鏈表,c語(yǔ)言

2.4.6 雙向鏈表的查找指定位置及在指定位置之后插入 ——(以打印展示)

//查找指定位置pos
LTNode* find = LTFind(plist, 4);
//在pos位置之后插入
LTInsrt(find, 5);

【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】,C語(yǔ)言,# 數(shù)據(jù)結(jié)構(gòu),# 鏈表,數(shù)據(jù)結(jié)構(gòu),鏈表,雙向鏈表,c語(yǔ)言

2.4.7 雙向鏈表的查找指定位置及刪除指定位置的數(shù)據(jù) ——(以打印展示)

// //查找指定位置pos
LTNode* find = LTFind(plist, 4);
//刪除pos位置的數(shù)據(jù)
LTErase(find);

【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】,C語(yǔ)言,# 數(shù)據(jù)結(jié)構(gòu),# 鏈表,數(shù)據(jù)結(jié)構(gòu),鏈表,雙向鏈表,c語(yǔ)言

2.4.8 雙向鏈表的銷毀 ——(以調(diào)試窗口展示)

//銷毀鏈表
//LTDestroy(&plist);
//一級(jí)指針?shù)N毀需要手動(dòng)將plist置空
LTDestroy(plist);
plist = NULL;

【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】,C語(yǔ)言,# 數(shù)據(jù)結(jié)構(gòu),# 鏈表,數(shù)據(jù)結(jié)構(gòu),鏈表,雙向鏈表,c語(yǔ)言

三.順序表和雙向鏈表的優(yōu)缺點(diǎn)分析

【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xiàn)】,C語(yǔ)言,# 數(shù)據(jù)結(jié)構(gòu),# 鏈表,數(shù)據(jù)結(jié)構(gòu),鏈表,雙向鏈表,c語(yǔ)言文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-737114.html

到了這里,關(guān)于【(數(shù)據(jù)結(jié)構(gòu))— 雙向鏈表的實(shí)現(xià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í)現(xiàn)(完美鏈表)

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

    鏈表結(jié)構(gòu)一共有八種形式,在前面的文章里已經(jīng)講完了不帶頭單向非循環(huán)鏈表的實(shí)現(xiàn),但是我們發(fā)現(xiàn)該鏈表實(shí)現(xiàn)尾插與尾刪時(shí)比較麻煩,要先從頭節(jié)點(diǎn)進(jìn)行遍歷,找到尾節(jié)點(diǎn),時(shí)間復(fù)雜度為O(N),而本次所講的帶頭雙向循環(huán)單鏈表,則可以直接找到尾節(jié)點(diǎn)。 雖然該鏈表看起來(lái)

    2024年01月25日
    瀏覽(18)
  • 【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實(shí)現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實(shí)現(xiàn))

    引入雙向鏈表:關(guān)于單鏈表的問(wèn)題與討論 單鏈表存在的毛?。?因?yàn)閱捂湵?只能單向 遍歷鏈表, 對(duì)于 前插 這個(gè)操作,單鏈表必 須得找到所需前插節(jié)點(diǎn)位置的前一個(gè) ,那么這時(shí)就得 從頭指針重新遍歷一次 鏈表,會(huì)造成時(shí)間復(fù)雜度大大增加。 沒(méi)有頭節(jié)點(diǎn)(哨兵位)無(wú)法刪除

    2024年02月08日
    瀏覽(96)
  • 數(shù)據(jù)結(jié)構(gòu):鏈表基礎(chǔ)OJ練習(xí)+帶頭雙向循環(huán)鏈表的實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu):鏈表基礎(chǔ)OJ練習(xí)+帶頭雙向循環(huán)鏈表的實(shí)現(xiàn)

    目錄 一.leetcode劍指 Offer II 027.?回文鏈表 1.問(wèn)題描述 2.問(wèn)題分析與求解 (1) 快慢指針?lè)ǘㄎ绘湵淼闹虚g節(jié)點(diǎn) (2)?將鏈表后半部分進(jìn)行反轉(zhuǎn) 附:遞歸法反轉(zhuǎn)鏈表 (3)?雙指針?lè)ㄅ袛噫湵硎欠窕匚?二.帶頭雙向循環(huán)鏈表的實(shí)現(xiàn) 1.頭文件 2.節(jié)點(diǎn)內(nèi)存申請(qǐng)接口和鏈表初始化接口 3.鏈表的打

    2024年02月02日
    瀏覽(31)
  • 【數(shù)據(jù)結(jié)構(gòu)】鏈表的分類和雙向鏈表

    【數(shù)據(jù)結(jié)構(gòu)】鏈表的分類和雙向鏈表

    本篇是基于上篇單鏈表所作,推薦與上篇配合閱讀,效果更加 http://t.csdnimg.cn/UhXEj 鏈表的結(jié)構(gòu)非常多樣,以下情況組合起來(lái)就有8種(2 x 2 x 2)鏈表結(jié)構(gòu): 我們一般叫這個(gè)頭為哨兵位 我們上回講的單鏈表就是不帶頭單項(xiàng)不循環(huán)鏈表。 今天我們要講帶頭雙向循環(huán)的鏈表。 不過(guò)

    2024年01月25日
    瀏覽(26)
  • 雙向鏈表--C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)

    雙向鏈表--C語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)

    本期帶大家一起用C語(yǔ)言實(shí)現(xiàn)雙向鏈表?????? 鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的;簡(jiǎn)單來(lái)說(shuō),線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)生成的表,稱作“鏈表”。 每個(gè)元素本身由兩部分組成: 1、本身的信息,稱

    2024年02月04日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu) -- C語(yǔ)言】 雙向帶頭循環(huán)鏈表的實(shí)現(xiàn)

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

    目錄 1、雙向帶頭循環(huán)鏈表的介紹 2、雙向帶頭循環(huán)鏈表的接口 3、接口實(shí)現(xiàn) 3.1 開(kāi)辟結(jié)點(diǎn) 3.2 創(chuàng)建返回鏈表的頭結(jié)點(diǎn) 3.3 判斷鏈表是否為空 3.4 打印 3.5 雙向鏈表查找 3.6 雙向鏈表在pos的前面進(jìn)行插入 3.6.1 頭插 3.6.2 尾插 3.6.3 更新頭插、尾插寫(xiě)法 3.7 雙向鏈表刪除pos位置的節(jié)點(diǎn)

    2024年02月09日
    瀏覽(88)
  • 數(shù)據(jù)結(jié)構(gòu)---雙向鏈表的基本操作

    頭插法 遍歷鏈表 尾插法 頭刪法 尾刪法 按位置插入數(shù)據(jù) 按位置刪除數(shù)據(jù) dooublelinklist.c doublelinklist.h doublemain.c

    2024年02月22日
    瀏覽(96)
  • 探索數(shù)據(jù)結(jié)構(gòu):雙向鏈表的靈活優(yōu)勢(shì)

    探索數(shù)據(jù)結(jié)構(gòu):雙向鏈表的靈活優(yōu)勢(shì)

    ?? 歡迎大家來(lái)到貝蒂大講堂?? ????養(yǎng)成好習(xí)慣,先贊后看哦~???? 所屬專欄:數(shù)據(jù)結(jié)構(gòu)與算法 貝蒂的主頁(yè):Betty’s blog 前面我們學(xué)習(xí)了單鏈表,它解決了順序表中插入刪除需要挪動(dòng)大量數(shù)據(jù)的缺點(diǎn)。但同時(shí)也有仍需改進(jìn)的地方,比如說(shuō):我們有時(shí)候需要尋找某個(gè)節(jié)點(diǎn)

    2024年03月16日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu)】—C語(yǔ)言實(shí)現(xiàn)雙向鏈表(超詳細(xì)!)

    【數(shù)據(jù)結(jié)構(gòu)】—C語(yǔ)言實(shí)現(xiàn)雙向鏈表(超詳細(xì)!)

    ??????????????????????????????? ??? ? 食用指南:本文在有C基礎(chǔ)的情況下食用更佳 ? ????????????????????????????? ??? ? ?? 這就不得不推薦此專欄了:C語(yǔ)言 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 雙向鏈表 前 置知識(shí) :?jiǎn)捂湵?? ? ?

    2024年02月13日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】C語(yǔ)言實(shí)現(xiàn)雙向鏈表(帶頭結(jié)點(diǎn)、循環(huán))

    【數(shù)據(jù)結(jié)構(gòu)】C語(yǔ)言實(shí)現(xiàn)雙向鏈表(帶頭結(jié)點(diǎn)、循環(huán))

    結(jié)點(diǎn)定義: 接口定義: 我們將申請(qǐng)結(jié)點(diǎn)的代碼封裝成函數(shù),方便后續(xù)使用 由于是帶頭結(jié)點(diǎn)的雙向鏈表,因此在使用鏈表前,我們需要對(duì)鏈表進(jìn)行初始化。 遍歷鏈表,值得說(shuō)的是,帶頭結(jié)點(diǎn)的雙向鏈表的循環(huán)結(jié)束條件是 cur != phead 尾插時(shí),需要先找到尾結(jié)點(diǎn),然后將新結(jié)點(diǎn)插

    2024年02月03日
    瀏覽(96)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包