Status ListInsert_Sq(SqList &L,int i,ElemType e)
{
//在顺序线性表L中第i个位置之前插入新的元素e
//i的合法值为1<=i<=ListLength_Sq(L)+1
if(i<1||i>L.length)return ERROR;//i 值不合法
if(L.length >= L.listsize)
{
newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);//存储分配失败
L.elem = newbase;
L.listsize + = LISTINCREMENT;//增加存储容量
}
q=&(L.elem[i-1]); //q为插入位置
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p; //插入位置及之后的元素移动
*q = e;//插入e
++L.length //表长增1
return OK;
}//
/*
表示从链表的第i个元素开始一直到最后一个元素往后移一位
p=&L.elem[L.length-1]意思是p赋初值为链表的最后一个元素地址,
p>=q表示循环知道p<q的时候结束,--p是使p指针的指向往前移一位
*/
删除第i个元素时,需要从第i+1至第n(共n-i)个元素依次向前移动一个位置
Status ListDelete_Sq(SqList &L,int i,ElemType &e)
{
//在顺序线性表L中删除第i个元素,并用e返回其值
//i的合法值为1<=i<=ListLength.Sq(L)
if(i<1||(i>L.length)) return ERROR; //i值不合法
p = &(L.elem[i-1]); //p为被删除元素的位置
e = *p; //被删除的元素的值赋给e
q = L.elem+L.length-1; //表尾元素的位置
for (++p;p<=q ;++p)
{
*(p-1)=*p;
}
--L.length;
return OK;
}//ListDelete_Sq
整个代码片中卡在两个for循环的操作上。
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p; //插入位置及之后的元素移动
for (++p;p<=q ;++p)
{
*(p-1)=*p;
}
int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
//在顺序表中线L中查找第一个值与e满足compore()元素的位置顺序
{
//若找到,则返回其在L中的位序,否则返回0
i=1;//i的初值为第一个元素的位序
p=L.elem;//初值为第一个元素的存储位置
while(i<=L.length&&!(*compare)(*p++,e))++i;
if(i<=L.length) return i;
else return 0;
}//LocateElem_Sq
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc)
//已经顺序线性表La和Lb的元素按值非递减排列
{
pa = La.elem;pb = Lb.elem;
Lc.listsize = Lc.length = La.length+Lb.length;
pc = Lc.elem = (ElemType*)malloc(Lc.listsize*sizeof(ElemType));
if(!Lc.elem)exit(OVERFLOW)
pa_last = La.elem+La.length-1;
pb_last = Lb.elem+Lb.length-1;
while(pa<=pa_last&&pb<=pb_last)
{
if(*pa<=*pb) *pc++=*pa++;
else *pc++ = *pb++
}
while(pa<=pa_last)*pc++=*pa++; //插入La剩余的元素
while(pb<=pb_last)*pc++=*pb++; //插入Lb剩余的元素
}//MergeList