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