1. 程式人生 > >線性表(二)——順序儲存結構

線性表(二)——順序儲存結構

線性表的順序儲存結構

構造原理

用一組地址連續的儲存單元依次儲存線性表的資料元素,資料元素之間的邏輯關係通過資料元素的儲存位置直接反映。
記做 ( 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)基本操作(如插入、刪除)的時間效率較低。