2.2線性表的順序表示和實現(2)待修改

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章