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

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結構第三課 -----線性表之雙向鏈表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

作者前言

?? ??????????????????????
??? 作者介紹: ????
?? ?????????????? ??
??作者id:老秦包你會, ??
簡單介紹:??????????????????????????????
喜歡學習C語言和python等編程語言,是一位愛分享的博主,有興趣的小可愛可以來互討 ????????????????
??個人主頁::小小頁面??
??gitee頁面:秦大大??
????????????????
?? 一個愛分享的小博主 歡迎小可愛們前來借鑒??


鏈表的差別

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表

  1. 無頭單向非循環(huán)鏈表:結構簡單,一般不會單獨用來存數(shù)據(jù)。實際中更多是作為其他數(shù)據(jù)結
    構的子結構,如哈希桶、圖的鄰接表等等。另外這種結構在筆試面試中出現(xiàn)很多。
  2. 帶頭雙向循環(huán)鏈表:結構最復雜,一般用在單獨存儲數(shù)據(jù)。實際中使用的鏈表數(shù)據(jù)結構,都
    是帶頭雙向循環(huán)鏈表。另外這個結構雖然結構復雜,但是使用代碼實現(xiàn)以后會發(fā)現(xiàn)結構會帶
    來很多優(yōu)勢,實現(xiàn)反而簡單了,后面我們代碼實現(xiàn)了就知道了。

帶頭雙向循環(huán)鏈表的實現(xiàn)

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表

我們需要的當這種鏈表為空時,
數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表
這個小知識一定要記住

鏈表初始化

DLists* plist = (DLists*)malloc(sizeof(DLists));
	plist->next = plist;
	plist->prev = plist;

一個節(jié)點要包含三部分分別是值,兩個指針

節(jié)點創(chuàng)建

//創(chuàng)建節(jié)點
DLists* CreateNode(DLDataType elemest)
{
	DLists* newnode = (DLists*)malloc(sizeof(DLists));
	newnode->next = newnode;
	newnode->prev = newnode;
	newnode->val = elemest;
	return newnode;
}

鏈表的尾插

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表

void DLPushBack(DLists* plist, DLDataType elelmest)
{
	assert(plist);
	//創(chuàng)建節(jié)點 
	DLists* newnode = CreateNode(elelmest);
	DLists* n = plist->prev;
	newnode->next = plist;
	newnode->prev = n;
	n->next = newnode;
	plist->prev = newnode;

}

這里我們只需要更改四個指針指向就可以,分別是哨兵位的 、prev 和新節(jié)點的prev 、next和舊節(jié)點的next

鏈表尾刪

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表

void DLPopBack(DLists* plist)
{
	assert(plist->next != plist && plist);
	//保存最后一個節(jié)點的地址
	DLists* p = plist->prev;
	plist->prev = p->prev;
	DLists* p1 = p->prev;
	p1->next = plist;
	free(p);
}

這樣寫可以防止只有一個節(jié)點的時候報錯
我們可以創(chuàng)建兩個指針,一個指向要free的節(jié)點,一個是要和哨兵位關聯(lián)的節(jié)點也就是d2

打印鏈表

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表
我們可以從d1這個節(jié)點開始打印,遇見頭節(jié)點就結束

//打印
void DLPrint(DLists* plist)
{
	assert(plist);
	printf("哨兵位");
	DLists* tail = plist->next;
	while (tail != plist)
	{
		printf("<=>%d", tail->val);
		tail = tail->next;
	}
	printf("<=>哨兵位\n");
}

鏈表頭插

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表
我們可以創(chuàng)建一個指針用于存儲d1的地址,然后把節(jié)點插入,這樣可以簡單快捷

//頭插
void DLPushFront(DLists* plist, DLDataType elemest)
{
	assert(plist);
	DLists* n1 = plist->next;
	//創(chuàng)建節(jié)點
	DLists* newnode = CreateNode(elemest);
	plist->next = newnode;
	newnode->prev = plist;
	n1->prev = newnode;
	newnode->next = n1;
}

鏈表頭刪

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表
當我們刪除到哨兵位就不要刪除了

//頭刪
void DLPopFront(DLists* plist)
{
	assert(plist->next != plist && plist);
	// 保存下一個節(jié)點
	DLists *nextnode = plist->next;
	DLists* nexnode_next = nextnode->next;
	plist->next = nexnode_next;
	nexnode_next->prev = plist;
	free(nextnode);
	
}

判斷鏈表是否為空

// 判斷鏈表是否為空
bool Empty(DLists* plist)
{
	assert(plist);
	return plist->next == plist;
}

鏈表pos前插入

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表

//在pos前面插入
DLists* DLPushbefore(DLists* plist, DLists* pos, DLDataType elemest)
{
	assert(plist);
	//創(chuàng)建節(jié)點
	DLists* newnode = CreateNode(elemest);
	//pos的前一個節(jié)點
	DLists* node = pos->prev;
	pos->prev = newnode;
	newnode->next = pos;
	newnode->prev = node;
	node->next = newnode;

}

計算鏈表長度

// 長度
int DLSize(DLists* plist)
{
	assert(plist);
	DLists* tail = plist->next;
	int size = 0;
	while (tail != plist)
	{
		size++;
		tail = tail->next;
	}
	return size;


}

鏈表刪除pos前一個節(jié)點

//刪除pos前一個節(jié)點
DLists* DLPopbefore(DLists* plist, DLists* pos)
{
	assert(plist && pos);
	assert(pos->prev != plist);
	//前一個節(jié)點
	DLists* n2 = pos->prev;
	//前前一個節(jié)點
	DLists* n1 = n2->prev;
	n1->next = pos;
	pos->prev = n1;
	free(n2);
}

刪除pos節(jié)點

// 刪除 pos節(jié)點
DLists* DLPop(DLists* plist, DLists* pos)
{
	assert(plist && pos);
	assert(pos!= plist);
	//pos前一個節(jié)點
	DLists* n2 = pos->prev;
	//pos后一個節(jié)點
	DLists* n1 = pos->next;
	n2->next = n1;
	n1->prev = n2;
	free(pos);
}

釋放鏈表

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表
從d1開釋放,遇見head停止

//釋放鏈表
void DLDestroy(DLists** plist)
{
	assert(*plist && plist);
	DLists* tail = (*plist)->next;
	while (tail != *plist)
	{
		DLists* node = tail;
		tail = tail->next;
		free(node);
	}
	free(*plist);
	*plist = NULL;

}

順序表和鏈表的差異

數(shù)據(jù)結構第三課 -----線性表之雙向鏈表,數(shù)據(jù)結構,鏈表
鏈表的優(yōu)勢

  1. 任意位置插入和刪除都是O(1),前提是知道位置
  2. 按需申請和釋放

缺點問題
3. 下標隨機訪問不方便,物理空間不連續(xù),O(n)
4. 鏈表不好排序

順序表的問題
5. 頭部插入或者中間插入刪除效率低下,要移動數(shù)據(jù)
6. 空間不夠要擴容,擴容會有一定消耗且可能存在一定的空間浪費.
7. 只適合尾插尾刪

優(yōu)勢
支持下標的隨機訪問

?文章來源地址http://www.zghlxwxcb.cn/news/detail-754052.html

到了這里,關于數(shù)據(jù)結構第三課 -----線性表之雙向鏈表的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 數(shù)據(jù)結構——線性表之順序表

    數(shù)據(jù)結構——線性表之順序表

    目錄 一.線性表 二.順序表實現(xiàn) ?2.1 概念及結構 ?2.2 動態(tài)順序表 2.2.1 初始化與銷毀函數(shù) 2.2.2 打印函數(shù) 2.2.3?尾插函數(shù) 2.2.4 尾刪函數(shù) 2.2.5 擴容函數(shù) 2.2.6 頭插函數(shù) 2.2.7 頭刪函數(shù) 2.2.8 任意位置插入函數(shù) 2.2.9 查找函數(shù) 2.2.10 任意位置刪除函數(shù)? 2.2.11 修改函數(shù) 三.完整代碼 四.力扣

    2024年02月07日
    瀏覽(87)
  • 【數(shù)據(jù)結構】線性表之順序表

    【數(shù)據(jù)結構】線性表之順序表

    線性表是 n (n = 0) 個具有相同特性的數(shù)據(jù)元素的有限序列。線性表是一種在實際中廣泛使用的數(shù)據(jù)結構,常見的線性表:順序表、鏈表、棧、隊列… 線性表在 邏輯上是線性結構 ,也就說是連續(xù)的一條直線。但是在 物理結構 上并 不一定 是連續(xù)的線性表在物理上存儲時,通常以

    2024年02月04日
    瀏覽(91)
  • 數(shù)據(jù)結構:線性表之-單向鏈表(無頭)

    數(shù)據(jù)結構:線性表之-單向鏈表(無頭)

    目錄 什么是單向鏈表 順序表和鏈表的區(qū)別和聯(lián)系 順序表: 鏈表: 鏈表表示(單項)和實現(xiàn) 1.1 鏈表的概念及結構 1.2單鏈表(無頭)的實現(xiàn) 所用文件 將有以下功能: 鏈表定義 創(chuàng)建新鏈表元素 尾插 頭插 尾刪 頭刪 查找-給一個節(jié)點的指針 改 pos位置之前插入 刪除pos位置的值 成品

    2024年02月09日
    瀏覽(96)
  • C數(shù)據(jù)結構-線性表之順序表

    C數(shù)據(jù)結構-線性表之順序表

    首先我們創(chuàng)建3個文件,分別如下: liner_data --sqlist.c --sqlist.h --test.c 下面編寫sqlist.c文件:函數(shù)實現(xiàn)的功能 test.c文件:main函數(shù)的執(zhí)行入口 c語言程序編譯的過程如下: 預編譯-編譯-匯編-連接 匯編:gcc -c sqlist.c -o sqlist.o gcc -c test.c -o test.o 連接:可執(zhí)行文件:gcc sqlist.o test.o -o

    2024年02月09日
    瀏覽(574)
  • C語言數(shù)據(jù)結構——線性表之棧和隊列

    C語言數(shù)據(jù)結構——線性表之棧和隊列

    為什么會定義棧和隊列這兩種數(shù)據(jù)結構呢? 原因在于: 之所以會定義棧和隊列這樣的數(shù)據(jù)結構 是因為他們有兩大特性 : 第一: 他們可以保存程序運行路徑中各個點的信息,以便用于回溯操作或其他需要訪問已經(jīng)訪問過的節(jié)點信息的操作。 比如: 棧用于解決迷宮問題,就

    2023年04月11日
    瀏覽(95)
  • 【數(shù)據(jù)結構】線性表之單鏈表(講解實現(xiàn)——帶動圖理解)

    【數(shù)據(jù)結構】線性表之單鏈表(講解實現(xiàn)——帶動圖理解)

    單鏈表的優(yōu)點 1.頭部和中間插入或刪除數(shù)據(jù)效率高,無需挪動。 2.按照需求申請釋放空間,無需擔心空間不夠用。 單鏈表的缺點 1.不可以進行下標隨機訪問。 2.復雜度是O(n) 3.反向遍歷困難 單鏈表是線性表的一種,單鏈表是鏈式存儲的線性表,不同于單鏈表, 鏈表在內存空間

    2024年02月06日
    瀏覽(98)
  • 數(shù)據(jù)結構三:線性表之單鏈表(帶頭結點單向)的設計與實現(xiàn)

    數(shù)據(jù)結構三:線性表之單鏈表(帶頭結點單向)的設計與實現(xiàn)

    ? ? ? ? 線性表的鏈式存儲結構正是所謂的單鏈表,何謂單鏈表?通過地址將每一個數(shù)據(jù)元素串起來,進行使用,這可以彌補順序表在進行任意位置的插入和刪除需要進行大量的數(shù)據(jù)元素移動的缺點,只需要修改指針的指向即可;單鏈表的種類又可劃分為很多種,本篇博客詳

    2024年02月19日
    瀏覽(107)
  • 數(shù)據(jù)結構(王道)——線性表之靜態(tài)鏈表&順序表和鏈表的比較

    數(shù)據(jù)結構(王道)——線性表之靜態(tài)鏈表&順序表和鏈表的比較

    ? 如何定義一個靜態(tài)鏈表 ? ? 初始化靜態(tài)鏈表: ? 靜態(tài)鏈表的查找、插入、刪除 ? ? ? ? ? 創(chuàng): 銷: ? 增、刪: ? 查: ? 順序表、鏈表該如何選擇? ?

    2024年02月16日
    瀏覽(719)
  • 【數(shù)據(jù)結構】線性表——帶頭雙向循環(huán)鏈表

    【數(shù)據(jù)結構】線性表——帶頭雙向循環(huán)鏈表

    帶頭雙向循環(huán)鏈表的優(yōu)點 1.支持任意位置時間復雜度為O(1)的插入和刪除。 2.按照需求申請釋放空間,無需擔心空間不夠用,無需擔心浪費。 3.帶頭可以省去鏈表為空時的判斷,可以使代碼更加簡約 帶頭雙向循環(huán)鏈表的缺點 1.不可以進行下標隨機訪問。 2.緩存利用率低 帶頭雙

    2024年02月03日
    瀏覽(14)
  • 數(shù)據(jù)結構: 線性表(帶頭雙向循環(huán)鏈表實現(xiàn))

    數(shù)據(jù)結構: 線性表(帶頭雙向循環(huán)鏈表實現(xiàn))

    之前一章學習了單鏈表的相關操作, 但是單鏈表的限制卻很多, 比如不能倒序掃描鏈表, 解決方法是在數(shù)據(jù)結構上附加一個域, 使它包含指向前一個單元的指針即可. 那么怎么定義數(shù)據(jù)結構呢? 首先我們先了解以下鏈表的分類 鏈表的結構非常多樣, 以下情況組合起來就有 8 中鏈表

    2024年02月14日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包