數據結構導論 三 線性表-順序存儲

線性表是什麼樣子呢?算法

 

 

 相似這種,能夠看成生活中流水線做業是同樣的。數組

線性表是由n(N>=0)個數據元素(結點)好比a1,a2,a3....an組成的有限序列網絡

數據元素的個數n定義爲表的長度,spa

當n=0時爲空表(null) code

 

當n>0時爲非空表 L=(a1....an)blog

a1稱爲起始點 ,an爲終端結點。圖片

對任意一堆相鄰結點ai和ai+1 (1<i<n)  ai是ai+1的直接前驅,ai+1是ai的直接後繼內存

 

 

 (圖片來源於網絡)get

若是吧線性表看成火車就更加明顯了,火車只有一個火車頭(起始節點)一個車尾(終端結點)it

火車頭(起始節點)前面沒有車箱(直接前驅) 可是後面又一節車箱 (直接後繼),車尾(終端結點)後面沒有多餘的車尾(直接後繼) ,可是車尾的前面有一節車箱(直接前驅)。

綜上能夠了解出每個結點且都有一個直接前驅和一個直接後繼

 

線性表的邏輯結構特徵

對於非空的線性表:線性表中結點具備一對一的關係(具體能夠看上面的火車例子)

1)線性表中有且僅有一個其實結點a1,沒有直接前驅,有且僅有一個直接後繼a2;

2)有且僅有一個終端結點an,沒有直接後繼,有些僅有一個直接前驅an-1;

3)其他的內部結點ai(a<=i<=n-1)都有且僅有一個直接前驅ai-1和一個直接後繼ai+1;

 

線性表的基本運算

 

初始化 Initiate  秋表長度Length 取表元 get  定位 Locate 插入Insert 刪除Delete

 

線性表順序存儲的方法是:將表中的結點依次存放在計算機內存一組連續的存儲單元中,數據元素在線性表中的鄰接關係決定它們在存儲空間中的存儲位置,即邏輯結構中相鄰的結點其存儲位置也相鄰。

用順序存儲實現的線性表稱爲順序表。通常使用數組來表示順序表。 

假定有一組數據,數據間有順序:13 4 5 15 9 53 24 50 88 42 11

此處數據間的順序即表示數據間的邏輯關係即線性關係,這一組數據爲線性表:

 

 

 假設已知a1地址爲loc(a1),每一個數據佔c個單元,則計算ai地址

Loc(ai)=Loc(a1)+c*(i-1)

好比 a3 的地址

1 a1=0 
2 
3 Loc(a3)=a1+(3-1)
4 
5             =0+2
6 
7             =2

初始化

strudt student{
int ID;//ID
char name[30];//姓名
char sex; //性別
int class;//班級
int age;//年齡

}
student={"01",「zhangsan」,"m","201","20"};

  插入

線性表的插入運算是指在表的第i(1<=i<=n+1)個位置上,插入一個新結點x,使長度爲n的線性表「:(a1,....ai-1,ai,ai+1,....an)

變成長度爲n+1的線性表:

(a1,...ai-1,x,ai,ai+1,....an)

1)當表空間已滿,不可在作插入操做

2)當插入位置爲非法位置,不可作正常插入操做

 

 

 

void  InsertSeqlist (SeqList l,dataType x,int i){
if (l.length==Maxsize)exit("表已滿");
if(i<1||l.length+1) exit (」位置錯誤「);//插入位置是否正確
for(j=l.length;j>=i;j--){//初始化i=l.length
l.data[j]=l.data[j-1];//依次後移
l.data[i-1]=x;//元素x置入到下標爲i-1的位置
l.length++;}//表長度加1

假設線性表中含有n個數據元素,
在進行插入操做時,有 n+1個位置可插入
在每一個位置插入數據的機率是:1/(n+1)
在i位置插入時,要移動n-i+1 個數據

平均時間複雜度爲O(n)

 

刪除

線性表的刪除運算是指將表的i的結點刪去,使長度爲n的線性表長度」減一「

當要刪除元素的位置I不在表長範圍內(即i<1或i->length)時,爲非法位置,不能作正常的刪除操做

操做過程:

1,若i=n,則只要刪除終端結點,無需移動結點;

2,若1<=i<=n-1,則必須將表中位置i+1,i+2,,,,,n的結點,依次前移到位置I

3,該表長度減1

void DeleteSeqList(SeqList L,int i) {
//刪除線性表L中的第i個數據結點
if(i<1 || i>L.length) //檢查位置是否合法
exit(「非法位置」);
for(j=i;j<L.length;j ++) //第i個元素的下標爲i-1
L.data[j-1]=L.data[j]; //依次左移
L.length--; //表長度減1
}

 刪除算法的分析

 

假設線性表中含有n個數據元素,
在進行刪除操做時,有 n位置可刪除
在每一個位置刪除數據的機率是:1/n
在i位置刪除時,要移動 n-i+1個數據
假定在n個位置上刪除元素的可能性均等,

平均時間複雜度爲O(n)順序存儲結構表示的線性表,在作插入或刪除操做時,平均須要移動大約一半的數據元素。

當線性表的數據元素量較大,而且常常要對其作插入或刪除操做時,這一點須要值得考慮 

定位(查找)

定位運算LocateSeqlist(L,X)的功能是
求L中值等於X的結點序號的最小值,

當不存在這種結點時結果爲0 從第一個元素 a1 起依次和x比較,直到找到一個與x相等的數據元素,則返回它在順序表中的存儲下標或序號;或者查遍整個表都沒有找到與 x 相等的元素,返回0 

int LocateSeqlist(SeqList L, DataType x)
{
int i=0;
while ((i<L. length) && (L.data[i]!=x) ) //在順序表中查找值爲 x 的結點
i++;
if(i<L.length) return i+1; //若找到值爲x的元素,返回元素的序號
else return 0; //未查找到值爲x的元素,返回0
}
//順序表的求表長操做,直接輸出L.length便可

  1)設表的長度length=n,在插入算法中,元素的移動次數不只與順序表的長度
n有關, 還與插入的位置i有關。 插入算法在最壞狀況下,其時間複雜度爲O(n)
通常狀況下元素比較和移動的次數爲n-i+1次,插入算法的平均移動次數約爲n/2
其時間複雜度是O(n)
2)刪除算法DeleteSeqlist,可得其在最壞狀況下元素移動次數爲n-1,時間複雜
度爲O(n),元素平均移動次數約爲(n-1/2,時間複雜度爲O(n)
3)對於定位算法,須要掃描順序表中的元素。以參數x與表中結點值的比較爲
標準操做,平均時間複雜度爲O(n)。求表長和讀表元素算法的時間複雜度爲O(1)
就階數而言,己達到最低

順序表的優勢:

無需爲表示結點間的邏輯關係而增長額外存儲空間
能夠方便地隨機存取表中的任一結點

順序表的缺點:

插入和刪除運算不方便,必須移動大量的結點
順序表要求佔用連續的空間,存儲分配只能預先進
行,所以當表長變化較大時,難以肯定合適的存儲
規模

相關文章
相關標籤/搜索