資料結構(一) 線性表之單向鍊錶

2021-09-26 09:27:21 字數 2107 閱讀 3502

線性表,linear list,是最基本、最簡單、最常用的一種資料結構。乙個線性表是n個具有相同特性的資料元素的有限序列,例如(a1,…,ai-1,ai,ai+1,…,an)表示乙個順序表,ai-1領先於ai,ai領先於ai+1,稱ai-1是ai的直接前驅元素,ai+1是ai的直接後繼元素。特別的,第乙個元素a1僅有乙個直接後繼,無直接前驅;最後乙個元素an僅有乙個直接前驅,無直接後驅。

線性表有順序儲存結構和鏈式儲存結構。

1.鏈式儲存結構

1.1 概念及特性

鏈式儲存結構的線性表,簡稱鍊錶,利用一組連續或非連續儲存單元儲存線性表的元素。

鍊錶的結構特點:鍊錶儲存不僅儲存元素本身,還要儲存乙個指向其直接後繼元素的位址。這種儲存結構被稱為結點(node)。儲存元素的叫資料域,儲存位址的叫指標域,此即為鏈(link)。結點的資料域,是給使用者進行資料運算用的;結點的指標域,是為了尋找下乙個結點。

鍊錶資料結構定義的c**形式:

typedef struct link_list list_node;
煉表示意圖:

特別地,第乙個結點稱為煉表頭結點,由於沒有直接前驅結點,因此需要定義乙個指向它的頭指標p_head。

list_node *p_head;
若該鍊錶為空,則頭指標為空。最後乙個結點(尾結點)沒有直接後繼元素,所以將其指標域設定為「null」空。

1.2 單向鍊錶的操作介面

①鍊錶初始化

鍊錶初始化,就是鍊錶的頭結點指標域指向null。

/* 功能:鍊錶初始化,指向煉表頭的指標賦予空指標。

* 引數:pp_head——指向表頭的指標的指標。

* 返回:0——執行完成

*/int init_list(list_node **pp_head)

(*pp_head)->next = null; //將單鏈表的頭結點指標域指向空

return 0;

}

這裡要注意,初始化函式的形參為指標的指標,這樣在呼叫函式時,可以直接修改傳入函式的雙重指標對應的指標變數。即是說,要在函式呼叫中修改某變數,就要向函式傳入變數的指標;如果直接傳入變數,是沒有作用的(聯絡函式呼叫的過程來理解)。

/* 功能:在鍊錶任意位置新增新的結點

* 引數:①p_pos——新增結點的位置指標;②p_node——新增結點的指標。

* 返回:0——執行成功。

*/int list_add_node(list_node *p_pos,list_node *p_node)

③結點定位

結點定位,即是找到某結點的前驅結點。單向鍊錶的結點中沒有指向上乙個結點的指標,所有需要從頭結點開始遍歷鍊錶,當某一結點的p_next指向當前定位結點時,此即為當前結點的上乙個結點。

* 引數:①p_head——指向煉表頭結點的指標;②p_pos——指向待定位結點的指標。

*/list_node *list_prev_get(list_node *p_head,list_node *p_pos)

// 當輪到結點的p_next指向p_pos時退出遍歷,

// 或者整個鍊錶查詢完畢

return p_temp;

}

/* 功能:刪除單鏈表中的某結點

* 引數:①p_head——指向表頭的指標;②p_node——指向待刪除結點的指標。

* 返回:0——執行成功;-1——沒有刪除結點

*/int list_del_node(list_node *p_head,list_node *p_node)

else

return -1;

}

1.3 單向鍊錶的優缺點單向鍊錶比陣列更靈活,容易在鍊錶中加入和刪除結點,但因為鍊錶只有乙個入口,所以不能像陣列那樣隨機訪問,離表頭近的結點很快能訪問到,但是離表頭遠的結點訪問相對費時。另外,單向鍊錶也不能回溯,很難逆向遍歷。這個問題要交給雙向鍊錶來解決。

資料結構 一 線性表

一 線性表的定義 線性結構的特點是 在資料元素的非空有限集中,1 存在唯一的乙個被成為 第乙個 的資料元素 2 存在唯一的乙個被成為 最後乙個 的資料元素 3 除了第乙個之外,其他的元素均只有乙個前驅,除了最後乙個以外,其他的元素均只有乙個後繼 線性表是最常用且最簡單的一種資料結構,乙個線性表是n個...

資料結構筆記(一) 線性表(順序表 鍊錶)

資料結構筆記 一 線性表 線性表就是乙個一維的表,其中各個元素之間是一對一的。對線性表的定義 adt 線性表 list data 線性表的資料物件集合 a1,a2,an 每個元素的型別均為datatype。其中,出來第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,出來最後乙個元素an外,每乙個...

線性表之單向鍊錶

pragma once 單向 不迴圈 不帶頭 typedef int sldatetype typedef struct slistnode slistnode typedef struct slist slist 初始化 void slistinit slist list 銷毀 void slis...