線性表(二)——順序儲存結構
線性表的順序儲存結構
構造原理
用一組地址連續的儲存單元依次儲存線性表的資料元素,資料元素之間的邏輯關係通過資料元素的儲存位置直接反映。
記做 ( a1,a2,a3,… … , an )
所謂一個元素的地址是指該元素佔用的若干(連續的)儲存單元的第一個單元的地址。記做LOC(ai)
若假設每個資料元素佔用k個儲存單元,並且已知第一個元素的儲存位置LOC(a1),則有LOC(ai) = LOC(a1)+(i−1)×k
在C語言中,順序儲存結構的定義如下:
#define MaxSize 100
ElemType A[MaxSize];
int n;
其中,MaxSize表示預先分配給線性表的空間大小,n表示表的長度。
基本操作
1、確定元素item在長度為n的線性表A中的位置
int LOCATE( ElemType A[], int n, ElemType item ){
inti;
for(i=0;i<n;i++)
if (A[i]==item)
return i+1; /* 查詢成功,返回在表中位置*/
return -1; /*查詢失敗,返回資訊-1 */
}
時間複雜度O(n)
2、在長度為n的線性表A的第i個位置上插入一個新的資料元素item
正常情況下需要做的工作:
(1)將第i個元素至第n個元素依次後移一個位置;
(2)將被插入元素插入表的第i個位置;
(3)修改表的長度(表長增1);
異常情況:
(1)是否表滿?n=MaxSize;
(2)插入位置是否合適?正常位置:1≤i≤n+1)
int INSERTLIST(ElemType A[], int &n, int i, ElemType item ){ int j; if (n == MaxSize || i<1 || i>n+1) //判斷空間滿否、插入位置合適否 return -1; //插入失敗 for( j=n-1; j>=i-1; j--) A[j+1]=A[j]; /* 元素依次後移一個位置*/ A[i-1]=item; /*將item插入表的第i個位置*/ n++; //線性表長度加1 return 1; /* 插入成功*/ }
該演算法的時間複雜度是O(n)
3、刪除長度為n的線性表A的第i個數據元素
正常情況下需要做的工作:
(1)將第i+1個元素至第n個元素依次前移一個位置;
(2)修改表的長度(表長減1)。
需要考慮的異常情況:
(1)是否表空?(n=0?)
(2)刪除位置是否合適?(正常位置:1≤i≤n)
int DELETELIST( ElemType A[], int &n, int i ){
int j;
if( i<1 || i>n ) //判斷表空和位置是否合適
retutn -1;
for( j=i; j<n; j++ )
A[j−1]=A[j]; /* 元素依次前移一個位置*/
n--; //線性表長度減1
return 1; /* 刪除成功*/
}
該演算法的時間複雜度為O(n)
線性表的順序儲存結構的特點
1、優點
(1)構造原理簡單、直觀,易理解。
(2)元素的儲存地址可以通過一個簡單的解析式計算出來(LOC(ai)=LOC(a1)+(i−1)×k)。是一種隨機儲存結構,儲存速度快。
(3)由於只需存放資料元素本身的資訊,而無其他空間開銷,相對鏈式儲存結構而言,儲存空間開銷小(僅此而已!)
2、缺點
(1)儲存分配需要事先進行。
(2)需要一片地址連續的儲存空間。
(3)基本操作(如插入、刪除)的時間效率較低。