作业1有序顺序表插入方法2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}