C 資料結構 雙鏈表

2021-08-18 08:45:38 字數 2654 閱讀 3097

據說單鏈表沒有迴路,那麼雙鏈表也出現了,既包括後繼指標,又加入了前驅指標,某個元素可以尋找他上面乙個元素,也可以尋找到下乙個元素。當然雙鏈表也是鍊錶的一種。

物理儲存結構:不一定是連續的儲存區域

邏輯儲存結構:邏輯上儲存是連續的

使用場景:跟單鏈表一樣,適用於對資料的大量新增和刪除元素,對訪問元素無要求,預先無法確定資料量的程式

首先建立儲存元素結構

/// /// 雙鏈表

///

class dlinklist

建立操作類和表頭

/// /// 雙鏈表操作

///

class dlinklistclass

插入資料:同樣跟單鏈表一樣有兩種方式插入,時間空間複雜度為:o(n)

#region 建立雙鏈表-頭插法 o(n)

public void createlistfrist(string split)

//head的下一級指向新增項

dhead.next = s;

//新增項的prior上一級指向head

s.prior = dhead;}}

#endregion

#region 建立雙鏈表-尾插法 o(n)

public void createlistend(string split)

p.next = null;

}#endregion

輸出雙鏈表,時間空間複雜度為:o(n)

#region 輸出雙鏈表表 o(n)

public string displist()

return str;

}#endregion

輸出雙鏈表的長度,時間空間複雜度為:o(n)

#region 雙鏈表的長度 o(n)

public int listlength()

return i;

}#endregion

獲取元素item項的值,時間空間複雜度為:o(n)

#region 獲取第item項的值 o(n)

public bool getelem(int item, ref string e)

//迴圈找到item的位置

while (j < item && p != null)

//判斷item位置是否存在

if (p == null)

else

}#endregion

根據元素值獲取位置,時間空間複雜度為:o(n)

#region 根據元素值獲取item位置 o(n)

public int loateelem(string e)

//如果雙鏈表沒有元素或者沒有找到與雙鏈表匹配的值,輸出為0

if (p == null)

else

}#endregion

指定位置插入元素,時間空間複雜度為:o(n)

1.這裡先找到插入元素位置,獲取前乙個元素

2.將這個元素的後繼位址給新增元素的後繼位址

4.然後將新元素的前驅位址換成前乙個元素的位址

5.前乙個元素的後繼位址換成新元素位址

#region 在item插入值 o(n)

public bool listinsert(int item, string values)

{dlinklist p, s;

p = dhead;

int j = 0;

while (j

刪除定點的元素,時間空間複雜度為:o(n)

1.尋找到這個元素的位置

3.然後這個上一級的前驅元素指向刪除元素的上一級

#region 刪除item項

public bool listdelete(int item, ref string values)

{dlinklist p, s;

p = dhead;

int j = 0;

while (j結論:雙鏈表相比順序表新增刪除省了不少事,不用每次都要重新操作後面的移位問題,但是相對於鍊錶記憶體消耗多了指標域

優點:沒有空間限制,儲存元素的個數無上限,基本只與記憶體空間大小有關。

插入和刪除元素速率高。

缺點:

占用額外的空間以儲存指標(浪費空間)。

隨機訪問元素速率低。雙

鍊錶要找乙個數,必須要從表頭開始找起,訪問率元素的速率非常的低。

迴圈雙鏈表,操作跟雙鏈表一樣,只是注意尾元素的後繼不是指向空位址,而是指向head頭元素,頭元素的前驅位址指向的是尾元素的位址,這裡的頭元素在迴圈鍊錶中做了乙個參照物的作用,如果你不知道頭元素在**,可能操作的時候會出現一直迴圈下去,最終會導致程式崩潰。

資料結構 雙鏈表

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

資料結構 雙鏈表

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

資料結構 雙鏈表

單鏈表結點中只有乙個只指向後繼的指標,使得單鏈表只能從頭結點開始一次順序的先後遍歷。要訪問某個結點的前驅結點 插入刪除操作時 只能從頭開始遍歷,訪問後繼節點的時間複雜度為o 1 訪問前驅結點的時間複雜度為o n 為了克服單鏈表的上述缺點,引入了雙鏈表,雙鏈表結點中有兩個指標prior 和 next,...