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

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

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

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

個(gè)人主頁 : 個(gè)人主頁
個(gè)人專欄 : 《數(shù)據(jù)結(jié)構(gòu)》 《C語言》


前言

本篇博客,將要實(shí)現(xiàn)的是帶頭雙向循環(huán)鏈表,該結(jié)構(gòu)實(shí)現(xiàn)尾插,尾刪只需要O(1)的時(shí)間復(fù)雜度。
其結(jié)構(gòu)如下所示:

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


一、實(shí)現(xiàn)思路

1.節(jié)點(diǎn)的結(jié)構(gòu)(ListNode)

既然要實(shí)現(xiàn)的鏈表是雙向循環(huán)的,那么對于指針域,我們就需要指向節(jié)點(diǎn)上一個(gè)的指針指向節(jié)點(diǎn)下一個(gè)的指針。至于雙向循環(huán),我們只需要尾節(jié)點(diǎn)的next指向頭結(jié)點(diǎn),頭結(jié)點(diǎn)的prev指向尾節(jié)點(diǎn),即可實(shí)現(xiàn)雙向循環(huán)。
如下:
數(shù)據(jù)結(jié)構(gòu):雙向鏈表的實(shí)現(xiàn)(C實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,c語言

typedef int LTDataType;//方便以后修改數(shù)據(jù)類型

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

2.新節(jié)點(diǎn)的創(chuàng)建(BuyListNode)

動態(tài)開辟一塊空間,使該節(jié)點(diǎn)的prev,next都指向自己(方便頭結(jié)構(gòu)的創(chuàng)建),再為data賦值,返回該空間地址。

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

//創(chuàng)建新節(jié)點(diǎn)
ListNode* BuyListNode(LTDataType x)
{
	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(-1);
	}

	newnode->data = x;
	newnode->next = newnode;
	newnode->prev = newnode;

	return newnode;
}

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

復(fù)用BuyListNode函數(shù),使頭結(jié)點(diǎn)的data為無效數(shù)據(jù)(這里即為-1)。

//創(chuàng)建返回鏈表的頭結(jié)點(diǎn)
ListNode* ListCreate()
{
	return BuyListNode(-1);
}

4.雙向鏈表的銷毀(ListDestroy)

要銷毀鏈表,我們就要遍歷鏈表,那么如何遍歷鏈表?

  • 以遍歷到頭節(jié)點(diǎn)為結(jié)束條件
  • 從頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)開始遍歷

如上,我們就可以循環(huán)遍歷鏈表。
銷毀節(jié)點(diǎn),我們需要兩指針變量,一個(gè)記錄要free的節(jié)點(diǎn)(cur),一個(gè)記錄要free的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)(curNext)。每次free(cur),使cur = curNext。
數(shù)據(jù)結(jié)構(gòu):雙向鏈表的實(shí)現(xiàn)(C實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,c語言

//雙向鏈表的銷毀
void ListDestroy(ListNode* pHead)
{
	assert(pHead);

	ListNode* cur = pHead->next;
	while (cur != pHead)
	{
		ListNode* curNext = cur->next;
		
		free(cur);
		cur = curNext;
	}
	free(pHead);
}

5.雙向鏈表的打印(ListPrint)

我們只有遍歷打印鏈表即可。

  • 以遍歷到頭節(jié)點(diǎn)為結(jié)束條件
  • 從頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)開始遍歷
//雙向鏈表的打印
void ListPrint(ListNode* pHead)
{
	assert(pHead);

	ListNode* cur = pHead->next;
	printf("head<=>");
	while (cur != pHead)
	{
		printf("%d<=>", cur->data);
		cur = cur->next;
	}
	printf("head\n");
}

6.雙向鏈表的尾插(ListPushBack)

我們只需要讓尾節(jié)點(diǎn)(tail)的next指向newnode,newnode的prev指向尾節(jié)點(diǎn)(tail),newnode的next指向頭結(jié)點(diǎn),頭結(jié)點(diǎn)的prev指向newnode.
我們知道該鏈表是雙向循環(huán)的,那么頭結(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)就是尾節(jié)點(diǎn)。(與單鏈表相比該鏈表實(shí)現(xiàn)尾插并不需要遍歷找尾,時(shí)間復(fù)雜度是O(1) )。
數(shù)據(jù)結(jié)構(gòu):雙向鏈表的實(shí)現(xiàn)(C實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,c語言

//雙向鏈表的尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{
	assert(pHead);

	ListNode* newnode = BuyListNode(x);
	ListNode* tail = pHead->prev;

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

7.雙向鏈表的尾刪(ListPopBack)

我們只需要兩個(gè)指針tail (指向尾節(jié)點(diǎn)),tailPrev (指向尾節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn))。
free掉tail,使tailPrev的next指向頭結(jié)點(diǎn),頭結(jié)點(diǎn)的prev指向tailPrev。

  • 注意:head->next == head 時(shí),鏈表無有效數(shù)據(jù),不能尾刪數(shù)據(jù)。

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

//雙向鏈表的尾刪
void ListPopBack(ListNode* pHead)
{
	assert(pHead);
	//pHead->next == pHead時(shí),鏈表沒有元素
	assert(pHead->next != pHead);

	ListNode* tail = pHead->prev;
	ListNode* tailPrev = tail->prev;

	pHead->prev = tailPrev;
	tailPrev->next = pHead;
	free(tail);
}

8.雙向鏈表的頭插(ListPushFront)

我們只需要一個(gè)指針 first (頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)),使first的prev指向newnode,newnode的next指向first,head的next指向newnode,newnode的prev指向head。

數(shù)據(jù)結(jié)構(gòu):雙向鏈表的實(shí)現(xiàn)(C實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,c語言
head節(jié)點(diǎn)是哨兵位,不存儲有效數(shù)據(jù)。

//雙向鏈表的頭插
void ListPushFront(ListNode* pHead, LTDataType x)
{
	assert(pHead);

	ListNode* newnode = BuyListNode(x);
	ListNode* first = pHead->next;

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

9.雙向鏈表的頭刪(ListPopFront)

我們需要兩個(gè)指針frist (指向頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)),second (指向頭結(jié)點(diǎn)的下一個(gè)的下一個(gè)節(jié)點(diǎn))。
free掉first,使second的prev指向頭結(jié)點(diǎn),頭結(jié)點(diǎn)的next指向second。

  • 注意:如果head->next == head,表示鏈表為空,不能頭刪。

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

//雙向鏈表的頭刪
void ListPopFront(ListNode* pHead)
{
	assert(pHead);
	assert(pHead->next != pHead);

	ListNode* first = pHead->next;
	ListNode* second = first->next;

	second->prev = pHead;
	pHead->next = second;
	free(first);
}

10.雙向鏈表的查找(ListFind)

我們需要遍歷鏈表,比較鏈表元素是否是要查找對象。如果找到了,返回該節(jié)點(diǎn)的地址。如果找不到,返回NULL。

//雙向鏈表的查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{
	assert(pHead);

	ListNode* cur = pHead->next;
	while (cur != pHead)
	{
		if (cur->data == x)
			return cur;
		
		cur = cur->next;
	}

	return NULL;
}

11.雙向鏈表在pos前插入(ListInsert)

我們需要一個(gè)指針 posPrev (指向pos前一個(gè)節(jié)點(diǎn))。
pos的prev指向newnode,newnode的next指向pos;posPrev的next指向newnode,newnode的prev指向posPrev。

  • 如果pos指向頭結(jié)點(diǎn)(哨兵位),那么ListInsert相當(dāng)與完成尾插。
  • 如果pos指向頭結(jié)點(diǎn)(哨兵位)的下一個(gè)節(jié)點(diǎn),那么ListInsert相當(dāng)于頭插。

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

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

	ListNode* newnode = BuyListNode(x);
	ListNode* posPrev = pos->prev;

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

12.雙向鏈表刪除pos位置處的節(jié)點(diǎn)(ListErase)

我們需要兩個(gè)指針posPrev(記錄pos的上一個(gè)節(jié)點(diǎn)的地址),posNext(記錄pos的下一個(gè)節(jié)點(diǎn)的地址)。free掉pos,使posNext的prev指向posPrev,posPrev的next指向posNext。

  • 如果pos指向頭結(jié)點(diǎn)的下一個(gè),那么ListErase相當(dāng)于頭刪。
  • 如果pos指向頭結(jié)點(diǎn)的上一個(gè)(也就是尾節(jié)點(diǎn)),那么ListErase相當(dāng)于尾刪。

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


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

	ListNode* posNext = pos->next;
	ListNode* posPrev = pos->prev;

	posPrev->next = posNext;
	posNext->prev = posPrev;
	free(pos);
}

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

對于頭插,尾插函數(shù),我復(fù)用了ListInsert函數(shù)。
對于頭刪,尾刪函數(shù),我復(fù)用了ListErase函數(shù)。

//Lish.h 文件

#pragma once

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


typedef int LTDataType;

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


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

//創(chuàng)建新節(jié)點(diǎn)
ListNode* BuyListNode(LTDataType x);

//雙向鏈表的銷毀
void ListDestroy(ListNode* pHead);

//雙向鏈表的打印
void ListPrint(ListNode* pHead);

//雙向鏈表的尾插
void ListPushBack(ListNode* pHead, LTDataType x);

//雙向鏈表的尾刪
void ListPopBack(ListNode* pHead);

//雙向鏈表的頭插
void ListPushFront(ListNode* pHead, LTDataType x);

//雙向鏈表的頭刪
void ListPopFront(ListNode* pHead);

//雙向鏈表的查找
ListNode* ListFind(ListNode* pHead, LTDataType x);

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

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


//Lish.c  文件

#include "List.h"


//創(chuàng)建返回鏈表的頭結(jié)點(diǎn)
ListNode* ListCreate()
{
	return BuyListNode(-1);
}


//創(chuàng)建新節(jié)點(diǎn)
ListNode* BuyListNode(LTDataType x)
{
	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(-1);
	}

	newnode->data = x;
	newnode->next = newnode;
	newnode->prev = newnode;

	return newnode;
}


//雙向鏈表的打印
void ListPrint(ListNode* pHead)
{
	assert(pHead);

	ListNode* cur = pHead->next;
	printf("head<=>");
	while (cur != pHead)
	{
		printf("%d<=>", cur->data);
		cur = cur->next;
	}
	printf("head\n");
}

//雙向鏈表的尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{
	assert(pHead);

	/*ListNode* newnode = BuyListNode(x);
	ListNode* tail = pHead->prev;

	tail->next = newnode;
	newnode->prev = tail;
	pHead->prev = newnode;
	newnode->next = pHead;*/
	
	ListInsert(pHead, x);
}


//雙向鏈表的尾刪
void ListPopBack(ListNode* pHead)
{
	assert(pHead);
	//pHead->next == pHead時(shí),鏈表沒有元素
	assert(pHead->next != pHead);

	/*ListNode* tail = pHead->prev;
	ListNode* tailPrev = tail->prev;

	pHead->prev = tailPrev;
	tailPrev->next = pHead;
	free(tail);*/

	ListErase(pHead->prev);
}


//雙向鏈表的頭插
void ListPushFront(ListNode* pHead, LTDataType x)
{
	assert(pHead);

	/*ListNode* newnode = BuyListNode(x);
	ListNode* first = pHead->next;

	newnode->next = first;
	first->prev = newnode;
	newnode->prev = pHead;
	pHead->next = newnode;*/

	ListInsert(pHead->next, x);
}


//雙向鏈表的頭刪
void ListPopFront(ListNode* pHead)
{
	assert(pHead);
	assert(pHead->next != pHead);

	/*ListNode* first = pHead->next;
	ListNode* second = first->next;

	second->prev = pHead;
	pHead->next = second;
	free(first);*/

	ListErase(pHead->next);
}



//雙向鏈表的查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{
	assert(pHead);

	ListNode* cur = pHead->next;
	while (cur != pHead)
	{
		if (cur->data == x)
			return cur;
		
		cur = cur->next;
	}

	return NULL;
}



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

	ListNode* newnode = BuyListNode(x);
	ListNode* posPrev = pos->prev;

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



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

	ListNode* posNext = pos->next;
	ListNode* posPrev = pos->prev;

	posPrev->next = posNext;
	posNext->prev = posPrev;
	free(pos);
}


//雙向鏈表的銷毀
void ListDestroy(ListNode* pHead)
{
	assert(pHead);

	ListNode* cur = pHead->next;
	while (cur != pHead)
	{
		ListNode* curNext = cur->next;
		
		free(cur);
		cur = curNext;
	}
	free(pHead);
}

總結(jié)

以上就是雙向鏈表的實(shí)現(xiàn)?。?!
數(shù)據(jù)結(jié)構(gòu):雙向鏈表的實(shí)現(xiàn)(C實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),鏈表,c語言文章來源地址http://www.zghlxwxcb.cn/news/detail-630742.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu):雙向鏈表的實(shí)現(xiàn)(C實(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)擊違法舉報(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)。 雖然該鏈表看起來

    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)閱捂湵?只能單向 遍歷鏈表, 對于 前插 這個(gè)操作,單鏈表必 須得找到所需前插節(jié)點(diǎn)位置的前一個(gè) ,那么這時(shí)就得 從頭指針重新遍歷一次 鏈表,會造成時(shí)間復(fù)雜度大大增加。 沒有頭節(jié)點(diǎn)(哨兵位)無法刪除

    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)存申請接口和鏈表初始化接口 3.鏈表的打

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

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

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

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

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

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

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

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

    目錄 1、雙向帶頭循環(huán)鏈表的介紹 2、雙向帶頭循環(huán)鏈表的接口 3、接口實(shí)現(xiàn) 3.1 開辟結(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 更新頭插、尾插寫法 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日
    瀏覽(95)
  • 探索數(shù)據(jù)結(jié)構(gòu):雙向鏈表的靈活優(yōu)勢

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

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

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

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

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

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

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

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

    2024年02月03日
    瀏覽(96)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包