線性表實現(順序儲存)
阿新 • • 發佈:2018-12-24
線性表結構
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LIST_INCREAMENT 10
//定義一個Bool型別
typedef int Bool;
#define TRUE 1
#define FASLE 0
// 操作線性表返回狀態
typedef enum{
success = 0,
fail,
range_error,
fatal
}Status;
typedef struct SqList
{
ElemType *ele;
int length;
int list_size;
}SqList, *Ptr;
typedef Ptr SqListPtr;
線性表操作
- 初始化 :
時間複雜度: O(1)
Status init(SqListPtr L){
Status s = success;
L -> list_size = LIST_INIT_SIZE;
L -> length = 0;
L -> ele = (ElemType *)malloc(sizeof(ElemType) * L->list_size);
if(L -> ele == NULL)
s = fatal;
return s;
}
- 清空 :
時間複雜度: O(1)
void clear(SqListPtr L){
if(L->length != 0) L->length = 0;
}
- 銷燬 :
時間複雜度: O(1)
void destroy(SqListPtr L){
free(L->ele);
L->ele = NULL;
L->length = 0;
L->list_size = 0;
}
- 查詢(按位置) :
時間複雜度: O(1)
Status retrieveByPos(SqListPtr L, int pos, ElemType *ele){
Status s = range_error;
if(L) {
if((pos - 1) >= 0 && (pos - 1) < L -> length ) {
*ele = L -> ele[pos-1];
s = success;
}
} else{
s = fatal;
}
return s;
}
- 查詢(按值) :
時間複雜度: O(n)
Status locateByValue(SqListPtr L, ElemType value ,int *pos){
Status s = range_error;
if(L){
for(int i = 0; i < L -> length; i++) {
if(L -> ele[i] == value) {
*pos = i+1;
s = success;
break;
}
}
}else{
s = fatal;
}
return s;
}
- 插入 :
- 時間複雜度: O(n).
- 最好的情況:插入最後一個位置,不需要後移; 最壞的情況: 插入第一個,後移n個元素.
- 平均情況:
Status insertByPos(SqListPtr L, int pos, ElemType ele){
Status s = range_error;
if(L && L->length < L->list_size){
if((pos-1)>=0 && (pos-1)<=L->length){
for(int i = L->length - 1; i >= pos - 1;i--) {
L -> ele[i+1] = L -> ele[i];
}
L -> ele[pos-1] = ele;
L -> length ++;
s = success;
}
} else{
s = fatal;
}
return s;
}
- 刪除 :
- 時間複雜度: O(n)
- 最好的情況: 刪除最後一步, 不需要前移; 最壞的情況: 刪除第一個,前移n-1
- 平均情況:
Status deleteyPos(SqListPtr L, int pos){
Status s= range_error;
if(L && L->length > 0) {
if((pos-1) >= 0 && (pos-1) < L-> length) {
for(int i = pos;i<L->length;i++){
L->ele[i-1] = L->ele[i];
}
L->length--;
s= success;
}
}else{
s = fatal;
}
return s;
}
- 判斷是否為空 :
時間複雜度: O(1)
Bool isEmpty(SqListPtr L){
if(L->length == 0) return TRUE;
return FASLE;
}
- 獲取線性表大小 :
時間複雜度: O(1)
int getLength(SqListPtr L){
return L->length;
}