線性表的順序存儲結構
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)
適合元素個數比較穩定,更多是存取數據操作的應用。