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

數(shù)據(jù)結(jié)構(gòu)之帶頭雙向鏈表(易學(xué)版)

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

目錄

1.問題引入

2.結(jié)構(gòu)實(shí)現(xiàn)

2.3.1接口實(shí)現(xiàn)

2.3.2函數(shù)實(shí)現(xiàn)

3.總結(jié)



,又和大家見面了,今天要給大家分享的是雙鏈表的知識(shí),跟著我的腳步,包學(xué)包會(huì)哦~

規(guī)矩不亂,先贊后看!

數(shù)據(jù)結(jié)構(gòu)之帶頭雙向鏈表(易學(xué)版),數(shù)據(jù)結(jié)構(gòu)ps:(孫權(quán)勸學(xué))

1.問題引入

前期學(xué)習(xí)了單鏈表,我們嘗到了它的甜頭,但是容易越界訪問這一個(gè)問題也是時(shí)有出現(xiàn)的,因此也是相對(duì)比較棘手的,為了解決這一個(gè)問題,特此向大家介紹帶頭雙向鏈表

數(shù)據(jù)結(jié)構(gòu)之帶頭雙向鏈表(易學(xué)版),數(shù)據(jù)結(jié)構(gòu)

帶頭雙向鏈表,顧名思義含有哨兵位,同時(shí)一個(gè)節(jié)點(diǎn)有兩個(gè)指針(next / prev),這樣的好處是讓相鄰指針的聯(lián)系更加緊密,同時(shí)將首尾節(jié)點(diǎn)相連是其能夠非常容易實(shí)現(xiàn)找尾。

話不多說(shuō),直接上代碼!

2.結(jié)構(gòu)實(shí)現(xiàn)

2.3.1接口實(shí)現(xiàn)

先在頭文件(List.h)上進(jìn)行順序表結(jié)構(gòu)的創(chuàng)建和對(duì)各函數(shù)的聲明,目的是為了把各部分區(qū)分開,使程序便于理解,能清楚的看到各部分對(duì)于的作用和功能。

#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;

bool LTEmpty(LTNode* phead);
void LTPushBack(LTNode* phead, LTDataType x);
LTNode* LTInit();
void LTPopFront(LTNode* phead);
void PushFront(LTNode* phead, LTDataType x);
void LTPrint(LTNode* phead);
LTNode* BuyLTNode(LTDataType x);
void LTPopBack(LTNode* phead);
LTNode* LTFind(LTNode* phead, LTDataType x);
void LTInsert(LTNode* pos, LTDataType x);
void LTErase(LTNode* pos);
void LTDestroy(LTNode* phead);

2.3.2函數(shù)實(shí)現(xiàn)

接著下來(lái)是單鏈表各函數(shù)的函數(shù)部分,我們?cè)贚ist.c中完成:

a.創(chuàng)造新節(jié)點(diǎn)

LTNode* BuyLTNode(LTDataType x)
{
	LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));

	if (newnode == NULL)
	{
		perror("malloc fail");
		return NULL;
	}

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

	return newnode;
}

這些步驟都是和鏈表一模一樣的。

b.初始化鏈表

LTNode* LTInit()
{
	LTNode* phead = BuyLTNode(-1);
	phead->next = phead;
	phead->prev = phead;

	return phead;
}

都是鏈表的一套固定公式

c.查找鏈表

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;

}

d.在鏈表中插入節(jié)點(diǎn)

由于有了雙鏈表,使得插入十分輕松,同時(shí)這一個(gè)函數(shù)就能簡(jiǎn)化頭插和尾插兩個(gè)函數(shù),是相當(dāng)方便的

//在pos前插入
void LTInsert(LTNode* pos, LTDataType x)
{
	assert(pos);

	LTNode* prev = pos->prev;
	LTNode* newnode = BuyLTNode(x);

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

}

e.在鏈表中刪除節(jié)點(diǎn)

void LTErase(LTNode* pos)
{
	assert(pos);

	LTNode* posprev = pos->prev;
	LTNode* posnext = pos->next;

	posprev->next = posnext;
	posnext->prev = posprev;

	free(pos);
	pos = NULL;
}

有了這個(gè)函數(shù),也可以讓頭刪和尾刪變得相當(dāng)?shù)暮?jiǎn)潔。

f.判斷鏈表是否為空

bool LTEmpty(LTNode* phead)
{
	assert(phead);

	return phead->next == phead;
}

由于頭刪尾刪會(huì)改變鏈表,因此需要一個(gè)判空函數(shù)來(lái)保證程序的安全性

g.頭插尾插

//尾插
void LTPushBack(LTNode* phead, LTDataType x)//不需要二級(jí)指針(沒有改變phead)
{
	assert(phead);

	//LTNode* newnode = BuyLTNode(x);
	//LTNode* tail = phead->prev;
	//tail->next = newnode;
	//newnode->next = phead;
	//newnode->prev = tail;
	//phead->prev = newnode;

	LTInsert(phead, x);

}

//頭插
//頭插---指的是插在頭結(jié)點(diǎn)之后,首個(gè)含數(shù)據(jù)的結(jié)點(diǎn)之前
void LTPushFront(LTNode* phead, LTDataType x)
{
	assert(phead);

	//LTNode* newnode = BuyLTNode(x);
	//phead->next->prev = newnode;
	//newnode->next = phead->next;

	//phead->next = newnode;
	//newnode->prev = phead;
	//

	//香餑餑
	LTInsert(phead->next, x);
}

注釋掉的是沒有依靠Insert和Erase函數(shù)來(lái)寫的頭插尾插,是相當(dāng)麻煩的,通過(guò)那兩個(gè)函數(shù),能讓你不到10分鐘就能寫出雙鏈表。

h.頭刪尾刪

void LTPopBack(LTNode* phead)
{
	assert(phead);
	assert(!LTEmpty(phead));

	//LTNode* tail = phead->prev;
	//LTNode* tailprev = tail->prev;

	//free(tail);
	//tailprev->next = phead;
	//phead->prev = tailprev;

	LTErase(phead->prev);

}

void LTPopFront(LTNode* phead)
{
	assert(phead);
	assert(!LTEmpty(phead));

	//if (phead->next->next == NULL)
	//{
	//	phead->next = phead;
	//	phead->prev = phead;
	//}
	//else
	//{
	//	LTNode* cur = phead->next;
	//	LTNode* af = phead->next->next;

	//	assert(cur);
	//	assert(af);

	//	phead->next = af;
	//	af->prev = phead;
	//	free(cur);
	//	cur = NULL;
	//}

	LTErase(phead->next);

}

i.打印鏈表

?


void LTPrint(LTNode* phead)
{
	assert(phead);

	printf("guard<==>");
	LTNode* cur = phead->next;


	while (cur != phead)
	{
		printf("%d<==>", cur->data);

		cur = cur->next;
	}
	printf("\n");
}

j.銷毀鏈表

程序執(zhí)行完畢后需要銷毀程序,這樣才不會(huì)出現(xiàn)內(nèi)存問題

void LTPopBack(LTNode* phead)
{
	assert(phead);
	assert(!LTEmpty(phead));

	//LTNode* tail = phead->prev;
	//LTNode* tailprev = tail->prev;

	//free(tail);
	//tailprev->next = phead;
	//phead->prev = tailprev;

	LTErase(phead->prev);

}

void LTPopFront(LTNode* phead)
{
	assert(phead);
	assert(!LTEmpty(phead));

	//if (phead->next->next == NULL)
	//{
	//	phead->next = phead;
	//	phead->prev = phead;
	//}
	//else
	//{
	//	LTNode* cur = phead->next;
	//	LTNode* af = phead->next->next;

	//	assert(cur);
	//	assert(af);

	//	phead->next = af;
	//	af->prev = phead;
	//	free(cur);
	//	cur = NULL;
	//}

	LTErase(phead->next);

}

2.3測(cè)試程序

實(shí)現(xiàn)完函數(shù)之后還需要對(duì)其進(jìn)行測(cè)試

#include"List.h"

void TestList1()
{
	LTNode* plist = LTInit();
	LTPushBack(plist, 1);
	LTPushBack(plist, 2);
	LTPushBack(plist, 3);
	LTPushBack(plist, 4);
	LTPushBack(plist, 5);
	LTPopFront(plist);

	LTPrint(plist);
	LTPopFront(plist);
	LTPopFront(plist);
	LTPopFront(plist);
	LTPrint(plist);

	LTPopFront(plist);
	LTPrint(plist);

	LTDestroy(plist);
	plist = NULL;

}
void TestList2()
{
	LTNode* plist = LTInit();
	LTPushBack(plist, 1);
	LTPushBack(plist, 2);
	LTPushBack(plist, 3);
	LTPushBack(plist, 4);
	LTPushBack(plist, 5);
	LTPopFront(plist);

	LTPrint(plist);
	LTNode* pos = LTFind(plist, 3);
	if (pos)
	{
		LTInsert(pos, 30);
	}
	LTPrint(plist);
	LTDestroy(plist);
	plist = NULL;
}

int main()
{
	TestList1();
	TestList2();

	return 0;
}

最后在終端上運(yùn)行一遍得到結(jié)果

?結(jié)果是這樣的小伙伴就是正確掌握了的喲數(shù)據(jù)結(jié)構(gòu)之帶頭雙向鏈表(易學(xué)版),數(shù)據(jù)結(jié)構(gòu)

如果沒有跑起來(lái)的uu們也不用擔(dān)心,細(xì)心調(diào)試一下,慢慢找錯(cuò)也是一種成長(zhǎng)。?

3.總結(jié)

鏈表的學(xué)習(xí)我認(rèn)為是一個(gè)先苦后甜的過(guò)程,把單鏈表的原理搞懂之后,再使用雙鏈表就完全是如魚得水了。學(xué)習(xí)也是一樣,先吃苦,以后才能嘗到生活的甜頭。

最后關(guān)于鏈表的問題,我強(qiáng)烈建議大家刷題鞏固,踏實(shí)穩(wěn)重,才能把數(shù)據(jù)結(jié)構(gòu)這個(gè)難關(guān)拿下。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-842299.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)之帶頭雙向鏈表(易學(xué)版)的文章就介紹完了。如果您還想了解更多內(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)初階】四、線性表里的鏈表(帶頭+雙向+循環(huán) 鏈表 -- C語(yǔ)言實(shí)現(xiàn))

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

    ========================================================================= 相關(guān)代碼gitee自取 : C語(yǔ)言學(xué)習(xí)日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【數(shù)據(jù)結(jié)構(gòu)初階】三、 線性表里的鏈表(無(wú)頭+單向+非循環(huán)鏈表 -- C語(yǔ)言實(shí)現(xiàn))-CSDN博客 ?====

    2024年02月08日
    瀏覽(31)
  • 【數(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):鏈表基礎(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)
  • 鏈接未來(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)
  • 數(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)、部門名稱(depname)、職稱(title)和工資數(shù)(salary)等信息(可以增加其他信息),設(shè)計(jì)并完成一個(gè)簡(jiǎn)單的人事信息管理系統(tǒng),要求完成但不

    2024年02月08日
    瀏覽(26)
  • 帶頭雙向循環(huán)鏈表--數(shù)據(jù)結(jié)構(gòu)

    帶頭雙向循環(huán)鏈表--數(shù)據(jù)結(jié)構(gòu)

    ????????????????????????Take your time ! ???????????????????????? ??個(gè)人主頁(yè):??????大魔王?????? ??所屬專欄:??魔王的修煉之路–數(shù)據(jù)結(jié)構(gòu)?? 如果你覺得這篇文章對(duì)你有幫助,請(qǐng)?jiān)谖恼陆Y(jié)尾處留下你的 點(diǎn)贊 ??和 關(guān)注 ??,支持一

    2024年02月01日
    瀏覽(41)
  • 【數(shù)據(jù)結(jié)構(gòu)】帶頭雙向循環(huán)鏈表

    【數(shù)據(jù)結(jié)構(gòu)】帶頭雙向循環(huán)鏈表

    ??????? 個(gè)人主頁(yè):簡(jiǎn) 料 ???? 所屬專欄:C++ ???? 個(gè)人社區(qū):越努力越幸運(yùn)社區(qū) ???? 簡(jiǎn)? ? ?? 介: 簡(jiǎn)料簡(jiǎn)料,簡(jiǎn)單有料~在校大學(xué)生一枚,專注C/C++/GO的干貨分享,立志成為您的好幫手 ~ C/C++學(xué)習(xí)路線 (點(diǎn)擊解鎖) ?? C語(yǔ)言階段(已結(jié)束) ?? 數(shù)據(jù)結(jié)構(gòu)與算法(ing) ?

    2024年01月16日
    瀏覽(33)
  • 數(shù)據(jù)結(jié)構(gòu)---帶頭雙向循環(huán)鏈表

    數(shù)據(jù)結(jié)構(gòu)---帶頭雙向循環(huán)鏈表

    什么是雙向帶頭循環(huán)鏈表? 上面簡(jiǎn)單的一個(gè)非空 帶頭循環(huán)雙向鏈表邏輯圖 如何定義一個(gè)雙向鏈表? 根據(jù)圖和代碼可以看雙向鏈表就是單鏈表的每個(gè)結(jié)點(diǎn)中,在設(shè)置一個(gè)指向前驅(qū)節(jié)點(diǎn)的指針 簡(jiǎn)單認(rèn)識(shí)之后,對(duì)他進(jìn)行初始化(申請(qǐng)一個(gè)頭節(jié)點(diǎn),讓前驅(qū)和后驅(qū)指針都指向自己) 代碼

    2024年02月07日
    瀏覽(17)
  • 數(shù)據(jù)結(jié)構(gòu)-帶頭雙向循環(huán)鏈表

    數(shù)據(jù)結(jié)構(gòu)-帶頭雙向循環(huán)鏈表

    前言: 鏈表有很多種,上一章結(jié),我復(fù)盤了單鏈表,這一章節(jié),主要針對(duì)雙鏈表的知識(shí)點(diǎn)進(jìn)行,整理復(fù)盤,如果將鏈表分類的話,有很多種,我就學(xué)習(xí)的方向考察的重點(diǎn),主要針對(duì)這兩種鏈表進(jìn)行整理。 帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。實(shí)際中使用

    2023年04月09日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包