線性表是由n(n≥0)個數據元素(結點)a1,a2,a3,……an組成的有限序列;數據元素的個數n定義爲表的長度。當n=0時,稱爲空表。算法
將非空的線性表(n>0)記做:L=(a1,a2,a3,……,an)數組
線性表的特色:性能
線性表的基本運算指針
線性表順序存儲的方法:將表中的結點依次存放在計算機內存中一組連續的存儲單元中。blog
順序存儲結構的特色:內存
一、線性表的基本運算在順序表上的實現it
=======================插入========================io
插入 Insert(L,x,i):在線性表L的第i個數據元素以前插入一個值爲x的新數據元素,參數i的合法取值範圍是1≤i≤n+1。操做結束後線性表L由(a1,a2,…,ai-1,ai,ai+1,.…,an )變爲(a1,a2,…,ai-1,x,ai,ai+1 .…,an )表長度加1。變量
注意:List
順序表插入操做過程
結論:
===================刪除========================
刪除 Delete(L,i):刪除線性表L的第i個數據元素ai ,i的有效取值範圍是1≤i≤n。刪除後線性表L由(a1,a2,…,ai-1,ai,ai+1,.…,an )變爲(a1,a2,…,ai-1,ai+1,.…,an ),表長度減1
注意:當要刪除元素的位置i不在表長範圍內(即i<1或i>L->length)時,爲非法位置,不能作正常的刪除操做
順序表刪除操做過程:
刪除算法的分析
插入和刪除的結論:順序存儲結構表示的線性表,在作插入或刪除操做時,平均須要移動大約一半的數據元素。當線性表的數據元素量較大,而且常常要對其作插入或刪除操做時,這一點須要值得考慮。
===================定位=================
定位(查找):定位運算LocateSeqlist(L,X)的功能是求L中值等於X的結點序號的最小值,當不存在這種結點時結果爲0。
算法的過程:從第一個元素 a1 起依次和x比較,直到找到一個與x相等的數據元素,則返回它在順序表中的存儲下標或序號;或者查遍整個表都沒有找到與 x 相等的元素,返回0。
算法分析:
鏈式存儲的結構:數據項 + 指針項
鏈表(Link List):使用鏈式存儲的線性表
鏈表的具體存儲表示爲:用一組任意的存儲單元來存放; 鏈表中結點的邏輯次序和物理次序不必定相同,還必須存儲指示其後繼結點的地址信息。
全部結點經過指針連接而組成單鏈表
NULL稱爲空指針
Head稱爲 頭指針變量,存放鏈表中第一個結點地址;在單鏈表中,增長頭結點的目的是方便運算的實現
鏈表的表示:因爲咱們經常只注重結點間的邏輯順序,不關心每一個結 點的實際位置,能夠用箭頭來表示鏈域中的指針,單鏈表就 能夠表示爲下圖形式。
單鏈表特色:
❖ 起始節點又稱爲首結點,無前驅,故設頭指針head 指向開始結點。
❖ 鏈表由頭指針惟一肯定,單鏈表能夠用頭指針的名字 來命名。頭指針名是head的鏈表可稱爲表head。
❖ 終端結點又稱尾結點,無後繼,故終端結點的指針域 爲空,即NULL
❖ 除頭結點以外的結點爲表結點
❖ 爲運算操做方便,頭結點中不存數據
單鏈表的基本運算
=====================初始化=====================
空表由一個頭指針和一個頭結點組成;在算法中,變量head是鏈表的頭指針,它指向新建立的結點,即頭結 點。一個空單鏈表僅有一個頭結點,它的指針域爲NULL。
====================求表長====================
在單鏈表存儲結構中,線性表的長度等於單鏈表所 含結點的個數(不含頭結點)
步驟:
1,令計數器j爲0
2,令p指向頭結點
3,當下一個結點不空時,j加1,p指向下一個結點
4,j的值即爲鏈表中結點個數,即表長度
=================讀表元素:查找第i個結點============
步驟:
一、令計數器j爲0
二、令p指向頭結點
三、當下一個結點不空時,而且j<i 時,j加1,p指向下一個結點
四、若是j等於i,則p所指結點爲要找的第i結點不然,鏈表中無第i結點
===============定位=================
定位運算是對給定表元素的值,找出這個元素的位置。對 於單鏈表,給定一個結點的值,找出這個結點是單鏈表的 第幾個結點。定位運算又稱爲按值查找。
具體步驟:
一、令p指向頭結點
二、令i=0
三、當下一個結點不空時,p指向下一個結點,同時i的值加1
四、直到p指向的結點的值爲x,返回i+1的值。
五、若是找不到結點值爲x的話,返回值爲0
===================插入====================
===========刪除===========
刪除運算是將表的第i個結點刪去。
(1)找到ai-1的存儲位置p
(2)令p->next指向ai的直接後繼結點
(3)釋放結點ai的空間,將其歸還給"存儲池" 。
free(p)是必不可少的,由於當一個結點從鏈表移出後,若是不釋放它的空間,它將變成一個無用的結點,它會一直佔用着系統內存空間,其餘程序將沒法使用這塊空間。
普通鏈表的終端結點的next值爲NULL;循環鏈表的終端結點的next指向頭結點,在循環鏈表中,從任一結點出發可以掃描整個鏈表。
如何找到循環鏈表的尾結點:在循環鏈表中附設一個 rear 指針指向尾結點,適用於常用頭尾結點的鏈表操做中
若p爲指向循環鏈表中某鏈結點的指針變量,判斷循環鏈表是否只有一個結點的標誌是:p->next=p
5、雙向循環鏈表
在鏈表中設置兩個指針域,一個指向後繼結點,一個指向前驅結點這樣的鏈表叫作雙向鏈表
雙向循環鏈表適合應用在須要常常查找結點的前驅和後繼的場合。找前驅和後繼的複雜度均爲:O(1)
雙向鏈表中結點的刪除:設p指向待刪結點,刪除*p可經過下述語句完成:
雙向鏈表中結點的插入:在p所指結點的後面插入一個新結點*t,須要修改四個指針
線性表與鏈表的優缺點:
(1)單鏈表的每一個結點包括數據域與指針域,指針域須要佔用額外空間。
(2)從總體考慮,順序表要預分配存儲空間,若是預先分配得過大,將形成浪費,若分配得太小,又將發生上溢;單鏈表不須要預先分配空間,只要內存空間沒有耗盡,單鏈表中的結點個數就沒有限制。
(3)、插入、刪除操做,順序表須要移動元素,而鏈表不須要移動元素
時間性能的比較
順序表
鏈表