線性表的順序存儲結構


1 線性表的順序存儲結構,是指用一段地址連續的存儲單元依次存儲線性表的數據元素。既然線性表的每個數據元素類型都相同,所以可以用一維數組來實現順序存儲結構,即把第一個元素存儲在下標為0的位置上,接着把線性表相鄰的元素存儲在數組中相鄰的位置。
2 線性表順序存儲的結構代碼

#define MAXSIZE 20        //存儲空間初始分配量
typedef int ElemType;     //ElemType表示類型,這里假設為int
typedef struct {
    ElemType data[MAXSIZE];    //數組存儲數據元素,最大值為MAXSIZE
    int length;                //線性表當前長度
} SqList;

說明:描述順序存儲結構需要三個屬性
(1)存儲空間的起始位置:數組data,它的存儲位置就是存儲空間的存儲位置。
(2)線性表的最大存儲容量:數組長度MAXSIZE
(3)線性表的當前長度:length

3 順序存儲結構的插入和刪除

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;

(1)用e返回數組L中第i個數據元素的值

Status getElem(SqList L, int i, ElemType *e) {
  if (L.length < 0 || i < 0 || i > L.length) {
      return ERROR;
  }  
  *e = L.data[i - 1];
  return OK;
}

時間復雜度為O(1).

(2)在線性表第i個位置插入元素e
/* 初始條件:順序線性表L已存在,i的取值范圍為1 <= i <= L->length + 1 */
/* 操作結果:在L中第i個位置之前插入e,L的長度加1 */

Status ListInsert(SqList *L, int i, ElemType e) {
  int k;
  if (L->length == MAXSIZE) {    //線性表已滿
      return ERROR;
  }
  if (i < 1 || i > L->length + 1) {    //插入的位置不在范圍內
      return ERROR;
  }
  if (i <= L-> length) {    //不是插入在隊尾
      for (k = L-> length - 1; k >= i; i --) {
          L->data[k + 1] = L->data[k];
      }
  }
  L->data[i - 1] = e;
  L->length ++;
  return OK;
}

 

(3) 刪除第i個位置的元素,並用e返回其值
/* 初始條件:順序線性表L已存在,i的取值范圍為1 <= i <= L->length */
/* 操作結果:刪除L中第i個數據元素,L的長度減1 */

Status ListDelete(SqList *L, int i, ElemType *e) {
  int
k;   if (L->length == 0) {    return ERROR;   }   if (i < 1 || i > L-> length) {    return ERROR;   }   *e = L->data[i - 1];   if (i < L->length) { //不是刪除隊尾元素    for (k = i; k <= L->length - 1; i++) {    L->data[k-1] = L->data[k];    }   }   L->length --;   return OK; }

(4)時間復雜度
如果插入到最后一個位置,或者刪除最后一個元素,時間復雜度為O(1)。最壞情況,即插入到第一個位置、或者刪除第一個元素,此時時間復雜度為O(n).平均時間為(n-1)/2.故時間復雜度為O(n).

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM