1. 程式人生 > >線性表實現(順序儲存)

線性表實現(順序儲存)

線性表結構

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;

線性表操作

  1. 初始化 :

時間複雜度: 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; }
  1. 清空 :

時間複雜度: O(1)

void clear(SqListPtr L){
  if(L->length != 0) L->length = 0;
}
  1. 銷燬 :

時間複雜度: O(1)

void destroy(SqListPtr L){
  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}
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}
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;
}