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

C語(yǔ)言數(shù)據(jù)結(jié)構(gòu):雙向循環(huán)鏈表的增刪操作

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

/********************************************************************************************************
*
*
* 設(shè)計(jì)雙向循環(huán)鏈表的接口
*
* 
*
* Copyright (c)  2023-2024   a1583839363@163.com   All right Reserved
* ******************************************************************************************************/



//指的是雙向循環(huán)鏈表中的結(jié)點(diǎn)有效數(shù)據(jù)類型,用戶可以根據(jù)需要進(jìn)行修改
typedef int  DataType_t;

//構(gòu)造雙向循環(huán)鏈表的結(jié)點(diǎn),鏈表中所有結(jié)點(diǎn)的數(shù)據(jù)類型應(yīng)該是相同的
typedef struct DoubleCircularLinkedList
{
	DataType_t  		             data; //結(jié)點(diǎn)的數(shù)據(jù)域
	struct DoubleCircularLinkedList	*prev; //直接前驅(qū)的指針域
	struct DoubleCircularLinkedList	*next; //直接后繼的指針域

}DoubleCirLList_t;


//創(chuàng)建一個(gè)空雙向循環(huán)鏈表,空鏈表應(yīng)該有一個(gè)頭結(jié)點(diǎn),對(duì)鏈表進(jìn)行初始化
DoubleCirLList_t * DoubleCirLList_Create(void)
{
	//1.創(chuàng)建一個(gè)頭結(jié)點(diǎn)并對(duì)頭結(jié)點(diǎn)申請(qǐng)內(nèi)存
	DoubleCirLList_t *Head = (DoubleCirLList_t *)calloc(1,sizeof(DoubleCirLList_t));
	if (NULL == Head)
	{
		perror("Calloc memory for Head is Failed");
		exit(-1);
	}

	//2.對(duì)頭結(jié)點(diǎn)進(jìn)行初始化,頭結(jié)點(diǎn)是不存儲(chǔ)數(shù)據(jù)域,指針域指向自身即可,體現(xiàn)“循環(huán)”
	Head->prev = Head;
	Head->next = Head;

	//3.把頭結(jié)點(diǎn)的地址返回即可
	return Head;
}

//創(chuàng)建新的結(jié)點(diǎn),并對(duì)新結(jié)點(diǎn)進(jìn)行初始化(數(shù)據(jù)域 + 指針域)
DoubleCirLList_t * DoubleCirLList_NewNode(DataType_t data)
{
	//1.創(chuàng)建一個(gè)新結(jié)點(diǎn)并對(duì)新結(jié)點(diǎn)申請(qǐng)內(nèi)存
	DoubleCirLList_t *New = (DoubleCirLList_t *)calloc(1,sizeof(DoubleCirLList_t));
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}

	//2.對(duì)新結(jié)點(diǎn)的數(shù)據(jù)域和指針域(2個(gè))進(jìn)行初始化,指針域指向結(jié)點(diǎn)自身,體現(xiàn)“循環(huán)”
	New->data = data;
	New->prev = New;
	New->next = New;

	return New;
}

//頭插
bool DoubleCirLList_HeadInsert(DoubleCirLList_t *Head,DataType_t data)
{
    // 1.創(chuàng)建新的結(jié)點(diǎn),并對(duì)新結(jié)點(diǎn)進(jìn)行初始化
	DoubleCirLList_t *New = DoubleCirLList_NewNode(data);
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}

	// 2.判斷雙向循環(huán)鏈表是否為空,如果為空,則直接插入即可
	if (Head == Head->next)
	{
		Head->next = New;
        New->next = New;
        New->prev = New;
		return true;
	}

    // 3.如果雙向鏈表為非空,把新結(jié)點(diǎn)插入到鏈表的頭部
    Head->next->prev = New;
    New->prev = Head->next->prev;
    New->next = Head->next;
    Head->next->prev = New;
    Head->next = New;

    return true;
}

//尾插
bool DoubleCirLList_TailInsert(DoubleCirLList_t *Head,DataType_t data)
{
    // 1.創(chuàng)建新的結(jié)點(diǎn),并對(duì)新結(jié)點(diǎn)進(jìn)行初始化
	DoubleCirLList_t *New = DoubleCirLList_NewNode(data);
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}

	// 2.判斷雙向鏈表是否為空,如果為空,則直接插入即可
	if (Head == Head->next)
	{
		Head->next = New;
        New->next = New;
        New->prev = New;
		return true;
	}

    // 3.如果雙向鏈表為非空,把新結(jié)點(diǎn)插入到鏈表的尾部
	New->prev = Head->next->prev;
    Head->next->prev-next = New;
    New->next = Head->next;
    Head->next->prev = New;

	return true;
}

//指定插
bool DoubleCirLList_DestInsert(DoubleCirLList_t *Head,DataType_t destval,DataType_t data)
{
    // 1.創(chuàng)建新的結(jié)點(diǎn),并對(duì)新結(jié)點(diǎn)進(jìn)行初始化
	DoubleCirLList_t *New = DoubleCirLList_NewNode(data);
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}

	// 2.判斷雙向鏈表是否為空,如果為空,則直接插入即可
	if (Head == Head->next)
	{
		Head->next = New;
        New->next = New;
        New->prev = New;
		return true;
	}

    // 3.如果雙向鏈表為非空,遍歷鏈表,找到目標(biāo)結(jié)點(diǎn)
    DoubleCirLList_t *Dest = Head->next;
	while (Dest->data != destval && Dest != NULL)
	{
		Dest = Dest->next;
	}
	if (NULL == Dest)
	{
		return false;
	}

	// 4.說(shuō)明找到目標(biāo)結(jié)點(diǎn),則把新結(jié)點(diǎn)插入到目標(biāo)結(jié)點(diǎn)的后面
	New->next = Dest->next;
    Dest->next->prev = New;
    New->prev = Dest;
	Dest->next = New;

	return true;
}

//頭刪
bool DoubleCirLList_HeadDel(DoubleCirLList_t *Head)
{
    // 1.判斷鏈表是否為空,如果為空,則直接退出
	if (NULL == Head->next)
	{
		return false;
	}

    // 2.對(duì)鏈表的首結(jié)點(diǎn)的地址進(jìn)行備份
    DoubleCirLList_t *Temp = Head->next;

    // 3.鏈表是非空的,則直接刪除首結(jié)點(diǎn)
    Temp->prev->next = Temp->next;
    Temp->next->prev = Temp->prev;
    Temp->next = NULL;
    Head->next = Temp->next;
    Temp->prev = NULL;
    free(Temp);

    return true;
}

// 尾刪
bool DoubleCirLList_TailDel(DoubleCirLList_t *Head)
{
    // 1.判斷鏈表是否為空,如果為空,則直接退出
	if (NULL == Head->next)
	{
		return false;
	}

    // 2.對(duì)鏈表的尾結(jié)點(diǎn)的地址進(jìn)行備份
    DoubleCirLList_t *Tail = Head->next->prev;

    // 2.鏈表為非空,刪除尾結(jié)點(diǎn)
    Tail->prev->next = Head->next;
    Head->next-prev = Tail->prev;
    Tail->next = NULL;
    Tail->prev = NULL;
	free(Tail);

	return true;
}

// 指定刪
bool DoubleCirLList_DestDel(DoubleCirLList_t *Head, DataType_t destval, DataType_t data)
{
    // 1.判斷鏈表是否為空,如果為空,則直接退出
	if (NULL == Head->next)
	{
		return false;
	}

    // 2.鏈表是非空的,遍歷鏈表,找到待刪除結(jié)點(diǎn)
    DoubleCirLList_t *Dest = Head;
    while (Dest->data != destval && Dest != NULL)
	{
		Dest = Dest->next;
	}
	if (NULL == Dest)
	{
		return false;
	}

    // 3.刪除指定結(jié)點(diǎn)
	Dest->prev->next = Dest->next;
    Dest->next->prev = Dest->prev;
    Dest->prev = NULL;
    Dest->next = NULL;
	free(Dest);
}

// 遍歷雙向循壞鏈表
bool DoubleLList_Print(DoubleCirLList_t *Head)
{
	//對(duì)雙向循環(huán)鏈表的頭結(jié)點(diǎn)的地址進(jìn)行備份
	DoubleCirLList_t *Phead = Head;
	
	//判斷當(dāng)前鏈表是否為空,為空則直接退出
	if (Head->next == Head)
	{
		printf("current linkeflist is empty!\n");
		return false;
	}

	//從首結(jié)點(diǎn)開始遍歷
	while(Phead->next)
	{
		//把頭結(jié)點(diǎn)的直接后繼作為新的頭結(jié)點(diǎn)
		Phead = Phead->next;

		//輸出頭結(jié)點(diǎn)的直接后繼的數(shù)據(jù)域
		printf("data = %d\n",Phead->data);

		//判斷是否到達(dá)尾結(jié)點(diǎn),尾結(jié)點(diǎn)的next指針是指向首結(jié)點(diǎn)的地址
		if (Phead->next == Head->next)
		{
			break;
		}	
	}

	return true;
}


int main(int argc, char const *argv[])
{
	
	return 0;
}

文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-857582.html

到了這里,關(guān)于C語(yǔ)言數(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í)現(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)(完美鏈表)

    鏈表結(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)于單鏈表的問題與討論 單鏈表存在的毛病: 因?yàn)閱捂湵?只能單向 遍歷鏈表, 對(duì)于 前插 這個(gè)操作,單鏈表必 須得找到所需前插節(jié)點(diǎn)位置的前一個(gè) ,那么這時(shí)就得 從頭指針重新遍歷一次 鏈表,會(huì)造成時(shí)間復(fù)雜度大大增加。 沒有頭節(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.問題描述 2.問題分析與求解 (1) 快慢指針法定位鏈表的中間節(jié)點(diǎn) (2)?將鏈表后半部分進(jìn)行反轉(zhuǎn) 附:遞歸法反轉(zhuǎn)鏈表 (3)?雙指針法判斷鏈表是否回文 二.帶頭雙向循環(huán)鏈表的實(shí)現(xiàn) 1.頭文件 2.節(jié)點(diǎn)內(nèi)存申請(qǐng)接口和鏈表初始化接口 3.鏈表的打

    2024年02月02日
    瀏覽(31)
  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表的增刪查改(C語(yǔ)言實(shí)現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表的增刪查改(C語(yǔ)言實(shí)現(xiàn))

    在上一節(jié)中我們提到了順序表有如下缺陷: 在頭部/中間的插入與刪除需要挪動(dòng)數(shù)據(jù),時(shí)間復(fù)雜度為O(N),效率低; 增容需要申請(qǐng)新空間,可能會(huì)拷貝數(shù)據(jù),釋放舊空間,會(huì)有不小的消耗; 增容一般是呈2倍的增長(zhǎng),勢(shì)必會(huì)有一定的空間浪費(fèi)。例如當(dāng)前容量為100,滿了以后增容

    2024年02月06日
    瀏覽(89)
  • 數(shù)據(jù)結(jié)構(gòu)入門(C語(yǔ)言)順序表的增刪查改

    數(shù)據(jù)結(jié)構(gòu)入門(C語(yǔ)言)順序表的增刪查改

    本章會(huì)用C語(yǔ)言來(lái)描述數(shù)據(jù)結(jié)構(gòu)中的順序表,實(shí)現(xiàn)簡(jiǎn)單的增刪查改操作,其中頭文件包含在新建的頭文件SeqList.h內(nèi),順序表的實(shí)現(xiàn)在新建的Seqlist.c內(nèi),主函數(shù)Text.c將會(huì)實(shí)現(xiàn)菜單,方便我們進(jìn)行功能的選擇。 順序表是用一段物理地址 連續(xù) 的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu)

    2024年02月03日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)入門(C語(yǔ)言版)線性表帶頭雙向循環(huán)鏈表接口實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)入門(C語(yǔ)言版)線性表帶頭雙向循環(huán)鏈表接口實(shí)現(xiàn)

    在上一篇博客我們講述了鏈表的概念和結(jié)構(gòu),還實(shí)現(xiàn)了無(wú)頭單向非循環(huán)鏈表接口寫法,那么這一章節(jié),我們來(lái)實(shí)現(xiàn)另一種常用的鏈表組成結(jié)構(gòu)——帶頭雙向循環(huán)鏈表。 如果對(duì)前面的鏈表基本概念還是不了解,可以看作者的上一篇博客: 線性表中鏈表介紹及無(wú)頭單向非循環(huán)鏈

    2023年04月12日
    瀏覽(19)
  • 追夢(mèng)之旅【數(shù)據(jù)結(jié)構(gòu)篇】——詳解C語(yǔ)言動(dòng)態(tài)實(shí)現(xiàn)帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表結(jié)構(gòu)

    追夢(mèng)之旅【數(shù)據(jù)結(jié)構(gòu)篇】——詳解C語(yǔ)言動(dòng)態(tài)實(shí)現(xiàn)帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表結(jié)構(gòu)

    ? ? ??博客昵稱:博客小夢(mèng) ??最喜歡的座右銘:全神貫注的上吧?。?! ??作者簡(jiǎn)介:一名熱愛C/C++,算法等技術(shù)、喜愛運(yùn)動(dòng)、熱愛K歌、敢于追夢(mèng)的小博主! ??博主小留言:哈嘍! ??各位CSDN的uu們,我是你的博客好友小夢(mèng),希望我的文章可以給您帶來(lái)一定的幫助,話不

    2024年01月17日
    瀏覽(108)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語(yǔ)言』⑨ - 基于結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)——鏈表(單鏈表&&雙向循環(huán)鏈表)附完整源碼

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語(yǔ)言』⑨ - 基于結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)——鏈表(單鏈表&&雙向循環(huán)鏈表)附完整源碼

    ? 本章內(nèi)容 1.什么是鏈表 2.鏈表常見幾種形式 3.無(wú)頭單向非循環(huán)鏈表的實(shí)現(xiàn) 3.1結(jié)點(diǎn)結(jié)構(gòu)的定義 3.2函數(shù)接口的實(shí)現(xiàn) 3.2.1尾插 3.2.2尾刪 4. 帶頭雙向循環(huán)鏈表的實(shí)現(xiàn) 4.1結(jié)點(diǎn)結(jié)構(gòu)的定義 4.2函數(shù)接口的實(shí)現(xiàn) 5.兩種鏈表的差異 ①尾插與尾刪的時(shí)間復(fù)雜度 ②頭插與頭刪的時(shí)間復(fù)雜度 ③

    2024年02月16日
    瀏覽(95)
  • 鏈接未來(lái):深入理解鏈表數(shù)據(jù)結(jié)構(gòu)(二.c語(yǔ)言實(shí)現(xiàn)帶頭雙向循環(huán)鏈表)

    鏈接未來(lái):深入理解鏈表數(shù)據(jù)結(jié)構(gòu)(二.c語(yǔ)言實(shí)現(xiàn)帶頭雙向循環(huán)鏈表)

    上篇文章簡(jiǎn)述講解了鏈表的基本概念并且實(shí)現(xiàn)了無(wú)頭單向不循環(huán)鏈表:鏈接未來(lái):深入理解鏈表數(shù)據(jù)結(jié)構(gòu)(一.c語(yǔ)言實(shí)現(xiàn)無(wú)頭單向非循環(huán)鏈表)-CSDN博客 那今天接著給大家?guī)?lái)帶頭雙向循環(huán)鏈表的實(shí)現(xiàn) : 頭文件DoubleList.h:用來(lái)基礎(chǔ)準(zhǔn)備(常量定義,typedef),鏈表表的基本框架

    2024年01月16日
    瀏覽(58)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包