第三章 線性表 鏈式儲存結構(單鏈表)

2022-08-31 22:03:20 字數 3552 閱讀 9017

線性表的鏈式儲存結構:是用一組任意的儲存單元儲存線性表的資料元素,這組儲存單元可以是連續的,也可以是不連續的。這些資料元素可以存在記憶體未被占用的任意位置。

為了表示每個資料元素ai與其直接後繼資料元素ai+1之間的邏輯關係,對資料元素ai來說,除了儲存其本身的資訊之外,還需儲存乙個指示其後繼的資訊(即直接後繼的儲存位置)。我們把儲存資料元素資訊的域稱為資料域,把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱做指標或鏈。這兩部分資訊組成資料元素ai的儲存映像,稱為結點(node)。

n個結點(ai的儲存映像)鏈結成乙個鍊錶,即為線性表(a1,a2,..,an)的鏈式儲存結構,因為此鍊錶的每個結點中只包含乙個指標域,所以叫做單鏈表。

單鏈表正是通過每個結點的指標域將線性表的資料元素按其邏輯次序鏈結在一起,鍊錶中第乙個結點的儲存位置叫做頭指標,為了方便操作,會在單鏈表的第乙個結點前附設乙個結點,稱為頭結點。

頭指標與頭結點的異同

頭指標

# 頭指標是指鍊錶指向第乙個結點的指標,若煉表有頭結點,則是指向頭結點的指標

# 頭指標具有標識作用,所以常用頭指標冠以鍊錶的名字

# 無論鍊錶是否為空,頭指標均不為空。頭指標是鍊錶的必要元素

頭結點

# 頭結點是為了操作的統一和方便而設立的,放在第乙個元素的結點之前,其資料域一般無意義(也可存放鍊錶的長度)

# 有了頭結點,對第乙個元素結點前插入結點和刪除第一結點,其操作與其他結點的操作就統一了

# 頭結點不一定是鍊錶的必須要素

結點由儲存資料元素的資料域存放後繼結點位址的指標域組成。

單鏈表的讀取(工作指標後移)

獲取鍊錶第i個資料的演算法思路:

# 宣告乙個結點p指向鍊錶的第乙個結點,初始化j從1開始;

# 當j# 若鍊錶末尾p為空,則說明第i個元素不存在

# 否則查詢成功,返回結點p的資料

單鏈表第i個資料插入結點的演算法思路:

# 宣告乙個結點p指向鍊錶第乙個結點,初始化j從1開始

# 當j# 若到鍊錶末尾p為空,則說明第i個元素不存在

# 否則查詢成功,在系統中生成乙個空結點s

# 將資料元素e賦值給s->data

# 單鏈表的插入標準語句 s->next = p->next;p->next=s

# 返回成功

單鏈表第i個資料刪除結點的演算法思路:

# 宣告乙個結點p指向鍊錶第乙個結點,初始化j從1開始

# 當j# 若到鍊錶末尾p為空,則說明第i個元素不存在

# 否則查詢成功,欲將刪除的結點p->next賦值給q

# 單鏈表的刪除標準語句p->next=q->next

# 將q結點中的資料賦值給e,作為返回

# 釋放q結點

# 返回成功

對於插入或刪除資料越頻繁的操作,單鏈表的效率優勢就越顯明顯

單鏈表的整表建立

單鏈表整表建立的演算法思路:

# 宣告一結點p和計數器變數i

# 初始化一空鍊錶l

# 讓l的頭結點的指標指向null,即建立乙個帶頭結點的單鏈表

# 迴圈:

& 生成乙個新結點賦值給p

& 隨機生成一數字賦值給p的資料域p->data

& 將p插入到頭結點與前一新結點之間

(頭插法: p->next =  l->next, l->next = p )

(尾插法: r->next = p,r=p,r->next = null)

單鏈表的整表刪除的演算法思路:

# 宣告乙個結點p和q

# 將第乙個結點賦值給p

#  迴圈:

& 將下乙個結點賦值給q

& 釋放p

& 將q賦值給p

( q=p->next,free(p),p=q)

單鏈表結構和順序儲存結構優缺點

儲存分配方式

# 順序儲存結構用一段連續的儲存單元依次儲存線性表的資料元素

# 單鏈表採用鏈式儲存結構,用一組任意的儲存單元存放線性表的元素

時間效能

# 查詢

& 順序儲存結構(x1)

& 單鏈表(xn)

# 插入和刪除

& 順序儲存結構需要平均移動表長一半的元素,時間為o(n)

# 空間效能

& 順序儲存結構需要預分配儲存空間,分大了,浪費,分小了易發生上溢

& 單鏈表不需要分配儲存空間,只要有就可以分配,元素個數也不受限制

第三章 線性表 鏈式儲存結構(靜態鍊錶)

用陣列描述的鍊錶叫做靜態鍊錶 也叫游標實現法 陣列的元素由兩個資料域組成,data和cur,也就是說,陣列的每個下標都對應乙個data和乙個cur,資料域data,用來存放資料元素,游標cur相當於單鏈表中的next指標,存放該元素的後繼在陣列中的下標 我們對陣列的第乙個和最後乙個元素作為特殊元素處...

第三章 線性表 鏈式儲存結構(雙向鍊錶)

雙向鍊錶 double linked list 是在單鏈表的每個結點中,再設定乙個指向其前驅結點的指標域。結點都有兩個指標域,乙個指向直接後繼,另乙個指向直接前驅。例項 鍊錶 雙向鍊錶 現在分析新增的情況 已經有1號英雄和5號英雄,現在要新增3號英雄 此時cur指向了1號英雄,hero指向3號英雄 ...

線性表 鏈式儲存結構之單鏈表

ifndef linklist h define linklist h include include include template class node node const elemtype data data data next null node const elemtype data,...