线性表顺序表示及合并算法

#define LIST_INIT_SIZE   100//线性表存储空间的初始分配量
#define LISTINCREMENT  10//线性表存储空间的分配增量
typedef struct{
    ElemType *elem;//存储空间基址
    int length;    //当前长度
    int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;

Status InitList_Sq(SqList &L){
   //构造一个线性表L
    L.elem = (ElemType *) malloc (sizeof (ElemType) *  LIST_INIT_SIZE );
    if(! L.elem) exit(OVERFLOW);//存储分配失败
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;    //容量
    return OK;
}
//插入算法
//一般情况下,在第i(1<= i <=n)个元素之前插入一个元素时,需将第n至第i个(共 n-i+1)元素向后移动一个位置
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 + 1) return ERROR;
    if(L.length >= L.listsize){
        newbase = (ElemType *) realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof(ElemType));
        if(! newbase) exit(OVERFLOW);
        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(1<= i <= n)个元素时需要将从第 i+1 至第n(共 n-i)个元素一次向前移动一个位置
Sataus ListDelete_Sq(SqList & L,int i , ElemType &e){
        //在顺序线性表L中删除第i个元素,并用e返回其值
        //i的合法值为 1<= i <=ListLength_Sq(L)
         if(i<1 || i>L.length + 1) return ERROR;
        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;
}

//两个有序线性表的合并
//算法时间复杂度 O(ListLength(LA)+ListLength(LB))
void MergeList(List La,List Lb, List &Lc){
//La和Lb中数据元素按值非递减排列,归并后的数据元素也按非递减排列
InitList(Lc);
i=j=1;k=0;
La_len = Listlength(La); Lb_len = Listlength(Lb);
while(( i <= La_len) && (j <= Lb_len)){
        GetElem(La,i,ai); GetElem(Lb, j, bj);
        if(ai <= bj){ ListInsert(Lc, ++k, ai); ++i;}
        else {ListInsert(Lc, ++k, bj); ++j;}
    }
while(i <= La_len){
    GetElem(La, i++, ai); ListInsert(Lc, ++k, ai);
    }
while(j <= Lb_len){
    GetElem(Lb,j++,bj);  ListInsert(Lc, ++k, bj);
    }
}
//合并算法,指针表示
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc){
    pa = La.elem;    pb=Lb.elem;
    Lc.listsize = Lc.length = La.Length + Lb.length;            //初始化Lc
    pc = Lc.elem = (ElemType *) malloc (sizeof(ElemType) * Lc.listsize);
    if(! Lc.elem) exit(OVERFLOW);
    pa_last = pa + La.length - 1;
    pb_last = pb + Lb.length - 1;
    while(pa <= pa_last && pb <= pb_last){
        if(*pa <= *pb)  *(pc++) = *(pa++);
        else    *(pc++) = *(pb++);
    }
    while(*pa <= pa_last)
    *(pc++) = *(pa++);
    while(*pb <= pb_lasst)
    *(pc++) = *(pb++);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值