线性表结构
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, *SqListPtr;
线性表操作
- 初始化 :
时间复杂度: O(1)
Status init(SqListPtr L){
Status s = success;
if(L) {
L -> ele = (ElemType *)malloc(sizeof(ElemType) * L->list_size);
if(L -> ele){
L -> list_size = LIST_INIT_SIZE;
L -> length = 0;
}else{
s = fatal;
}
}
return s;
}
- 清空 :
时间复杂度: O(1)
void clear(SqListPtr L){
if(L){
L->length = 0;
}
}
- 销毁 :
时间复杂度: O(1)
void destroy(SqListPtr L){
if(L){
if(L->ele){
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个元素.
- 平均情况:
∑ i = 1 n + 1 p i ( n − i + 1 ) = 1 n + 1 ∑ i = 1 n + 1 ( n − i + 1 ) = n 2 \sum_{i=1}^{n+1} p_{i}(n-i+1) = \frac{1}{n+1} \sum_{i=1}^{n+1}(n-i+1)=\frac{n}{2} i=1∑n+1pi(n−i+1)=n+11i=1∑n+1(n−i+1)=2n
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
- 平均情况:
∑ i = 0 n p i ( n − i ) = 1 n ∑ i = 0 n ( n − i ) = n − 1 2 \sum_{i=0}^{n} p_{i}(n-i) = \frac{1}{n} \sum_{i=0}^{n}(n-i)=\frac{n-1}{2} i=0∑npi(n−i)=n1i=0∑n(n−i)=2n−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;
}