线性表实现(顺序存储)

线性表结构

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;

线性表操作

  1. 初始化 :

时间复杂度: 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;
}
  1. 清空 :

时间复杂度: O(1)

void clear(SqListPtr L){
  if(L){
    L->length = 0;
  }
}
  1. 销毁 :

时间复杂度: O(1)

void destroy(SqListPtr L){
  if(L){
    if(L->ele){
      free(L->ele);
      L->ele = NULL;
      L->length = 0;
      L->list_size = 0;
    }
  }
  1. 查询(按位置) :

时间复杂度: 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;
}
  1. 查询(按值) :

时间复杂度: 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;
}
  1. 插入 :
  • 时间复杂度: 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=1n+1pi(ni+1)=n+11i=1n+1(ni+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;
}
  1. 删除 :
  • 时间复杂度: 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=0npi(ni)=n1i=0n(ni)=2n1
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;
}
  1. 判断是否为空 :

时间复杂度: O(1)

Bool isEmpty(SqListPtr L){
  if(L->length == 0) return TRUE;
  return FASLE;
}
  1. 获取线性表大小 :

时间复杂度: O(1)

int getLength(SqListPtr L){
  return L->length;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值