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).