2.2线性表的顺序表示和实现(2)待修改

来源:互联网 发布:电脑打字软件有哪些 编辑:程序博客网 时间:2024/06/15 05:01
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中的位序,否则返回0i=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
原创粉丝点击