作业1有序顺序表插入方法2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

有序顺序表插入方法2:三个函数组成,第一个是定位插入位置,第二个为在指定位置插入,第三个为有序表的插入:

int LocateElem_SortedSq(SqList L, ElemType e,Status (*cmp)(ElemType,ElemType)){ //在顺序表L中查找第一个满足cmp(e,x)的元素x的位序,找不到则返回,当cmp为SmallEqual时用于定位第一个满足SmallEqual(e,x)的元素x,即定位第一个“大于等于”e的x;

//当cmp为BigEqual时定位第一个满足BigEqual(e,x)的元素x,即第一个“小于等于”e的元素x; cmp 为Equal时定位第一个等于e的元素x。务必注意对应关系

ElemType *p=L.elem;//p指向第一个元素

int i=1; //i始终为p所指向元素的位序

while(i<=L.length&&!(*cmp)(e,*p++))++i;

if(i>L.length)return 0;

return i;

}//LocateElem_Sq

Status ListInsert_Sq(SqList &L,int i, ElemType e){

//在顺序表L的第i个位置前插入元素e,i的合法值为..L.length+1

if(i<1||i>L.length+1) return ERROR; //插入位置不合法

if(L.length>=L.listsize){ //表满,增加存储容量

ElemType *newbase=(ElemType

*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));

if(!newbase) exit(OVERFLOW);

L.elem=newbase; L.listsize+=LISTINCREMENT;

}

ElemType *q=&L.elem[i-1],*p=&L.elem[L.length-1];

while(p>=q){*(p+1)=*p;--p;} //插入位置后的元素右移

*q=e;

++L.length; //表长加

return OK;

}//ListInsert_Sq

Status ListInsert_SortedSq(SortedSqList &L,ElemType e,Status (*cmp)(ElemType,ElemType)){ //在有序顺序表L中插入元素e,使得L中各元素仍然按cmp序排列,当cmp为SmallEqual时为升序,即将e插入到第第一个大于或等于e的元素之前,当cmp为BigEqual时为降序,将e插入到第一个小于等于e的元素前int i=LocateElem_SortedSq(L,e,(*cmp)); //定位e的插入位置,应插入到第i个元素前

if(i)ListInsert_Sq(L,i,e); //若找到合适的i则在线性表L的第i个位置前插入元素e

else ListInsert_Sq(L,L.length+1,e); //若未找到合适的i则在表尾插入元素e

return OK;

}

相关文档
最新文档