数据结构学习笔记(3)线性表-顺序映像

  1 顺序储存结构-物理结构
  2
  3     线性表顺序储存结构的定义为:
  4         #define LIST_INIT_SIZE  80 //线性表储存空间的初始分配量
  5         #define LISTINCREMENT   10 //线性表储存空间的分配增量
  6         typedef struct {
  7             ElemType *elem; //存储空间基地址
  8             int     length; //当前长度
  9             int     listsize; //以sizeof(ElemType)为单位的当前分配的存储容量
 10         } sqlist;
 11     //构造一个空的线性表
 12     status initlist_sq(sqlist &L){
 13         L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
 14         if(!L.elem) exit(OVERFLOW);
 15         L.length = 0;
 16         L.listsize = LIST_INIT_SIZE;
 17         return OK;
 18     }
 19     //查找一个和e满足判定关系的元素
 20     int locate_sq(sqlist L, ElemType e, status(*compare)(ElemType, ElemType)){
 21         int i = 1; //i的初始值为第一个元素的位序
 22         ElemType p = L.elem; //p的初值为第一个元素的储存位置
 23         while(i <= L.length && !(*compare(*p++, e))){
 24             ++i;
 25         }
 26         if(i <= L.length)
 27             return i;
 28         else
 29             return 0;
 30     }
 31     //插入元素
 32     status insert_sq(sqlist &L, int pos, ElemType e){
 33         if(pos < 1 || pos > L.length)
 34             return ERROR;
 35         if(L.length >= L.listsize){ //  当前空间不足,再分配
 36             newbase = (ElemType*)malloc(L.elem, (L.listsize + LISTINCREMENT)
 37                         *sizeof(ElemType));
 38             if(!newbase)
 39                 exit(OVERFLOW);
 40             L.elem = newbase;   //新基地址
 41             L.listsize += LISTINCREMENT;
 42         }
 43         q = &(L.elem[pos-1]); //q指示插入位置
 44         //将q(包含q)后面的元素向后移动一位
 45         for(p = &(L.elem[L.length-1]); p >=q; --p){
 46             *(p+1) = *p;
 47         }
 48         *q = e;
 49         ++L.length;
 50         return OK;
 51     }
 52     /*
 53      *移动元素次数:∑P(i)(n+1-i),如果P(i)都相等,则P=1/(n+1)
 54      *移动元素期望值:n/2
 55      */
 56
 57     //线性表的删除
 58     status delete_sq(sqlist &L, int pos, ElemType &e){
 59         if(pos < 1 || pos > L.length)
 60             return ERROR;
 61         p = &(L.elem[pos-1]);
 62         e = *p;
 63         q = L.elem + L.length - 1; //表尾元素的位置
 64         for(++p; p <= q; ++p){
 65             *(p-1) = *p;
 66         }
 67         --L.length;
 68         return OK;
 69     }
 70     /*
 71      *移动元素次数:∑P(i)(n-i) 从i+1到i+n,若P(i) = 1/n
 72      *移动元素期望值:(n-1)/2
 73      */
 74

你可能感兴趣的:(数据结构学习笔记(3)线性表-顺序映像)