資料結構 雙鏈表(C 版)

2021-10-08 10:40:22 字數 2013 閱讀 2093

基本思路

用三個陣列模擬雙鏈表,提高時間效率

模板

// e表示節點的值,l表示節點的左指標,r表示節點的右指標,idx表示當前用到了哪個節點

int e[n]

, l[n]

, r[n]

, idx;

// 初始化

void

init()

// 在節點a的右邊插入乙個數x

void

insert

(int a,

int x)

// 刪除節點a

void

remove

(int a)

例題:雙鏈表

實現乙個雙鏈表,雙鏈表初始為空,支援5種操作:

(1) 在最左側插入乙個數;

(2) 在最右側插入乙個數;

(3) 將第k個插入的數刪除;

(4) 在第k個插入的數左側插入乙個數;

(5) 在第k個插入的數右側插入乙個數

現在要對該鍊錶進行m次操作,進行完所有操作後,從左到右輸出整個鍊錶。

注意:題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的時間順序,這n個數依次為:第1個插入的數,第2個插入的數,…第n個插入的數。

輸入格式

第一行包含整數m,表示操作次數。

接下來m行,每行包含乙個操作命令,操作命令可能為以下幾種:

(1) 「l x」,表示在鍊錶的最左端插入數x。

(2) 「r x」,表示在鍊錶的最右端插入數x。

(3) 「d k」,表示將第k個插入的數刪除。

(4) 「il k x」,表示在第k個插入的數左側插入乙個數。

(5) 「ir k x」,表示在第k個插入的數右側插入乙個數。

輸出格式

共一行,將整個鍊錶從左到右輸出。

資料範圍

1≤m≤100000

1≤m≤100000

所有操作保證合法。

輸入樣例:

10r 7

d 1l 3

il 2 10

d 3il 2 7

l 8r 9

il 4 7

ir 2 2

輸出樣例:

8 7 7 3 2 9

#include

using

namespace std;

const

int n =

100010

;int m;

int e[n]

, r[n]

, l[n]

, idx;

// e[n]儲存資料,r[n]儲存右指標,l[n]儲存左指標,idx表示當前操作的陣列下標

//函式功能:初始化

//注:陣列下標為0和1的節點不是鍊錶的內容,實際的鍊錶下標從2開始

void

init()

//函式功能:在第k個插入的節點有邊插入乙個新節點

void

add(

int k,

int x)

//函式功能:刪除下標為k的節點

void

remove_1

(int k)

intmain()

else

if(op ==

"r")

else

if(op ==

"d")

else

if(op ==

"il"

)else

}for

(int i = r[0]

; i !=

1; i = r[i]

)printf

("%d "

, e[i]);

return0;

}

[^1]此文章中的**和模板均來自www.acwing.com

C 資料結構 雙鏈表

據說單鏈表沒有迴路,那麼雙鏈表也出現了,既包括後繼指標,又加入了前驅指標,某個元素可以尋找他上面乙個元素,也可以尋找到下乙個元素。當然雙鏈表也是鍊錶的一種。物理儲存結構 不一定是連續的儲存區域 邏輯儲存結構 邏輯上儲存是連續的 使用場景 跟單鏈表一樣,適用於對資料的大量新增和刪除元素,對訪問元素無要...

資料結構 雙鏈表

typedef struct nodenode 雙鏈表的根節點的bwd指標指向雙鏈表的最後乙個節點,fwd指標指向雙鏈表的第乙個節點,雙鏈表的value欄位為空 以下程式是將乙個值插入到乙個有序的雙鏈表中,如果鍊錶中已經有和該值相同的節點則不插入 include include typedef st...

資料結構 雙鏈表

目標 掌握雙鏈表的資料結構 來看看什麼是雙鏈表吧 雙鏈表與單鏈表的區別,單鏈表是單項的 而雙鏈表是有左右的 題目acwing 827 實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k...