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

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

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

作者:舊夢(mèng)拾遺186

專欄:數(shù)據(jù)結(jié)構(gòu)成長(zhǎng)日記

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

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

前言:

帶頭雙向循環(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)單了。
現(xiàn)在我們來(lái)通過(guò)代碼實(shí)現(xiàn)帶頭雙向循環(huán)鏈表,結(jié)構(gòu)上雖然是鏈表最復(fù)雜的,但是并沒(méi)有我們想象的那么困難,恰恰相反,其代碼實(shí)現(xiàn)比較簡(jiǎn)單
?

帶頭雙向鏈表樣例:

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

?

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

List.h

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

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

LTNode* ListInit();

void ListPrint(LTNode* phead);

void ListPushBack(LTNode* phead, LTDataType x);

void ListPushFront(LTNode* phead, LTDataType x);

void ListPopBack(LTNode* phead);

void ListPopFront(LTNode* phead);

bool ListEmpty(LTNode*phead);

size_t ListSize(LTNode*phead);

LTNode* ListFind(LTNode* phead,LTDataType x);

//在pos之前插入
void ListInsert(LTNode* pos, LTDataType x);

//刪除pos位置
void ListErase(LTNode* pos);

void ListDestory(LTNode* phead);

List.c?

#include "List.h"

LTNode* ListInit()
{
	LTNode* guard = (LTNode*)malloc(sizeof(LTNode));
	if (guard == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	guard->next = guard;
	guard->prev = guard;
	return guard;
}

LTNode* BuyListNode(LTDataType x)
{
	LTNode* node = (LTNode*)malloc(sizeof(LTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	node->next = NULL;
	node->prev = NULL;
	node->data = x;
	return node;
}


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

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


void ListPushFront(LTNode* phead, LTDataType x)
{
	assert(phead);
	LTNode* newnode = BuyListNode(x);
	//考慮先后順序
	/*newnode->next = phead->next;
	phead->next->prev = newnode;
	phead->next = newnode;
	newnode->prev = phead;*/
	//記錄下一位,就不用考慮順序
	LTNode* first = phead->next;
	phead->next = newnode;
	newnode->prev = phead;
	newnode->next = first;
	first->prev = newnode;
}



void ListPopBack(LTNode* phead)
{
	assert(phead);
	assert(!ListEmpty(phead));

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

void ListPopFront(LTNode* phead)
{
	assert(phead);
	assert(!ListEmpty(phead));
	LTNode* first = phead->next;
	LTNode* second = first->next;

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


bool ListEmpty(LTNode* phead)
{
	assert(phead);
	return phead->next == phead;
}

size_t ListSize(LTNode*phead)
{
	assert(phead);
	size_t n = 0;
	LTNode* cur = phead->next;
	while (cur != phead)
	{
		++n;
		cur = cur->next;
	}
	return n;
}

LTNode* ListFind(LTNode* phead, int x)
{
	assert(phead);
	size_t n = 0;
	LTNode* cur = phead->next;
	while (cur != phead)
	{
		if (cur->data == x)
		{
			return cur;
		}
	}
	return NULL;
}


//在pos之前插入
void ListInsert(LTNode* pos, LTDataType x)
{
	assert(pos);
	LTNode* prev = pos->prev;
	LTNode* newnode = BuyListNode(x);

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

//刪除pos位置
void ListErase(LTNode* pos)
{
	assert(pos);
	LTNode* prev = pos->prev;
	LTNode* next = pos->next;

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

//可以傳二級(jí),內(nèi)部置空
//一級(jí)指針外部置空
void ListDestory(LTNode* phead)
{
	assert(phead);
	LTNode* cur = phead->next;
	while (cur != phead)
	{
		LTNode* next = cur->next;
		free(cur);
		cur = next;
	}
	free(phead);
}

?test.c

#include "List.h"

//測(cè)試尾插、頭插、尾刪、打印
void TestList1()
{
	LTNode* plist = ListInit();
	ListPushBack(plist, 1);
	ListPushBack(plist, 2);
	ListPushBack(plist, 3);
	ListPushBack(plist, 4);
	ListPrint(plist);

	ListPushFront(plist, 10);
	ListPushFront(plist, 20);
	ListPushFront(plist, 30);
	ListPushFront(plist, 40);
	ListPrint(plist);

	ListPopBack(plist);
	ListPopBack(plist);
	ListPopBack(plist);
	ListPopBack(plist);
	ListPrint(plist);

	ListPopBack(plist);
	ListPopBack(plist);
	ListPopBack(plist);
	ListPopBack(plist);
	ListPrint(plist);

	ListPopBack(plist);
	ListPrint(plist);

}

//測(cè)試頭刪、銷毀
void TestList2()
{
	LTNode* plist = ListInit();
	ListPushBack(plist, 1);
	ListPushBack(plist, 2);
	ListPushBack(plist, 3);
	ListPushBack(plist, 4);
	ListPrint(plist);

	ListPopFront(plist);
	ListPopFront(plist);
	ListPrint(plist);
	ListPopFront(plist);
	ListPopFront(plist);
	ListPrint(plist);

	ListDestory(plist);
	plist = NULL;
}



int main()
{
	//TestList1();
	TestList2();
	return 0;
}

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

總結(jié):

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

?

?

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

?

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

?

結(jié)語(yǔ):

?鏈表的學(xué)習(xí)結(jié)束啦?。。⊥瑢W(xué)們要時(shí)常復(fù)習(xí)和刷題啊,我也寫(xiě)了好多鏈表的習(xí)題博客,同學(xué)們可以來(lái)訪問(wèn)啦。

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

?

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)與算法】雙向鏈表的文章就介紹完了。如果您還想了解更多內(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)與算法】 - 雙向鏈表 - 詳細(xì)實(shí)現(xiàn)思路及代碼

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

    前幾篇文章介紹了怎樣去實(shí)現(xiàn)單鏈表、單循環(huán)鏈表, 這篇文章主要介紹 雙向鏈表 以及實(shí)現(xiàn)雙向鏈表的步驟,最后提供我自己根據(jù)理解實(shí)現(xiàn)雙向鏈表的C語(yǔ)言代碼 。跟著后面實(shí)現(xiàn)思路看下去,應(yīng)該可以看懂代碼,看懂代碼后,就對(duì)雙向鏈表有了比較抽象的理解了,最后自己再

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

    2024年01月17日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】4、雙向鏈表(學(xué)習(xí) jdk 的 LinkedList 部分源碼)

    【數(shù)據(jù)結(jié)構(gòu)與算法】4、雙向鏈表(學(xué)習(xí) jdk 的 LinkedList 部分源碼)

    ?? 單鏈表的節(jié)點(diǎn)中只有一個(gè) next 指針引用著下一個(gè)節(jié)點(diǎn)的地址 ?? 當(dāng)要獲取單鏈表中的最后一個(gè)元素的時(shí)候,需要從頭節(jié)點(diǎn)開(kāi)始遍歷到最后 ?? 單鏈表一開(kāi)始的時(shí)候有 first 頭指針引用著頭節(jié)點(diǎn)的地址 ?? 雙向鏈表可以提升鏈表的綜合性能 ?? 雙向鏈表的節(jié)點(diǎn)中有 prev 指針引

    2024年02月12日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)題目——鏈表綜合算法設(shè)計(jì)、帶頭雙向循環(huán)鏈表、插入、顯示、刪除、修改、排序

    數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)題目——鏈表綜合算法設(shè)計(jì)、帶頭雙向循環(huán)鏈表、插入、顯示、刪除、修改、排序

    ??課程設(shè)計(jì)題目1–鏈表綜合算法設(shè)計(jì) ??一、設(shè)計(jì)內(nèi)容 ??已知簡(jiǎn)單的人事信息系統(tǒng)中職工記錄包含職工編號(hào)(no)、職工姓名(name)、部門(mén)名稱(depname)、職稱(title)和工資數(shù)(salary)等信息(可以增加其他信息),設(shè)計(jì)并完成一個(gè)簡(jiǎn)單的人事信息管理系統(tǒng),要求完成但不

    2024年02月08日
    瀏覽(26)
  • 青島大學(xué)_王卓老師【數(shù)據(jù)結(jié)構(gòu)與算法】Week04_04_雙向鏈表的插入_學(xué)習(xí)筆記

    青島大學(xué)_王卓老師【數(shù)據(jù)結(jié)構(gòu)與算法】Week04_04_雙向鏈表的插入_學(xué)習(xí)筆記

    本文是個(gè)人學(xué)習(xí)筆記,素材來(lái)自青島大學(xué)王卓老師的教學(xué)視頻。 一方面用于學(xué)習(xí)記錄與分享,另一方面是想讓更多的人看到這么好的《數(shù)據(jù)結(jié)構(gòu)與算法》的學(xué)習(xí)視頻。 如有侵權(quán),請(qǐng)留言作刪文處理。 課程視頻鏈接: 數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)–第04周04–2.5.4雙向鏈表2–雙向鏈表

    2024年02月12日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)-鏈表結(jié)構(gòu)-雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)-鏈表結(jié)構(gòu)-雙向鏈表

    雙向鏈表也叫雙鏈表,與單向鏈表不同的是,每一個(gè)節(jié)點(diǎn)有三個(gè)區(qū)域組成:兩個(gè)指針域,一個(gè)數(shù)據(jù)域 前一個(gè)指針域:存儲(chǔ)前驅(qū)節(jié)點(diǎn)的內(nèi)存地址 后一個(gè)指針域:存儲(chǔ)后繼節(jié)點(diǎn)的內(nèi)存地址 數(shù)據(jù)域:存儲(chǔ)節(jié)點(diǎn)數(shù)據(jù) 以下就是雙向鏈表的最基本單位 節(jié)點(diǎn)的前指針域指向前驅(qū),后指針

    2024年02月04日
    瀏覽(31)
  • 【數(shù)據(jù)結(jié)構(gòu)】雙向奔赴的愛(ài)戀 --- 雙向鏈表

    【數(shù)據(jù)結(jié)構(gòu)】雙向奔赴的愛(ài)戀 --- 雙向鏈表

    關(guān)注小莊 頓頓解饞????? 引言:上回我們講解了單鏈表(單向不循環(huán)不帶頭鏈表),我們可以發(fā)現(xiàn)他是存在一定缺陷的,比如尾刪的時(shí)候需要遍歷一遍鏈表,這會(huì)大大降低我們的性能,再比如對(duì)于鏈表中的一個(gè)結(jié)點(diǎn)我們是無(wú)法直接訪問(wèn)它的上一個(gè)結(jié)點(diǎn),那有什么解決方法呢

    2024年04月08日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)—雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)—雙向鏈表

    目錄 1.? 鏈表的種類 2.? 最實(shí)用的兩種鏈表類型 3.? 實(shí)現(xiàn)雙向帶頭循環(huán)鏈表 ? ? ? ? ? ? ? ? ? 3.1 創(chuàng)建頭節(jié)點(diǎn) ????????3.2 實(shí)現(xiàn)雙向循環(huán)功能—返回頭指針 ????????3.3? 尾插?? ????????3.4 頭插 ????????3.5 尾刪 ????????3.6 頭刪 4.? 實(shí)現(xiàn)兩個(gè)重要接口函數(shù) ?

    2023年04月23日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu) - 雙向鏈表

    數(shù)據(jù)結(jié)構(gòu) - 雙向鏈表

    文章目錄 目錄 文章目錄 前言 一、什么是雙向鏈表? 雙向鏈表有什么優(yōu)勢(shì)? 二、雙向鏈表的設(shè)計(jì)和實(shí)現(xiàn) 1.設(shè)計(jì)思想 尾增 : 在鏈表的末尾添加新的元素 ?頭插 : 在鏈表頭部插入節(jié)點(diǎn) ?刪除 : 根據(jù)val的值刪除節(jié)點(diǎn) ?查找 : 根據(jù)索引的值查找并返回節(jié)點(diǎn) 總結(jié) 大家好,今天給大家講解

    2024年02月09日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)雙向鏈表

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

    Hello,好久不見(jiàn),今天我們講鏈表的雙向鏈表,這是一個(gè)很厲害的鏈表,帶頭雙向且循環(huán),學(xué)了這個(gè)鏈表,你會(huì)發(fā)現(xiàn)順序表的頭插頭刪不再是一個(gè)麻煩問(wèn)題,單鏈表的尾插尾刪也變得簡(jiǎn)單起來(lái)了,那廢話不多說(shuō),讓我們開(kāi)始我們的學(xué)習(xí)吧! 首先我們要了解它的物理和邏輯結(jié)構(gòu)

    2024年02月11日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包