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

鏈表的實(shí)現(xiàn)

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

本程序List鏈表用兩種方式實(shí)現(xiàn),一種是雙向鏈表,一種是雙向循環(huán)鏈表。循環(huán)雙向鏈表和雙向鏈表,它們的編碼差別很??;但是循環(huán)鏈表在插入效率上勝出很多,同時(shí)查詢時(shí)候更靈活。綜合考慮,循環(huán)鏈表是首選。

另外,不同于Windows上的ListEntry結(jié)構(gòu),本LIST結(jié)構(gòu)沒有鏈表頭。對(duì)于鏈表頭,各有各的說法,但是天下沒有免費(fèi)的午餐,某個(gè)地方得了好處,必然會(huì)在別的地方承擔(dān)一定的損失。總之一句話,我個(gè)人的理念是,中間代碼盡可能簡(jiǎn)單易用,以此鏈表頭棄之不用。

非常簡(jiǎn)單的兩種鏈表實(shí)現(xiàn),主要是查詢、插入、刪除幾個(gè)功能的實(shí)現(xiàn),總共的cpp代碼不過300行左右,在座的各位都是軟件開發(fā)小能手,功能實(shí)現(xiàn)不再贅述。

完整工程代碼:https://github.com/satadriver/dataStruct

頭文件:

#pragma once

#include "Element.h"


#pragma pack(1)

typedef struct  _LIST
{
	_LIST* prev;
	_LIST* next;
	ELEMENT* e;
}LIST;



#pragma pack()


class List {
public:
	List();
	~List();
	int insert(ELEMENT* e);
	int remove(ELEMENT* e);

protected:
	LIST* search(ELEMENT* e);
	LIST* mList;
	int mSize;
};



class CList {
public:
	CList();
	~CList();
	int insert(ELEMENT* e);
	int remove(ELEMENT* e);

protected:
	LIST* search(ELEMENT* e);
	LIST* mList;
	int mSize;
};

循環(huán)雙向鏈表實(shí)現(xiàn)代碼如下:



int CList::clear() {
	LIST* l = mList;

	int cnt = 0;
	do
	{
		if (l == 0)
		{
			break;
		}
		LIST* next = l;
		delete l->e;
		delete l;
		l = next;
		cnt++;
	} while (l != mList);

	return cnt;
}



CList::CList() {
	mList = 0;
	mSize = 0;
}

CList::CList(LIST* l) {
	mList = l;
	mSize = 0;
}


CList::~CList() {
	if (mList)
	{
		delete[] mList;
		mList = 0;
	}
}

LIST* CList::search(ELEMENT* e) {
	LIST* list = mList;
	int cnt = 0;
	do
	{
		if (list == 0)
		{
			break;
		}
		if (list->e->e == e->e)
		{
			return list;
		}
		list = list->next;
		cnt++;
	} while (list != mList);

	return 0;
}

int CList::insert(ELEMENT* e) {
	LIST* list = search(e);
	if (list)
	{
		return 0;
	}

	list = new LIST;

	ELEMENT* e_new = new ELEMENT;
	memcpy(e_new, e, sizeof(ELEMENT));

	list->e = e_new;

	if (mList == 0)
	{
		list->next = list;
		list->prev = list;
		mList = list;
	}
	else {
		LIST* prev = mList->prev;

		list->next = mList;
		list->prev = mList->prev;

		if (prev)
		{
			prev->next = list;
		}

		mList->prev = list;
	}

	mSize++;

	return 1;
}


int CList::remove(ELEMENT* e) {
	LIST* list = search(e);
	if (list == 0)
	{
		return 0;
	}

	LIST* next = list->next;
	LIST* prev = list->prev;
	if (next)
	{
		next->prev = prev;
	}

	if (prev)
	{
		prev->next = next;
	}

	delete list->e;

	if (list == mList)
	{
		if (mList->next == mList || mList->prev == mList)
		{
			mList = 0;
		}
		else {
			mList = mList->next;
		}
	}

	delete list;

	int result = mSize;

	mSize--;

	return result;
}

雙向鏈表實(shí)現(xiàn)代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-676139.html

List::List() {
	mList = 0;
	mSize = 0;
}

List::List(LIST* l) {
	mList = l;
	mSize = 0;
}

List::~List() {
	if (mList)
	{
		delete[] mList;
		mList = 0;
	}
}

LIST* List::search(ELEMENT* e) {
	LIST* list = mList;
	int cnt = 0;
	while (list)
	{
		if (list->e->e == e->e)
		{
			return list;
		}
		list = list->next;
		cnt++;
	}

	return 0;
}





int List::insert(ELEMENT* e) {
	LIST* list = search(e);
	if (list)
	{
		return 0;
	}

	list = new LIST;

	ELEMENT* e_new = new ELEMENT;
	memcpy(e_new, e, sizeof(ELEMENT));

	list->e = e_new;

	int cnt = 0;

	if (mList == 0)
	{
		list->next = 0;
		list->prev = 0;
		mList = list;

		cnt++;
	}
	else {
		cnt++;

		LIST* tmp = mList;
		while (tmp->next)
		{
			tmp = tmp->next;
			cnt++;
		}

		list->next = 0;
		list->prev = tmp;

		tmp->next = list;
		cnt++;
	}

	mSize = cnt;

	return cnt;
}


int List::clear() {
	LIST* l = mList;

	int cnt = 0;
	do
	{
		if (l == 0)
		{
			break;
		}
		LIST* next = l;
		delete l->e;
		delete l;
		l = next;
		cnt++;
	} while (l != mList);

	return cnt;
}

int List::remove(ELEMENT* e) {
	LIST* list = search(e);
	if (list == 0)
	{
		return 0;
	}

	LIST* next = list->next;
	LIST* prev = list->prev;
	if (next)
	{
		next->prev = prev;
	}

	if (prev)
	{
		prev->next = next;
	}

	delete list->e;
	if (list == mList)
	{
		if (mList->next == 0)
		{
			mList = 0;
		}
		else {
			mList = mList->next;
		}
	}

	delete list;

	int result = mSize;

	mSize--;

	return result;
}

到了這里,關(guān)于鏈表的實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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)——雙向鏈表的實(shí)現(xiàn)

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

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

    2024年02月06日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)----鏈表介紹、模擬實(shí)現(xiàn)鏈表、鏈表的使用

    數(shù)據(jù)結(jié)構(gòu)----鏈表介紹、模擬實(shí)現(xiàn)鏈表、鏈表的使用

    ArrayList底層使用連續(xù)的空間,任意位置插入或刪除元素時(shí),需要將該位置后序元素整體往前或者往后搬移,故時(shí)間復(fù)雜度為O(N) 增容需要申請(qǐng)新空間,拷貝數(shù)據(jù),釋放舊空間。會(huì)有不小的消耗。 增容一般是呈2倍的增長(zhǎng),勢(shì)必會(huì)有一定的空間浪費(fèi)。例如當(dāng)前容量為100,滿了以后

    2024年02月21日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu)——鏈表的實(shí)現(xiàn)(Java版)

    目錄 一、鏈表 二、代碼實(shí)現(xiàn) 1.創(chuàng)建結(jié)點(diǎn) 2.構(gòu)造函數(shù) 3.鏈表的相關(guān)屬性 4.添加虛擬節(jié)點(diǎn) 5.判斷鏈表是否為空 6.添加方法 (1)在頭部添加 (2)在尾部添加 (3)在索引位置添加 (4)對(duì)頭插法和尾插法代碼進(jìn)行簡(jiǎn)化(調(diào)用任意位置添加的方法) 7.打印鏈表(遍歷,重寫toString方

    2024年01月23日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu):雙向鏈表的實(shí)現(xiàn)(C實(shí)現(xiàn))

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

    個(gè)人主頁(yè) : 個(gè)人主頁(yè) 個(gè)人專欄 : 《數(shù)據(jù)結(jié)構(gòu)》 《C語(yǔ)言》 本篇博客,將要實(shí)現(xiàn)的是 帶頭雙向循環(huán)鏈表 ,該結(jié)構(gòu)實(shí)現(xiàn)尾插,尾刪只需要O(1)的時(shí)間復(fù)雜度。 其結(jié)構(gòu)如下所示: 既然要實(shí)現(xiàn)的鏈表是雙向循環(huán)的,那么對(duì)于指針域,我們就需要 指向節(jié)點(diǎn)上一個(gè)的指針 和 指向節(jié)點(diǎn)

    2024年02月14日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法——TypeScript】算法的復(fù)雜度分析、 數(shù)組和鏈表的對(duì)比

    【數(shù)據(jù)結(jié)構(gòu)與算法——TypeScript】算法的復(fù)雜度分析、 數(shù)組和鏈表的對(duì)比

    什么是算法復(fù)雜度(現(xiàn)實(shí)案例)? ????? 前面已經(jīng)解釋了什么是算法? 其實(shí)就是解決問題的一系列步驟操作、邏輯。 ? 對(duì)于同一個(gè)問題,我們往往有很多種解決思路和方法,也就是可以采用不同的算法。 舉個(gè)例子(現(xiàn)實(shí)例子):在一個(gè)龐大的圖書館中,我們需要找一本書

    2024年02月14日
    瀏覽(31)
  • 數(shù)據(jù)結(jié)構(gòu)中鏈表的實(shí)現(xiàn)以及排序

    本期和大家主要分享的是關(guān)于數(shù)據(jù)結(jié)構(gòu)中雙向鏈表的實(shí)現(xiàn)過程,那么話不多說,來具體看看吧! 來分析一下,這里呢定義了一個(gè)int的數(shù)據(jù)類型,表明整個(gè)鏈表存放的是整形的數(shù)據(jù);其次定義了鏈表節(jié)點(diǎn)的數(shù)據(jù)類型,其中包括了此節(jié)點(diǎn)存放的數(shù)據(jù)以及鏈接向下一個(gè)節(jié)點(diǎn)的地址;

    2024年02月02日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】 鏈表簡(jiǎn)介與單鏈表的實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】 鏈表簡(jiǎn)介與單鏈表的實(shí)現(xiàn)

    在【數(shù)據(jù)結(jié)構(gòu)】 ArrayList簡(jiǎn)介與實(shí)戰(zhàn)中我們已經(jīng)熟悉了ArrayList的使用,并且進(jìn)行了簡(jiǎn)單模擬實(shí)現(xiàn)。通過源碼知道,ArrayList底層使用數(shù)組來存儲(chǔ)元素 由于其底層是一段連續(xù)空間, 當(dāng)在ArrayList任意位置插入或者刪除元素時(shí),就需要將后序元素整體往前或者往后搬移,時(shí)間復(fù)雜度為

    2024年02月12日
    瀏覽(1202)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法初階(C語(yǔ)言)】復(fù)雜鏈表(隨機(jī)指針,隨機(jī)鏈表的復(fù)制)題目詳解+鏈表順序表結(jié)尾

    【數(shù)據(jù)結(jié)構(gòu)和算法初階(C語(yǔ)言)】復(fù)雜鏈表(隨機(jī)指針,隨機(jī)鏈表的復(fù)制)題目詳解+鏈表順序表結(jié)尾

    目錄 ?1.隨機(jī)鏈表的復(fù)制 1.2題目描述? 1.3題目分析 1.4解題: 2.順序表和鏈表對(duì)比 2.1cpu高速緩存利用率 3.結(jié)語(yǔ) 一個(gè)長(zhǎng)度為? n ?的鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針? random ? 該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)。? ? ? ? 構(gòu)造這個(gè)鏈表的? 深拷貝 。?深拷貝

    2024年03月10日
    瀏覽(93)
  • [C語(yǔ)言][數(shù)據(jù)結(jié)構(gòu)][鏈表] 單鏈表的從零實(shí)現(xiàn)!

    [C語(yǔ)言][數(shù)據(jù)結(jié)構(gòu)][鏈表] 單鏈表的從零實(shí)現(xiàn)!

    目錄 零.必備知識(shí) 1.一級(jí)指針 二級(jí)指針 2. 節(jié)點(diǎn)的成員列表 ? ? a.數(shù)據(jù) ? ? b.指向下一個(gè)節(jié)點(diǎn)的指針. 3. 動(dòng)態(tài)內(nèi)存空間的開辟 (malloc-calloc-realloc) 一.單鏈表的實(shí)現(xiàn)與銷毀? ? ? ? ? 1.1 節(jié)點(diǎn)的定義 ? ? ? ? 1.2 單鏈表的尾插 ? ? ? ? 1.3 單鏈表的頭插 ? ? ? ? 1.4 單鏈表的尾刪 ?

    2024年04月11日
    瀏覽(94)
  • 【數(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)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包