線性表,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...