小甲魚數據結構03線性表的順序存儲結構

線性表的順序存儲結構

1,線性表的存儲結構:順序存儲結構和鏈式存儲結構。

 

2,順序存儲結構:用一段地址連續的存儲單元依次存儲線性表的數據元素,和數組

 

一樣的。

 

3,線性表順序存儲的結構代碼:

   #define MAXSIZE 20

   typedef int ElemType

   typedef struct{

ElemType data[MAXSIZE];

        int length;//線性表的當前長度

   }SqList;

 

4,順序存儲結構封裝的三個屬性:

       -存儲空間的起始位置,即數組data的存儲位置。

       -線性表的最大存儲容量:數組的長度Maxsize

       -線性表的當前長度:length

 

5,注意:數組的長度和線性表的當前長度需要區分一下:數組的長度是存放線性表

 

的存儲空間的總長度,一般初始化後不變,但線性表的當前長度是線性表中元素的

 

個數,會變化。

 

6,線性表的計數是從1開始的,不是0.

 

7,存儲位置的計算:(假設ElemType佔用c個存儲單元(字節))

           LOC表示獲得存儲位置的函數。

           則:  LOC(ai+1)=LOC(ai)+c

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

 

 

8獲取第i個元素代碼:

 

 

 

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

 

 

#define MAXSIZE 20

typedef int ElemType

typedef strut{

ElemType data[MAXSIZE];

int length;//線性表當前長度

}SqList;

 

//初識條件:順序線性表L已存在 ,1<=i<=ListLength(L)

//操作結果:e返回 L中第 i個數據元素的值

Status GetElem(SqList L,int i,ElemType *e){

if(L.length==0||i<1||L.length){

return ERROR;

}

*e=L.data[i-1];   //線性表中第i個元素就是數組下標爲(i-1)的元素

return OK;

}

 

 

插入操作:

 

/* 初始條件:順序線性表 L已存在,1<=i<=ListLength(L) */

/* 操作結果: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){

//i不在範圍內時

return ERROR;

}

if(i<=L->length){

//若插入數據位置不在表尾

/*

將要插入位置後數據元素向後移動一位

*/

for(k=L->length-1;k>=i-1;k--){

L->data[k+1]=L->data[k];

}

}

L->data[i-1]=e;//將新的元素插入

L->length++;

return OK:

}

 

 

刪除操作:

 

/*

初始條件:順序線性表 L已存在, 1<=i<=ListLength(L)

操作結果 :刪除 L的第 i個數據元素, 並用 e返回其值 ,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;k++){

L->data[k-1]=L->data[k];

}

}

L->length--;//當前長度-1

return OK;

}

 

 

 

線性表順序存儲結構的優缺點

 

9,在讀數據時,時間複雜度爲O(1),在插入和刪除時,時間複雜度都爲O(n)

   適合元素個數比較穩定,更多是存取數據操作的應用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章